From 7db92e0d37fda1de77ad1eb74c4cdbf6ea315453 Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Sat, 31 Oct 2026 02:52:17 -0400 Subject: [PATCH 001/230] Check pt --- docs/prd/README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/prd/README.md b/docs/prd/README.md index 776ec54d7..1d9a789f6 100644 --- a/docs/prd/README.md +++ b/docs/prd/README.md @@ -10,6 +10,12 @@ or hardware acceptance may still remain where the individual PRD says so. ## Active PRDs +### Engineering foundation + +| PRD | Topic | Status | +| --- | --- | --- | +| [Engineering 01 — Security, Quality, and Typed Frontend Foundation](ENG_01_Safety_Contracts_TypeScript.md) | Findings remediation and CI enforcement, Preact TS/TSX, executable API contracts, operational regression coverage, embedded budgets, and targeted C refactoring | Draft (2026-10-31), based on main after PR #691; phased preparation that benefits the current product independently of any future Rust work | + ### UX / Design | PRD | Topic | Driving issues | From ff6a7d60d4974be8c018e65780d43bd3300e1c37 Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Sat, 31 Oct 2026 03:01:05 -0400 Subject: [PATCH 002/230] T1: Inventory current security and quality findings Add quality/findings.json (384 itemized findings, 359 count buckets, coverage gaps), quality/scanners.json (expected scanner-run manifest with access status, report conventions and fingerprint schemes for T6), and quality/evidence/T1.md (provenance and count reconciliation). Co-Authored-By: Claude Opus 5.5 --- quality/evidence/T1.md | 156 ++++++++ quality/findings.json | 868 +++++++++++++++++++++++++++++++++++++++++ quality/scanners.json | 482 +++++++++++++++++++++++ 3 files changed, 1506 insertions(+) create mode 100644 quality/evidence/T1.md create mode 100644 quality/findings.json create mode 100644 quality/scanners.json diff --git a/quality/evidence/T1.md b/quality/evidence/T1.md new file mode 100644 index 000000000..a66c04e5e --- /dev/null +++ b/quality/evidence/T1.md @@ -0,0 +1,156 @@ +# T1 evidence: security and quality findings inventory + +- Date: 2026-10-31 +- Workspace HEAD: `7db92e0d` (branch `feat/engineering-foundation`). `main` = `8927bc8a`. + The only difference is `docs/prd/README.md`. +- Deliverables: `quality/findings.json`, `quality/scanners.json`, this file. +- Raw reports (gitignored): `build/eng-artifacts/T1/{github,actions,npm}/`. The generator + scripts that turn them into the JSON are in `build/eng-artifacts/T1/generator/`. To + regenerate, run `python3 -I build/eng-artifacts/T1/generator/t1_build_inventory.py "$PWD"` and + `python3 -I build/eng-artifacts/T1/generator/t1_scanners.py "$PWD"`. +- Production code: read-only. Nothing else was edited. + +## reason_not_testable + +This is an inventory task. Its output is data collected from external scanners and the +GitHub APIs, so no product behavior exists to test first. Verification uses a static check +(both JSON files parse with `python3 -m json.tool`) and an independent count reconciliation +against the raw reports (below). + +## Revisions and scan provenance + +| Source | Revision | Run / analysis | Tool version | +|---|---|---|---| +| CodeQL c-cpp (code scanning) | `8927bc8a` | analysis 2067529268 (cross-checked against 2067474950 @`1b8d4332`) | CodeQL 2.27.3, security-extended | +| GitHub Code Quality | `8927bc8a` | run 41178210527 | GitHub managed | +| clang-tidy | `1b8d4332` | Static Analysis run 41176542849, artifact 13033827361 | Debian LLVM 21.1.8 | +| cppcheck | `1b8d4332` | run 41176542849, artifact 13033507116 | cppcheck 2.13.0 | +| eslint / jsx-a11y | `1b8d4332` | run 41176542849, job 124465163606 (log only) | web lockfile versions | +| Trivy | `1b8d4332` | Container Security Scan run 41176542798, analysis 2067494754 | Trivy 0.76.1 (DB version not recorded) | +| Dependabot | default branch, 2026-10-31 | REST alerts | n/a | +| npm audit | workspace lockfiles | `npm audit --package-lock-only` | npm 11.19.1, node 24.22.1 | +| Secret scanning | n/a | REST returned **HTTP 404**, "Secret scanning is disabled on this repository." | n/a | +| Repo security advisories | n/a | REST 200 (admin) | n/a | + +The Static Analysis and Container Scan runs for `8927bc8a` were still in progress when +the inventory was taken, so the `1b8d4332` runs are used. `8927bc8a` (commit `2e55345b`) +adds a 7-line SPDX header to the first-party C files, so line numbers recorded at +`1b8d4332` are 7 lower than at HEAD. The two CodeQL analyses are 7 lines apart in exactly +this way, with identical (rule, path, lineHash) sets. That confirms fingerprints must not +include line numbers. `quality/scanners.json#fingerprint_schemes` follows this rule. + +## Reconciliation (raw report count compared with the inventory) + +| Scanner | Raw report | Inventory | Match | +|---|---|---|---| +| CodeQL open alerts | 34 (API `state=open`) | 34 `state_upstream=open` | yes | +| CodeQL dismissed alerts | 11 (API `state=dismissed`) | 11 | yes | +| CodeQL SARIF results @8927bc8a | 35 | 35 fingerprints present (34 open + dismissed #59) | yes | +| CodeQL fixed alerts (history) | 300 | not inventoried (closed) | n/a | +| GitHub Code Quality | 1 open | 1 | yes | +| clang-tidy diagnostics | 296 (`path:line:col: warning: ... [check]`, 0 errors) | 296 itemized | yes | +| cppcheck XML `` | 605 (error 17, warning 13, portability 2, style 547, information 26) | 32 itemized + 573 in 143 buckets | yes (32+573=605) | +| eslint warnings | 897 ("897 problems (0 errors, 897 warnings)") | 897 in 216 (rule,file) buckets over 77 files | yes | +| Trivy results @1b8d4332 | 0 (SARIF parsed, tool 0.76.1, image `lightnvr:scan`) | 0 (valid empty result) | yes | +| Dependabot | 88 total: 1 open, 87 fixed | 1 | yes | +| npm audit root | 0 (all and prod) | 0 (valid empty result) | yes | +| npm audit web | 26 affected packages from 3 root advisories; prod (`--omit=dev`) 0 | 3 (package, advisory) root causes | yes | +| Repo security advisories | 6 (published 3, draft 2, closed 1) | 6 (3 with sanitized IDs) | yes | + +Totals: 384 itemized findings, 359 buckets, and 743 unique fingerprints with no duplicates (the generator asserts this). +Itemized findings by category: application 281, optional-feature 60, third-party 39, +build-only 4, container 0. + +eslint rule breakdown: control-has-associated-label 355, label-has-for 337, +mouse-events-have-key-events 70, no-static-element-interactions 43, +click-events-have-key-events 39, no-noninteractive-element-interactions 17, +label-has-associated-control 16, no-autofocus 10, media-has-caption 6, +no-noninteractive-tabindex 2, interactive-supports-focus 1, anchor-is-valid 1. These sum to 897. + +clang-tidy check breakdown (top): implicit-widening-of-multiplication-result 72, +multi-level-implicit-pointer-conversion 59, clang-analyzer-core.NullDereference 28, +clang-analyzer-security.ArrayBound 22, narrowing-conversions 21, suspicious-string-compare 16, +assignment-in-if-condition 15, cert-err34-c 12. Total 296. 8 of them are in the system header +`/usr/include/cjson/cJSON.h` and 4 in `third_party/faac/include/faac.h`. + +## Notable actionable findings (sanitized; for T7) + +CodeQL open alerts (34, all `needs-triage`, none reviewed): +- `cpp/sql-injection` (error), 2 in `src/database/sqlite_migrate.c`. +- `cpp/uncontrolled-allocation-size` (error), 2 in `src/core/event_router.c`. +- `cpp/path-injection`, 5 in telemetry collectors (`linux_cgroup.c`, `linux_network.c`) and `storage_s3.c` (S3 is an optional feature). +- `cpp/toctou-race-condition`, 5 in `db_core.c`, `storage_migration.c`, and `api_handlers_operator_floor_plans.c` (x3). +- `cpp/cleartext-storage-database` 5 / `cleartext-storage-file` 3 / `cleartext-transmission` 2, in the + storage paths for stream/event-destination/config credentials and in camera URL handling. +- `cpp/non-https-url`, 7 in `onvif_detection.c`. A similar alert was already dismissed as a false positive in `onvif_discovery.c`. +- `cpp/world-writable-file-creation`, 1 in `mqtt_client.c` (MQTT is an optional feature). `cpp/integer-multiplication-cast-to-long`, 1. +- `cpp/suspicious-pointer-scaling`, 1 in `third_party/faac` (classified as a library). This is a third-party, upstream issue. + +cppcheck errors and warnings in first-party code: `arrayIndexOutOfBounds` in `src/video/stream_protocol.c`, +`integerOverflow` in `src/core/config.c`, and 2 `preprocessorErrorDirective` entries that are probably tool limitations. +The 13 `memleak` errors are in the third-party SOD library (`src/sod`, `include/sod`), which is only built with `ENABLE_SOD`. + +clang-tidy: 70 clang-analyzer diagnostics are `needs-triage` (NullDereference 28, ArrayBound 22, +insecureAPI.strcpy 6, among others). The other 226 are low-severity `baseline-debt`. + +Dependencies (all build-only. Production `npm audit --omit=dev` is clean for both lockfiles): +- GHSA-gcqx-w48m-w2h4 (deepmerge, low). Pulled in through jest-config. No patched version yet. Also Dependabot #101. +- GHSA-3g3m-2fjr-6pw4 (glob, moderate) and GHSA-g3hv-75wg-m249 (minimatch, moderate). Both were published + 2026-10-30 and Dependabot had not raised them yet. The fixes are semver-major (eslint, jest, @sentry/vite-plugin, jsx-a11y). + T7 must keep the fixes inside the Node 24 range and current major versions, or record an exception. + +Container: Trivy reports 0 at `1b8d4332`. This covers only the amd64 image with CRITICAL/HIGH/MEDIUM severities. Seven go2rtc Go-module +CVEs (golang.org/x/crypto, x/net) found through `b38e91c3` were fixed on 2026-10-29. + +Repository advisories: 3 published advisories (GHSA-cv53-mq7p-6jp2, GHSA-rqj3-pch5-rq4f, +GHSA-pvw7-7j8c-qx96) affect releases at or below 0.44.1. They are recorded as `fixed-upstream-verify-regression`. +2 private **draft** advisories (high) are recorded only as `repo-advisory-draft-1/2`, and 1 closed advisory as +`repo-advisory-closed-1`. No details are given. Maintainers must confirm the drafts' fix status. They are the +highest-priority unknowns. + +## Coverage gaps (`findings.json#coverage_gaps`) + +1. **Secret scanning is disabled** (HTTP 404), and push protection is off. No secret scan baseline + exists. This is "not scanned", not "clean". +2. CodeQL does not run on `pull_request`, although SECURITY.md says it does. There is no JS/TS, Actions, or Python CodeQL + (default-setup is `not-configured`). +3. Every scanner is report-only (exit codes are forced to 0, and a11y rules only warn). `main` branch protection + has no required status checks. +4. CodeQL and clang-tidy are built with `ENABLE_GO2RTC=OFF ENABLE_SOD=OFF`. As a result, 9 dismissed `go2rtc_api.c` + alerts plus 1 `api_handlers_ptz.c` alert are no longer observed. They are not verified as resolved. LiteRT, Sentry, and SSL are not analyzed. +5. Trivy covers only amd64 and the main Dockerfile. The published arm64 and arm/v7 images, Dockerfile.alpine, and the sentry image are not scanned. +6. ESLint output exists only in the job log, with no artifact. Issue #647 (WCAG audit) is closed, but 897 warnings remain. +7. There is no `dependabot.yml`. Actions, go2rtc Go modules, and Docker bases have no SCA except Trivy. +8. There is no CODEOWNERS file. Owners are recorded as `maintainers/` placeholders. + +## Dispositions and expiry + +- `needs-triage`: unreviewed items. No exception is granted, and `exception_expiry` is null. +- `baseline-debt`: low-severity clang-tidy/cppcheck-style/eslint debt. The proposed expiry is + **2027-04-30** (`exception_expiry_status: proposed-by-T1`). Maintainers must confirm it in T6/T7. +- `exception-dismissed-false-positive`: the 11 CodeQL alerts dismissed upstream. No expiry is recorded upstream, so T1 + proposes 2027-04-30. +- The exposure for each item is a **path heuristic** (`exposure_basis`). It is not a verified reachability analysis. + +## Public-file safety + +The public files contain no code snippets, scanner message text for CodeQL/clang-tidy findings, secret +values, private advisory IDs, or private advisory text. A grep for credential patterns +(`ghp_`, `AKIA`, private-key headers, `password=`, `secret=`) in both JSON files found 0 hits. +Draft and closed advisory fingerprints are `sha256(GHSA)[:16]`. + +## Validation commands and results + +``` +python3 -m json.tool quality/findings.json # OK +python3 -m json.tool quality/scanners.json # OK +``` +I also ran an independent reconciliation script against the raw reports, with the results in the table above. All counts matched. + +## Notes for downstream + +- T6: decide pass/fail from the report contents, not from exit codes. `npm audit` exits 1 when it finds vulnerabilities, + and the C scanners are forced to exit 0. Treat a missing, expired, or not-configured scanner as a failure. Workflow artifacts + expire after 30 days (the current ones expire on 2026-11-30). +- T14: add `codeql-javascript-typescript`, upload eslint JSON and npm audit reports, scan all published platforms, and + enable secret scanning (or a CI secret scanner). diff --git a/quality/findings.json b/quality/findings.json new file mode 100644 index 000000000..7b17d5528 --- /dev/null +++ b/quality/findings.json @@ -0,0 +1,868 @@ +{ + "schema_version": 1, + "producer": "T1", + "generated_at": "2026-10-31", + "repository": "opensensor/lightNVR", + "revisions": { + "workspace_head": "7db92e0d37fd", + "codeql_and_alerts": "8927bc8a (main; source-identical to workspace HEAD except docs/prd/README.md)", + "static_analysis_and_trivy": "1b8d4332 (main; pre-SPDX-header commit, C line numbers +7 vs HEAD for files touched by 2e55345b)" + }, + "public_file_policy": "No secret values, private advisory text, or private advisory IDs. Private repository advisories use sanitized IDs; raw reports stay in gitignored build/eng-artifacts/T1/.", + "categories": { + "application": "default-build first-party code (C backend, tools, web UI) and project advisories", + "optional-feature": "first-party code compiled only behind a CMake feature option (feature_flag names it)", + "build-only": "development/lint/test/build dependencies not shipped in the production bundle or image", + "third-party": "vendored/submodule/system-header code (third_party/, src/sod, src/ezxml, /usr)", + "container": "OS/language packages inside the published container image" + }, + "dispositions": { + "needs-triage": "open, unreviewed; no exception granted (exception_expiry null). T7 maps to remediation or a reviewed exception.", + "baseline-debt": "low-severity quality debt accepted as current baseline pending T7/T6 policy; proposed expiry must be confirmed by maintainers", + "exception-dismissed-false-positive": "dismissed upstream; T1 proposes an expiry because none is recorded", + "fixed-upstream-verify-regression": "published advisory affecting earlier releases; needs regression evidence only", + "private-triage-pending": "private advisory; details withheld", + "closed-upstream": "private advisory closed upstream", + "informational": "tool diagnostics about analysis coverage, not code findings" + }, + "fingerprint_schemes": "see quality/scanners.json#fingerprint_schemes", + "findings": [ + {"id":"CODEQL-337","fingerprint":"codeql:cpp/non-https-url:src/video/onvif_detection.c:2d6ec8d9ecce5414:1","fingerprint_basis":"rule+path+SARIF primaryLocationLineHash","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":337,"analysis_id":2067529268,"instance_commit":"8927bc8afbad"},"rule_id":"cpp/non-https-url","category":"application","feature_flag":null,"severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/onvif_detection.c","line":702,"revision":"8927bc8afbad"},"owner":"maintainers/video","state_upstream":"open","first_seen":"2026-10-29","disposition":"needs-triage","exception_expiry":null,"evidence":"open alert #337; present in CodeQL analysis 2067529268 @8927bc8a"}, + {"id":"CODEQL-336","fingerprint":"codeql:cpp/non-https-url:src/video/onvif_detection.c:57c43ec28ee12785:1","fingerprint_basis":"rule+path+SARIF primaryLocationLineHash","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":336,"analysis_id":2067529268,"instance_commit":"8927bc8afbad"},"rule_id":"cpp/non-https-url","category":"application","feature_flag":null,"severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/onvif_detection.c","line":723,"revision":"8927bc8afbad"},"owner":"maintainers/video","state_upstream":"open","first_seen":"2026-10-29","disposition":"needs-triage","exception_expiry":null,"evidence":"open alert #336; present in CodeQL analysis 2067529268 @8927bc8a"}, + {"id":"CODEQL-335","fingerprint":"codeql:cpp/non-https-url:src/video/onvif_detection.c:978550b1b964438a:1","fingerprint_basis":"rule+path+SARIF primaryLocationLineHash","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":335,"analysis_id":2067529268,"instance_commit":"8927bc8afbad"},"rule_id":"cpp/non-https-url","category":"application","feature_flag":null,"severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/onvif_detection.c","line":1493,"revision":"8927bc8afbad"},"owner":"maintainers/video","state_upstream":"open","first_seen":"2026-10-29","disposition":"needs-triage","exception_expiry":null,"evidence":"open alert #335; present in CodeQL analysis 2067529268 @8927bc8a"}, + {"id":"CODEQL-334","fingerprint":"codeql:cpp/non-https-url:src/video/onvif_detection.c:92ace6b8b6fbfcac:1","fingerprint_basis":"rule+path+SARIF primaryLocationLineHash","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":334,"analysis_id":2067529268,"instance_commit":"8927bc8afbad"},"rule_id":"cpp/non-https-url","category":"application","feature_flag":null,"severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/onvif_detection.c","line":1480,"revision":"8927bc8afbad"},"owner":"maintainers/video","state_upstream":"open","first_seen":"2026-10-29","disposition":"needs-triage","exception_expiry":null,"evidence":"open alert #334; present in CodeQL analysis 2067529268 @8927bc8a"}, + {"id":"CODEQL-330","fingerprint":"codeql:cpp/suspicious-pointer-scaling:third_party/faac/libfaac/frame.c:fa72f8f97382e2ed:1","fingerprint_basis":"rule+path+SARIF primaryLocationLineHash","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":330,"analysis_id":2067529268,"instance_commit":"8927bc8afbad"},"rule_id":"cpp/suspicious-pointer-scaling","category":"third-party","feature_flag":"third_party/faac (AAC encoder, default build)","severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"third_party/faac/libfaac/frame.c","line":557,"revision":"8927bc8afbad"},"owner":"maintainers/third-party-integration","state_upstream":"open","first_seen":"2026-10-14","disposition":"needs-triage","exception_expiry":null,"evidence":"open alert #330; present in CodeQL analysis 2067529268 @8927bc8a"}, + {"id":"CODEQL-329","fingerprint":"codeql:cpp/integer-multiplication-cast-to-long:src/video/mp4_writer_utils.c:3e119948d005a888:1","fingerprint_basis":"rule+path+SARIF primaryLocationLineHash","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":329,"analysis_id":2067529268,"instance_commit":"8927bc8afbad"},"rule_id":"cpp/integer-multiplication-cast-to-long","category":"application","feature_flag":null,"severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/mp4_writer_utils.c","line":1249,"revision":"8927bc8afbad"},"owner":"maintainers/video","state_upstream":"open","first_seen":"2026-10-14","disposition":"needs-triage","exception_expiry":null,"evidence":"open alert #329; present in CodeQL analysis 2067529268 @8927bc8a"}, + {"id":"CODEQL-325","fingerprint":"codeql:cpp/path-injection:src/storage/storage_s3.c:53b5b52ec460fa95:1","fingerprint_basis":"rule+path+SARIF primaryLocationLineHash","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":325,"analysis_id":2067529268,"instance_commit":"8927bc8afbad"},"rule_id":"cpp/path-injection","category":"optional-feature","feature_flag":"ENABLE_S3_ARCHIVE","severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"network: outbound S3","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_s3.c","line":138,"revision":"8927bc8afbad"},"owner":"maintainers/storage","state_upstream":"open","first_seen":"2026-09-14","disposition":"needs-triage","exception_expiry":null,"evidence":"open alert #325; present in CodeQL analysis 2067529268 @8927bc8a"}, + {"id":"CODEQL-321","fingerprint":"codeql:cpp/toctou-race-condition:src/database/db_core.c:6494527ea640ab58:1","fingerprint_basis":"rule+path+SARIF primaryLocationLineHash","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":321,"analysis_id":2067529268,"instance_commit":"8927bc8afbad"},"rule_id":"cpp/toctou-race-condition","category":"application","feature_flag":null,"severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/database/db_core.c","line":255,"revision":"8927bc8afbad"},"owner":"maintainers/database","state_upstream":"open","first_seen":"2026-09-05","disposition":"needs-triage","exception_expiry":null,"evidence":"open alert #321; present in CodeQL analysis 2067529268 @8927bc8a"}, + {"id":"CODEQL-320","fingerprint":"codeql:cpp/path-injection:src/telemetry/collectors/linux_network.c:b5bcd3edc53410b8:1","fingerprint_basis":"rule+path+SARIF primaryLocationLineHash","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":320,"analysis_id":2067529268,"instance_commit":"8927bc8afbad"},"rule_id":"cpp/path-injection","category":"application","feature_flag":null,"severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"local: host procfs/sysfs/cgroup","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/telemetry/collectors/linux_network.c","line":608,"revision":"8927bc8afbad"},"owner":"maintainers/telemetry","state_upstream":"open","first_seen":"2026-09-03","disposition":"needs-triage","exception_expiry":null,"evidence":"open alert #320; present in CodeQL analysis 2067529268 @8927bc8a"}, + {"id":"CODEQL-319","fingerprint":"codeql:cpp/path-injection:src/telemetry/collectors/linux_network.c:3b3bfc107203db0b:1","fingerprint_basis":"rule+path+SARIF primaryLocationLineHash","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":319,"analysis_id":2067529268,"instance_commit":"8927bc8afbad"},"rule_id":"cpp/path-injection","category":"application","feature_flag":null,"severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"local: host procfs/sysfs/cgroup","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/telemetry/collectors/linux_network.c","line":575,"revision":"8927bc8afbad"},"owner":"maintainers/telemetry","state_upstream":"open","first_seen":"2026-09-03","disposition":"needs-triage","exception_expiry":null,"evidence":"open alert #319; present in CodeQL analysis 2067529268 @8927bc8a"}, + {"id":"CODEQL-318","fingerprint":"codeql:cpp/path-injection:src/telemetry/collectors/linux_cgroup.c:e566474d56b69fef:1","fingerprint_basis":"rule+path+SARIF primaryLocationLineHash","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":318,"analysis_id":2067529268,"instance_commit":"8927bc8afbad"},"rule_id":"cpp/path-injection","category":"application","feature_flag":null,"severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"local: host procfs/sysfs/cgroup","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/telemetry/collectors/linux_cgroup.c","line":305,"revision":"8927bc8afbad"},"owner":"maintainers/telemetry","state_upstream":"open","first_seen":"2026-09-03","disposition":"needs-triage","exception_expiry":null,"evidence":"open alert #318; present in CodeQL analysis 2067529268 @8927bc8a"}, + {"id":"CODEQL-317","fingerprint":"codeql:cpp/path-injection:src/telemetry/collectors/linux_cgroup.c:2c8aa240e0b8e201:1","fingerprint_basis":"rule+path+SARIF primaryLocationLineHash","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":317,"analysis_id":2067529268,"instance_commit":"8927bc8afbad"},"rule_id":"cpp/path-injection","category":"application","feature_flag":null,"severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"local: host procfs/sysfs/cgroup","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/telemetry/collectors/linux_cgroup.c","line":320,"revision":"8927bc8afbad"},"owner":"maintainers/telemetry","state_upstream":"open","first_seen":"2026-09-03","disposition":"needs-triage","exception_expiry":null,"evidence":"open alert #317; present in CodeQL analysis 2067529268 @8927bc8a"}, + {"id":"CODEQL-316","fingerprint":"codeql:cpp/cleartext-storage-database:src/database/db_event_destinations.c:fbb7880f337a5c64:1","fingerprint_basis":"rule+path+SARIF primaryLocationLineHash","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":316,"analysis_id":2067529268,"instance_commit":"8927bc8afbad"},"rule_id":"cpp/cleartext-storage-database","category":"application","feature_flag":null,"severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/database/db_event_destinations.c","line":484,"revision":"8927bc8afbad"},"owner":"maintainers/database","state_upstream":"open","first_seen":"2026-09-03","disposition":"needs-triage","exception_expiry":null,"evidence":"open alert #316; present in CodeQL analysis 2067529268 @8927bc8a"}, + {"id":"CODEQL-315","fingerprint":"codeql:cpp/toctou-race-condition:src/web/api_handlers_operator_floor_plans.c:3e1df25fb5a82b27:1","fingerprint_basis":"rule+path+SARIF primaryLocationLineHash","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":315,"analysis_id":2067529268,"instance_commit":"8927bc8afbad"},"rule_id":"cpp/toctou-race-condition","category":"application","feature_flag":null,"severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_operator_floor_plans.c","line":1073,"revision":"8927bc8afbad"},"owner":"maintainers/web","state_upstream":"open","first_seen":"2026-08-31","disposition":"needs-triage","exception_expiry":null,"evidence":"open alert #315; present in CodeQL analysis 2067529268 @8927bc8a"}, + {"id":"CODEQL-314","fingerprint":"codeql:cpp/toctou-race-condition:src/web/api_handlers_operator_floor_plans.c:78db8851175c4ba2:1","fingerprint_basis":"rule+path+SARIF primaryLocationLineHash","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":314,"analysis_id":2067529268,"instance_commit":"8927bc8afbad"},"rule_id":"cpp/toctou-race-condition","category":"application","feature_flag":null,"severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_operator_floor_plans.c","line":1064,"revision":"8927bc8afbad"},"owner":"maintainers/web","state_upstream":"open","first_seen":"2026-08-31","disposition":"needs-triage","exception_expiry":null,"evidence":"open alert #314; present in CodeQL analysis 2067529268 @8927bc8a"}, + {"id":"CODEQL-313","fingerprint":"codeql:cpp/toctou-race-condition:src/web/api_handlers_operator_floor_plans.c:61278a1e48f4f467:1","fingerprint_basis":"rule+path+SARIF primaryLocationLineHash","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":313,"analysis_id":2067529268,"instance_commit":"8927bc8afbad"},"rule_id":"cpp/toctou-race-condition","category":"application","feature_flag":null,"severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_operator_floor_plans.c","line":1053,"revision":"8927bc8afbad"},"owner":"maintainers/web","state_upstream":"open","first_seen":"2026-08-31","disposition":"needs-triage","exception_expiry":null,"evidence":"open alert #313; present in CodeQL analysis 2067529268 @8927bc8a"}, + {"id":"CODEQL-310","fingerprint":"codeql:cpp/toctou-race-condition:src/storage/storage_migration.c:a72d1e0db3e808a7:1","fingerprint_basis":"rule+path+SARIF primaryLocationLineHash","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":310,"analysis_id":2067529268,"instance_commit":"8927bc8afbad"},"rule_id":"cpp/toctou-race-condition","category":"application","feature_flag":null,"severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_migration.c","line":430,"revision":"8927bc8afbad"},"owner":"maintainers/storage","state_upstream":"open","first_seen":"2026-08-25","disposition":"needs-triage","exception_expiry":null,"evidence":"open alert #310; present in CodeQL analysis 2067529268 @8927bc8a"}, + {"id":"CODEQL-307","fingerprint":"codeql:cpp/cleartext-storage-database:src/database/db_event_destinations.c:1e56b090fc53c9de:1","fingerprint_basis":"rule+path+SARIF primaryLocationLineHash","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":307,"analysis_id":2067529268,"instance_commit":"8927bc8afbad"},"rule_id":"cpp/cleartext-storage-database","category":"application","feature_flag":null,"severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/database/db_event_destinations.c","line":562,"revision":"8927bc8afbad"},"owner":"maintainers/database","state_upstream":"open","first_seen":"2026-08-23","disposition":"needs-triage","exception_expiry":null,"evidence":"open alert #307; present in CodeQL analysis 2067529268 @8927bc8a"}, + {"id":"CODEQL-306","fingerprint":"codeql:cpp/uncontrolled-allocation-size:src/core/event_router.c:5c77678f179baed1:1","fingerprint_basis":"rule+path+SARIF primaryLocationLineHash","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":306,"analysis_id":2067529268,"instance_commit":"8927bc8afbad"},"rule_id":"cpp/uncontrolled-allocation-size","category":"application","feature_flag":null,"severity":{"tool":"error","security_severity":"high","normalized":"high"},"exposure":"internal","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/core/event_router.c","line":267,"revision":"8927bc8afbad"},"owner":"maintainers/core","state_upstream":"open","first_seen":"2026-08-23","disposition":"needs-triage","exception_expiry":null,"evidence":"open alert #306; present in CodeQL analysis 2067529268 @8927bc8a"}, + {"id":"CODEQL-305","fingerprint":"codeql:cpp/uncontrolled-allocation-size:src/core/event_router.c:77111263db291c60:1","fingerprint_basis":"rule+path+SARIF primaryLocationLineHash","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":305,"analysis_id":2067529268,"instance_commit":"8927bc8afbad"},"rule_id":"cpp/uncontrolled-allocation-size","category":"application","feature_flag":null,"severity":{"tool":"error","security_severity":"high","normalized":"high"},"exposure":"internal","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/core/event_router.c","line":265,"revision":"8927bc8afbad"},"owner":"maintainers/core","state_upstream":"open","first_seen":"2026-08-23","disposition":"needs-triage","exception_expiry":null,"evidence":"open alert #305; present in CodeQL analysis 2067529268 @8927bc8a"}, + {"id":"CODEQL-293","fingerprint":"codeql:cpp/world-writable-file-creation:src/core/mqtt_client.c:9bdc818fba83116:1","fingerprint_basis":"rule+path+SARIF primaryLocationLineHash","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":293,"analysis_id":2067529268,"instance_commit":"8927bc8afbad"},"rule_id":"cpp/world-writable-file-creation","category":"optional-feature","feature_flag":"ENABLE_MQTT","severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"network: outbound MQTT","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/core/mqtt_client.c","line":621,"revision":"8927bc8afbad"},"owner":"maintainers/core","state_upstream":"open","first_seen":"2026-07-06","disposition":"needs-triage","exception_expiry":null,"evidence":"open alert #293; present in CodeQL analysis 2067529268 @8927bc8a"}, + {"id":"CODEQL-272","fingerprint":"codeql:cpp/non-https-url:src/video/onvif_detection.c:8d57a932121d72cd:1","fingerprint_basis":"rule+path+SARIF primaryLocationLineHash","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":272,"analysis_id":2067529268,"instance_commit":"8927bc8afbad"},"rule_id":"cpp/non-https-url","category":"application","feature_flag":null,"severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/onvif_detection.c","line":752,"revision":"8927bc8afbad"},"owner":"maintainers/video","state_upstream":"open","first_seen":"2026-04-23","disposition":"needs-triage","exception_expiry":null,"evidence":"open alert #272; present in CodeQL analysis 2067529268 @8927bc8a"}, + {"id":"CODEQL-271","fingerprint":"codeql:cpp/non-https-url:src/video/onvif_detection.c:a545ba6f506950f0:1","fingerprint_basis":"rule+path+SARIF primaryLocationLineHash","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":271,"analysis_id":2067529268,"instance_commit":"8927bc8afbad"},"rule_id":"cpp/non-https-url","category":"application","feature_flag":null,"severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/onvif_detection.c","line":904,"revision":"8927bc8afbad"},"owner":"maintainers/video","state_upstream":"open","first_seen":"2026-04-23","disposition":"needs-triage","exception_expiry":null,"evidence":"open alert #271; present in CodeQL analysis 2067529268 @8927bc8a"}, + {"id":"CODEQL-270","fingerprint":"codeql:cpp/non-https-url:src/video/onvif_detection.c:2f7971b3450981cc:1","fingerprint_basis":"rule+path+SARIF primaryLocationLineHash","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":270,"analysis_id":2067529268,"instance_commit":"8927bc8afbad"},"rule_id":"cpp/non-https-url","category":"application","feature_flag":null,"severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/onvif_detection.c","line":882,"revision":"8927bc8afbad"},"owner":"maintainers/video","state_upstream":"open","first_seen":"2026-04-23","disposition":"needs-triage","exception_expiry":null,"evidence":"open alert #270; present in CodeQL analysis 2067529268 @8927bc8a"}, + {"id":"CODEQL-267","fingerprint":"codeql:cpp/cleartext-storage-file:src/core/config.c:13c44693f16fcef2:1","fingerprint_basis":"rule+path+SARIF primaryLocationLineHash","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":267,"analysis_id":2067529268,"instance_commit":"8927bc8afbad"},"rule_id":"cpp/cleartext-storage-file","category":"application","feature_flag":null,"severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/core/config.c","line":1930,"revision":"8927bc8afbad"},"owner":"maintainers/core","state_upstream":"open","first_seen":"2026-03-09","disposition":"needs-triage","exception_expiry":null,"evidence":"open alert #267; present in CodeQL analysis 2067529268 @8927bc8a"}, + {"id":"CODEQL-264","fingerprint":"codeql:cpp/cleartext-transmission:src/video/hls/hls_unified_thread.c:6590b2857f911535:1","fingerprint_basis":"rule+path+SARIF primaryLocationLineHash","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":264,"analysis_id":2067529268,"instance_commit":"8927bc8afbad"},"rule_id":"cpp/cleartext-transmission","category":"application","feature_flag":null,"severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/hls/hls_unified_thread.c","line":765,"revision":"8927bc8afbad"},"owner":"maintainers/video","state_upstream":"open","first_seen":"2026-03-06","disposition":"needs-triage","exception_expiry":null,"evidence":"open alert #264; present in CodeQL analysis 2067529268 @8927bc8a"}, + {"id":"CODEQL-185","fingerprint":"codeql:cpp/cleartext-storage-database:src/database/db_streams.c:8dbda857d93080d5:1","fingerprint_basis":"rule+path+SARIF primaryLocationLineHash","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":185,"analysis_id":2067529268,"instance_commit":"8927bc8afbad"},"rule_id":"cpp/cleartext-storage-database","category":"application","feature_flag":null,"severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/database/db_streams.c","line":423,"revision":"8927bc8afbad"},"owner":"maintainers/database","state_upstream":"open","first_seen":"2026-03-01","disposition":"needs-triage","exception_expiry":null,"evidence":"open alert #185; present in CodeQL analysis 2067529268 @8927bc8a"}, + {"id":"CODEQL-183","fingerprint":"codeql:cpp/cleartext-storage-database:src/database/db_streams.c:4d9d6f22e2bfe78b:1","fingerprint_basis":"rule+path+SARIF primaryLocationLineHash","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":183,"analysis_id":2067529268,"instance_commit":"8927bc8afbad"},"rule_id":"cpp/cleartext-storage-database","category":"application","feature_flag":null,"severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/database/db_streams.c","line":242,"revision":"8927bc8afbad"},"owner":"maintainers/database","state_upstream":"open","first_seen":"2026-03-01","disposition":"needs-triage","exception_expiry":null,"evidence":"open alert #183; present in CodeQL analysis 2067529268 @8927bc8a"}, + {"id":"CODEQL-181","fingerprint":"codeql:cpp/cleartext-storage-database:src/database/db_streams.c:8dbda857d93080d5:2","fingerprint_basis":"rule+path+SARIF primaryLocationLineHash","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":181,"analysis_id":2067529268,"instance_commit":"8927bc8afbad"},"rule_id":"cpp/cleartext-storage-database","category":"application","feature_flag":null,"severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/database/db_streams.c","line":615,"revision":"8927bc8afbad"},"owner":"maintainers/database","state_upstream":"open","first_seen":"2026-03-01","disposition":"needs-triage","exception_expiry":null,"evidence":"open alert #181; present in CodeQL analysis 2067529268 @8927bc8a"}, + {"id":"CODEQL-67","fingerprint":"codeql:cpp/sql-injection:src/database/sqlite_migrate.c:661998ab041486b2:1","fingerprint_basis":"rule+path+SARIF primaryLocationLineHash","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":67,"analysis_id":2067529268,"instance_commit":"8927bc8afbad"},"rule_id":"cpp/sql-injection","category":"application","feature_flag":null,"severity":{"tool":"error","security_severity":"high","normalized":"high"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/database/sqlite_migrate.c","line":916,"revision":"8927bc8afbad"},"owner":"maintainers/database","state_upstream":"open","first_seen":"2026-02-21","disposition":"needs-triage","exception_expiry":null,"evidence":"open alert #67; present in CodeQL analysis 2067529268 @8927bc8a"}, + {"id":"CODEQL-66","fingerprint":"codeql:cpp/sql-injection:src/database/sqlite_migrate.c:65daccbf29f61c5f:1","fingerprint_basis":"rule+path+SARIF primaryLocationLineHash","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":66,"analysis_id":2067529268,"instance_commit":"8927bc8afbad"},"rule_id":"cpp/sql-injection","category":"application","feature_flag":null,"severity":{"tool":"error","security_severity":"high","normalized":"high"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/database/sqlite_migrate.c","line":1005,"revision":"8927bc8afbad"},"owner":"maintainers/database","state_upstream":"open","first_seen":"2026-02-21","disposition":"needs-triage","exception_expiry":null,"evidence":"open alert #66; present in CodeQL analysis 2067529268 @8927bc8a"}, + {"id":"CODEQL-64","fingerprint":"codeql:cpp/cleartext-storage-file:src/core/config.c:c49a430640c7292a:1","fingerprint_basis":"rule+path+SARIF primaryLocationLineHash","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":64,"analysis_id":2067529268,"instance_commit":"8927bc8afbad"},"rule_id":"cpp/cleartext-storage-file","category":"application","feature_flag":null,"severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/core/config.c","line":1999,"revision":"8927bc8afbad"},"owner":"maintainers/core","state_upstream":"open","first_seen":"2026-02-21","disposition":"needs-triage","exception_expiry":null,"evidence":"open alert #64; present in CodeQL analysis 2067529268 @8927bc8a"}, + {"id":"CODEQL-63","fingerprint":"codeql:cpp/cleartext-storage-file:src/core/config.c:308f36dd4bb6055e:1","fingerprint_basis":"rule+path+SARIF primaryLocationLineHash","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":63,"analysis_id":2067529268,"instance_commit":"8927bc8afbad"},"rule_id":"cpp/cleartext-storage-file","category":"application","feature_flag":null,"severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/core/config.c","line":1985,"revision":"8927bc8afbad"},"owner":"maintainers/core","state_upstream":"open","first_seen":"2026-02-21","disposition":"needs-triage","exception_expiry":null,"evidence":"open alert #63; present in CodeQL analysis 2067529268 @8927bc8a"}, + {"id":"CODEQL-14","fingerprint":"codeql:cpp/cleartext-transmission:src/video/stream_protocol.c:3b0c02f7eb3743b:1","fingerprint_basis":"rule+path+SARIF primaryLocationLineHash","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":14,"analysis_id":2067529268,"instance_commit":"8927bc8afbad"},"rule_id":"cpp/cleartext-transmission","category":"application","feature_flag":null,"severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/stream_protocol.c","line":241,"revision":"8927bc8afbad"},"owner":"maintainers/video","state_upstream":"open","first_seen":"2026-02-21","disposition":"needs-triage","exception_expiry":null,"evidence":"open alert #14; present in CodeQL analysis 2067529268 @8927bc8a"}, + {"id":"CODEQL-78","fingerprint":"codeql-alert:78","fingerprint_basis":"GitHub alert number (instance not in current analysis)","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":78,"analysis_id":null,"instance_commit":"d123e2f374e0"},"rule_id":"cpp/non-https-url","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/go2rtc/go2rtc_api.c","line":702,"revision":"d123e2f374e0"},"owner":"maintainers/video","state_upstream":"dismissed","first_seen":"2026-02-25","disposition":"exception-dismissed-false-positive","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1 (none recorded upstream)","evidence":"dismissed 2026-03-02 as 'false positive' (maintainer rationale: plain HTTP is intended for local/container go2rtc/camera endpoints); NOT in current analysis: path not compiled in CodeQL build (ENABLE_GO2RTC=OFF) or code changed; re-verify when scope widens"}, + {"id":"CODEQL-77","fingerprint":"codeql-alert:77","fingerprint_basis":"GitHub alert number (instance not in current analysis)","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":77,"analysis_id":null,"instance_commit":"d123e2f374e0"},"rule_id":"cpp/non-https-url","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/go2rtc/go2rtc_api.c","line":433,"revision":"d123e2f374e0"},"owner":"maintainers/video","state_upstream":"dismissed","first_seen":"2026-02-23","disposition":"exception-dismissed-false-positive","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1 (none recorded upstream)","evidence":"dismissed 2026-03-02 as 'false positive' (maintainer rationale: plain HTTP is intended for local/container go2rtc/camera endpoints); NOT in current analysis: path not compiled in CodeQL build (ENABLE_GO2RTC=OFF) or code changed; re-verify when scope widens"}, + {"id":"CODEQL-76","fingerprint":"codeql-alert:76","fingerprint_basis":"GitHub alert number (instance not in current analysis)","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":76,"analysis_id":null,"instance_commit":"d123e2f374e0"},"rule_id":"cpp/non-https-url","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/go2rtc/go2rtc_api.c","line":520,"revision":"d123e2f374e0"},"owner":"maintainers/video","state_upstream":"dismissed","first_seen":"2026-02-23","disposition":"exception-dismissed-false-positive","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1 (none recorded upstream)","evidence":"dismissed 2026-03-02 as 'false positive' (maintainer rationale: plain HTTP is intended for local/container go2rtc/camera endpoints); NOT in current analysis: path not compiled in CodeQL build (ENABLE_GO2RTC=OFF) or code changed; re-verify when scope widens"}, + {"id":"CODEQL-75","fingerprint":"codeql-alert:75","fingerprint_basis":"GitHub alert number (instance not in current analysis)","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":75,"analysis_id":null,"instance_commit":"d123e2f374e0"},"rule_id":"cpp/non-https-url","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/go2rtc/go2rtc_api.c","line":578,"revision":"d123e2f374e0"},"owner":"maintainers/video","state_upstream":"dismissed","first_seen":"2026-02-23","disposition":"exception-dismissed-false-positive","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1 (none recorded upstream)","evidence":"dismissed 2026-03-02 as 'false positive' (maintainer rationale: plain HTTP is intended for local/container go2rtc/camera endpoints); NOT in current analysis: path not compiled in CodeQL build (ENABLE_GO2RTC=OFF) or code changed; re-verify when scope widens"}, + {"id":"CODEQL-73","fingerprint":"codeql-alert:73","fingerprint_basis":"GitHub alert number (instance not in current analysis)","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":73,"analysis_id":null,"instance_commit":"59c6eed25345"},"rule_id":"cpp/non-https-url","category":"application","feature_flag":null,"severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_ptz.c","line":58,"revision":"59c6eed25345"},"owner":"maintainers/web","state_upstream":"dismissed","first_seen":"2026-02-21","disposition":"exception-dismissed-false-positive","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1 (none recorded upstream)","evidence":"dismissed 2026-03-02 as 'false positive' (maintainer rationale: plain HTTP is intended for local/container go2rtc/camera endpoints); NOT in current analysis: path not compiled in CodeQL build (ENABLE_GO2RTC=OFF) or code changed; re-verify when scope widens"}, + {"id":"CODEQL-71","fingerprint":"codeql-alert:71","fingerprint_basis":"GitHub alert number (instance not in current analysis)","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":71,"analysis_id":null,"instance_commit":"d123e2f374e0"},"rule_id":"cpp/non-https-url","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/go2rtc/go2rtc_api.c","line":149,"revision":"d123e2f374e0"},"owner":"maintainers/video","state_upstream":"dismissed","first_seen":"2026-02-21","disposition":"exception-dismissed-false-positive","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1 (none recorded upstream)","evidence":"dismissed 2026-03-02 as 'false positive' (maintainer rationale: plain HTTP is intended for local/container go2rtc/camera endpoints); NOT in current analysis: path not compiled in CodeQL build (ENABLE_GO2RTC=OFF) or code changed; re-verify when scope widens"}, + {"id":"CODEQL-70","fingerprint":"codeql-alert:70","fingerprint_basis":"GitHub alert number (instance not in current analysis)","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":70,"analysis_id":null,"instance_commit":"d123e2f374e0"},"rule_id":"cpp/non-https-url","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/go2rtc/go2rtc_api.c","line":225,"revision":"d123e2f374e0"},"owner":"maintainers/video","state_upstream":"dismissed","first_seen":"2026-02-21","disposition":"exception-dismissed-false-positive","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1 (none recorded upstream)","evidence":"dismissed 2026-03-02 as 'false positive' (maintainer rationale: plain HTTP is intended for local/container go2rtc/camera endpoints); NOT in current analysis: path not compiled in CodeQL build (ENABLE_GO2RTC=OFF) or code changed; re-verify when scope widens"}, + {"id":"CODEQL-69","fingerprint":"codeql-alert:69","fingerprint_basis":"GitHub alert number (instance not in current analysis)","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":69,"analysis_id":null,"instance_commit":"d123e2f374e0"},"rule_id":"cpp/non-https-url","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/go2rtc/go2rtc_api.c","line":626,"revision":"d123e2f374e0"},"owner":"maintainers/video","state_upstream":"dismissed","first_seen":"2026-02-21","disposition":"exception-dismissed-false-positive","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1 (none recorded upstream)","evidence":"dismissed 2026-03-02 as 'false positive' (maintainer rationale: plain HTTP is intended for local/container go2rtc/camera endpoints); NOT in current analysis: path not compiled in CodeQL build (ENABLE_GO2RTC=OFF) or code changed; re-verify when scope widens"}, + {"id":"CODEQL-59","fingerprint":"codeql:cpp/non-https-url:src/video/onvif_discovery.c:366d15987af98d51:1","fingerprint_basis":"rule+path+SARIF primaryLocationLineHash","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":59,"analysis_id":2067529268,"instance_commit":"8927bc8afbad"},"rule_id":"cpp/non-https-url","category":"application","feature_flag":null,"severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/onvif_discovery.c","line":531,"revision":"8927bc8afbad"},"owner":"maintainers/video","state_upstream":"dismissed","first_seen":"2026-02-21","disposition":"exception-dismissed-false-positive","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1 (none recorded upstream)","evidence":"dismissed 2026-03-02 as 'false positive' (maintainer rationale: plain HTTP is intended for local/container go2rtc/camera endpoints); still reported by current analysis"}, + {"id":"CODEQL-20","fingerprint":"codeql-alert:20","fingerprint_basis":"GitHub alert number (instance not in current analysis)","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":20,"analysis_id":null,"instance_commit":"d123e2f374e0"},"rule_id":"cpp/non-https-url","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/go2rtc/go2rtc_api.c","line":371,"revision":"d123e2f374e0"},"owner":"maintainers/video","state_upstream":"dismissed","first_seen":"2026-02-21","disposition":"exception-dismissed-false-positive","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1 (none recorded upstream)","evidence":"dismissed 2026-03-02 as 'false positive' (maintainer rationale: plain HTTP is intended for local/container go2rtc/camera endpoints); NOT in current analysis: path not compiled in CodeQL build (ENABLE_GO2RTC=OFF) or code changed; re-verify when scope widens"}, + {"id":"CODEQL-19","fingerprint":"codeql-alert:19","fingerprint_basis":"GitHub alert number (instance not in current analysis)","scanner_id":"codeql-cpp","source_ref":{"code_scanning_alert":19,"analysis_id":null,"instance_commit":"d123e2f374e0"},"rule_id":"cpp/non-https-url","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"warning","security_severity":"high","normalized":"high"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/go2rtc/go2rtc_api.c","line":335,"revision":"d123e2f374e0"},"owner":"maintainers/video","state_upstream":"dismissed","first_seen":"2026-02-21","disposition":"exception-dismissed-false-positive","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1 (none recorded upstream)","evidence":"dismissed 2026-03-02 as 'false positive' (maintainer rationale: plain HTTP is intended for local/container go2rtc/camera endpoints); NOT in current analysis: path not compiled in CodeQL build (ENABLE_GO2RTC=OFF) or code changed; re-verify when scope widens"}, + {"id":"CODEQUALITY-941","fingerprint":"code-quality:js/unused-local-variable:web/js/components/preact/common/LanguageSelector.jsx:933ea2431b1d5059","fingerprint_basis":"rule+path+sha256(normalized message)","scanner_id":"github-code-quality","source_ref":{"code_quality_finding":941},"rule_id":"js/unused-local-variable","category":"application","feature_flag":null,"severity":{"tool":"note","normalized":"info"},"exposure":"browser: web UI","exposure_basis":"maintainability only","location":{"path":"web/js/components/preact/common/LanguageSelector.jsx","line":4,"revision":"default-branch"},"owner":"maintainers/web","state_upstream":"open","first_seen":"2026-10-16","disposition":"needs-triage","exception_expiry":null,"evidence":"code-quality finding #941 (open)"}, + {"id":"DEPENDABOT-101","fingerprint":"dependabot:web/package-lock.json:deepmerge:GHSA-gcqx-w48m-w2h4","fingerprint_basis":"manifest+package+GHSA","scanner_id":"dependabot","source_ref":{"dependabot_alert":101,"advisory":"GHSA-gcqx-w48m-w2h4","cve":"CVE-2026-93753"},"rule_id":"GHSA-gcqx-w48m-w2h4","category":"build-only","feature_flag":null,"severity":{"tool":"low","normalized":"low"},"exposure":"development transitive dependency; not in production bundle (npm audit --omit=dev clean)","exposure_basis":"dependency scope from Dependabot + npm audit prod/dev split","location":{"path":"web/package-lock.json","package":"deepmerge","vulnerable_range":">= 4.2.0, <= 4.3.1","first_patched":null},"owner":"maintainers/web-tooling","state_upstream":"open","first_seen":"2026-10-29","disposition":"needs-triage","exception_expiry":null,"evidence":"open Dependabot alert; no patched version published; pulled in via jest-config (jest 29)"}, + {"id":"NPM-WEB-GHSA-gcqx-w48m-w2h4-deepmerge","fingerprint":"npm-audit:web/package-lock.json:deepmerge:GHSA-gcqx-w48m-w2h4","fingerprint_basis":"lockfile+package+GHSA","scanner_id":"npm-audit-web","source_ref":{"advisory":"GHSA-gcqx-w48m-w2h4","report":"build/eng-artifacts/T1/npm/web-audit-all.json"},"rule_id":"GHSA-gcqx-w48m-w2h4","category":"build-only","feature_flag":null,"severity":{"tool":"low","normalized":"low"},"exposure":"devDependency (lint/test/build tooling); absent from npm audit --omit=dev","exposure_basis":"npm audit prod vs all comparison","location":{"path":"web/package-lock.json","package":"deepmerge","vulnerable_range":">=4.2.0 <=4.3.1"},"owner":"maintainers/web-tooling","state_upstream":"open","first_seen":"2026-10-31","disposition":"needs-triage","exception_expiry":null,"fix_available":{"name":"jest","version":"29.7.0","semver_major":true},"evidence":"also open as Dependabot alert"}, + {"id":"NPM-WEB-GHSA-3g3m-2fjr-6pw4-glob","fingerprint":"npm-audit:web/package-lock.json:glob:GHSA-3g3m-2fjr-6pw4","fingerprint_basis":"lockfile+package+GHSA","scanner_id":"npm-audit-web","source_ref":{"advisory":"GHSA-3g3m-2fjr-6pw4","report":"build/eng-artifacts/T1/npm/web-audit-all.json"},"rule_id":"GHSA-3g3m-2fjr-6pw4","category":"build-only","feature_flag":null,"severity":{"tool":"moderate","normalized":"medium"},"exposure":"devDependency (lint/test/build tooling); absent from npm audit --omit=dev","exposure_basis":"npm audit prod vs all comparison","location":{"path":"web/package-lock.json","package":"glob","vulnerable_range":">=9.0.0 <=14.0.1"},"owner":"maintainers/web-tooling","state_upstream":"open","first_seen":"2026-10-31","disposition":"needs-triage","exception_expiry":null,"fix_available":{"name":"@sentry/vite-plugin","version":"5.3.0","semver_major":true},"evidence":"advisory published 2026-10-30; not yet raised by Dependabot at inventory time"}, + {"id":"NPM-WEB-GHSA-g3hv-75wg-m249-minimatch","fingerprint":"npm-audit:web/package-lock.json:minimatch:GHSA-g3hv-75wg-m249","fingerprint_basis":"lockfile+package+GHSA","scanner_id":"npm-audit-web","source_ref":{"advisory":"GHSA-g3hv-75wg-m249","report":"build/eng-artifacts/T1/npm/web-audit-all.json"},"rule_id":"GHSA-g3hv-75wg-m249","category":"build-only","feature_flag":null,"severity":{"tool":"moderate","normalized":"medium"},"exposure":"devDependency (lint/test/build tooling); absent from npm audit --omit=dev","exposure_basis":"npm audit prod vs all comparison","location":{"path":"web/package-lock.json","package":"minimatch","vulnerable_range":"<11.0.1"},"owner":"maintainers/web-tooling","state_upstream":"open","first_seen":"2026-10-31","disposition":"needs-triage","exception_expiry":null,"fix_available":{"name":"eslint-plugin-jsx-a11y","version":"6.4.1","semver_major":true},"evidence":"advisory published 2026-10-30; not yet raised by Dependabot at inventory time"}, + {"id":"ADVISORY-GHSA-cv53-mq7p-6jp2","fingerprint":"repo-advisory:a825def96617499d","fingerprint_basis":"sha256(GHSA id) so private IDs are not disclosed","scanner_id":"repo-security-advisories","source_ref":{"advisory":"GHSA-cv53-mq7p-6jp2"},"rule_id":"repository-security-advisory","category":"application","feature_flag":null,"severity":{"tool":"high","normalized":"high"},"exposure":"per published advisory","exposure_basis":"advisory metadata","location":{"path":null},"owner":"maintainers/security","state_upstream":"published","first_seen":"2026-02-21","disposition":"fixed-upstream-verify-regression","exception_expiry":null,"evidence":"published 2026-03-02; affected range per advisory: <= 0.27.4; current release line 0.45.x is outside the range; regression coverage to be confirmed by T7/T33"}, + {"id":"ADVISORY-repo-advisory-draft-1","fingerprint":"repo-advisory:f943ad1ba3cd073e","fingerprint_basis":"sha256(GHSA id) so private IDs are not disclosed","scanner_id":"repo-security-advisories","source_ref":{"sanitized_id":"repo-advisory-draft-1"},"rule_id":"repository-security-advisory","category":"application","feature_flag":null,"severity":{"tool":"high","normalized":"high"},"exposure":"per advisory (private)","exposure_basis":"advisory metadata","location":{"path":null},"owner":"maintainers/security","state_upstream":"draft","first_seen":"2026-10-13","disposition":"private-triage-pending","exception_expiry":null,"evidence":"private repository advisory in state 'draft' (created 2026-10-13); details intentionally omitted from public inventory; see maintainer-only GitHub Security tab"}, + {"id":"ADVISORY-repo-advisory-closed-1","fingerprint":"repo-advisory:42e5b52e3201741d","fingerprint_basis":"sha256(GHSA id) so private IDs are not disclosed","scanner_id":"repo-security-advisories","source_ref":{"sanitized_id":"repo-advisory-closed-1"},"rule_id":"repository-security-advisory","category":"application","feature_flag":null,"severity":{"tool":"high","normalized":"high"},"exposure":"per advisory (private)","exposure_basis":"advisory metadata","location":{"path":null},"owner":"maintainers/security","state_upstream":"closed","first_seen":"2026-10-13","disposition":"closed-upstream","exception_expiry":null,"evidence":"private repository advisory in state 'closed' (created 2026-10-13); details intentionally omitted from public inventory; see maintainer-only GitHub Security tab"}, + {"id":"ADVISORY-repo-advisory-draft-2","fingerprint":"repo-advisory:5a600bbbbb54502f","fingerprint_basis":"sha256(GHSA id) so private IDs are not disclosed","scanner_id":"repo-security-advisories","source_ref":{"sanitized_id":"repo-advisory-draft-2"},"rule_id":"repository-security-advisory","category":"application","feature_flag":null,"severity":{"tool":"high","normalized":"high"},"exposure":"per advisory (private)","exposure_basis":"advisory metadata","location":{"path":null},"owner":"maintainers/security","state_upstream":"draft","first_seen":"2026-10-13","disposition":"private-triage-pending","exception_expiry":null,"evidence":"private repository advisory in state 'draft' (created 2026-10-13); details intentionally omitted from public inventory; see maintainer-only GitHub Security tab"}, + {"id":"ADVISORY-GHSA-rqj3-pch5-rq4f","fingerprint":"repo-advisory:010cb8d4cd986b2e","fingerprint_basis":"sha256(GHSA id) so private IDs are not disclosed","scanner_id":"repo-security-advisories","source_ref":{"advisory":"GHSA-rqj3-pch5-rq4f"},"rule_id":"repository-security-advisory","category":"application","feature_flag":null,"severity":{"tool":"critical","normalized":"critical"},"exposure":"per published advisory","exposure_basis":"advisory metadata","location":{"path":null},"owner":"maintainers/security","state_upstream":"published","first_seen":"2026-10-23","disposition":"fixed-upstream-verify-regression","exception_expiry":null,"evidence":"published 2026-10-29; affected range per advisory: \u2264 0.43.4; current release line 0.45.x is outside the range; regression coverage to be confirmed by T7/T33"}, + {"id":"ADVISORY-GHSA-pvw7-7j8c-qx96","fingerprint":"repo-advisory:dd46f7487ec3f6f2","fingerprint_basis":"sha256(GHSA id) so private IDs are not disclosed","scanner_id":"repo-security-advisories","source_ref":{"advisory":"GHSA-pvw7-7j8c-qx96"},"rule_id":"repository-security-advisory","category":"application","feature_flag":null,"severity":{"tool":"high","normalized":"high"},"exposure":"per published advisory","exposure_basis":"advisory metadata","location":{"path":null},"owner":"maintainers/security","state_upstream":"published","first_seen":"2026-10-27","disposition":"fixed-upstream-verify-regression","exception_expiry":null,"evidence":"published 2026-10-29; affected range per advisory: <= 0.44.1; current release line 0.45.x is outside the range; regression coverage to be confirmed by T7/T33"}, + {"id":"CLANGTIDY-5f6ae30cde3aaf3d","fingerprint":"clang-tidy:bugprone-macro-parentheses:/usr/include/cjson/cJSON.h:5f6ae30cde3aaf3d","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-macro-parentheses","category":"third-party","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"/usr/include/cjson/cJSON.h","line":284,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-bc48f96894493869","fingerprint":"clang-tidy:bugprone-macro-parentheses:/usr/include/cjson/cJSON.h:bc48f96894493869","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-macro-parentheses","category":"third-party","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"/usr/include/cjson/cJSON.h","line":284,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-01e4c541adfa23e3","fingerprint":"clang-tidy:bugprone-macro-parentheses:/usr/include/cjson/cJSON.h:01e4c541adfa23e3","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-macro-parentheses","category":"third-party","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"/usr/include/cjson/cJSON.h","line":290,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-3abdad2ed8a71fe5","fingerprint":"clang-tidy:bugprone-macro-parentheses:/usr/include/cjson/cJSON.h:3abdad2ed8a71fe5","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-macro-parentheses","category":"third-party","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"/usr/include/cjson/cJSON.h","line":296,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-09829500c354c2b5","fingerprint":"clang-tidy:bugprone-macro-parentheses:/usr/include/cjson/cJSON.h:09829500c354c2b5","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-macro-parentheses","category":"third-party","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"/usr/include/cjson/cJSON.h","line":296,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-661c1d9d010f4873","fingerprint":"clang-tidy:bugprone-macro-parentheses:/usr/include/cjson/cJSON.h:661c1d9d010f4873","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-macro-parentheses","category":"third-party","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"/usr/include/cjson/cJSON.h","line":296,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-f69ef126d8e55b2b","fingerprint":"clang-tidy:bugprone-macro-parentheses:/usr/include/cjson/cJSON.h:f69ef126d8e55b2b","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-macro-parentheses","category":"third-party","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"/usr/include/cjson/cJSON.h","line":296,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-6d1385324d08479d","fingerprint":"clang-tidy:bugprone-macro-parentheses:/usr/include/cjson/cJSON.h:6d1385324d08479d","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-macro-parentheses","category":"third-party","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"/usr/include/cjson/cJSON.h","line":296,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-1539a5c009afd0df","fingerprint":"clang-tidy:cert-int09-c:include/core/authorization.h:1539a5c009afd0df","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"cert-int09-c","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"internal","exposure_basis":"path heuristic; not yet triaged","location":{"path":"include/core/authorization.h","line":15,"revision":"1b8d4332"},"owner":"maintainers/core","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-ca2f4806dea5f177","fingerprint":"clang-tidy:bugprone-narrowing-conversions:include/web/api_timing.h:ca2f4806dea5f177","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-narrowing-conversions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"include/web/api_timing.h","line":30,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-054f4f2a2583f814","fingerprint":"clang-tidy:bugprone-narrowing-conversions:include/web/api_timing.h:054f4f2a2583f814","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-narrowing-conversions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"include/web/api_timing.h","line":31,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-4505cfde8bb2e42a","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/core/authorization.c:4505cfde8bb2e42a","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"internal","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/core/authorization.c","line":170,"revision":"1b8d4332"},"owner":"maintainers/core","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-c4536c7eb269c97d","fingerprint":"clang-tidy:clang-analyzer-security.ArrayBound:src/core/authorization.c:c4536c7eb269c97d","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-security.ArrayBound","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"internal","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/core/authorization.c","line":212,"revision":"1b8d4332"},"owner":"maintainers/core","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-dc57edf3e0b50ae4","fingerprint":"clang-tidy:clang-analyzer-security.ArrayBound:src/core/authorization.c:dc57edf3e0b50ae4","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-security.ArrayBound","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"internal","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/core/authorization.c","line":251,"revision":"1b8d4332"},"owner":"maintainers/core","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-ff0e443bb0b29339","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/core/authorization.c:ff0e443bb0b29339","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"internal","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/core/authorization.c","line":265,"revision":"1b8d4332"},"owner":"maintainers/core","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-3a7569f24a5603a4","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/core/camera_collection_filter.c:3a7569f24a5603a4","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"internal","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/core/camera_collection_filter.c","line":132,"revision":"1b8d4332"},"owner":"maintainers/core","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-54a9eba3b05f0872","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/core/camera_collection_filter.c:54a9eba3b05f0872","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"internal","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/core/camera_collection_filter.c","line":145,"revision":"1b8d4332"},"owner":"maintainers/core","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-a918c6008bfe9234","fingerprint":"clang-tidy:clang-analyzer-core.NonNullParamChecker:src/core/camera_collection_filter.c:a918c6008bfe9234","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-core.NonNullParamChecker","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"internal","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/core/camera_collection_filter.c","line":152,"revision":"1b8d4332"},"owner":"maintainers/core","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-a221992baafec96f","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/core/camera_collection_filter.c:a221992baafec96f","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"internal","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/core/camera_collection_filter.c","line":195,"revision":"1b8d4332"},"owner":"maintainers/core","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-8e1debc0e42f328a","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/core/camera_selector.c:8e1debc0e42f328a","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"internal","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/core/camera_selector.c","line":99,"revision":"1b8d4332"},"owner":"maintainers/core","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-1fb6fbd990b73e55","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/core/camera_selector.c:1fb6fbd990b73e55","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"internal","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/core/camera_selector.c","line":100,"revision":"1b8d4332"},"owner":"maintainers/core","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-52e7ee5b7b20725e","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/core/camera_selector.c:52e7ee5b7b20725e","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"internal","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/core/camera_selector.c","line":114,"revision":"1b8d4332"},"owner":"maintainers/core","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-a816d3388754e9a3","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/core/camera_selector.c:a816d3388754e9a3","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"internal","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/core/camera_selector.c","line":182,"revision":"1b8d4332"},"owner":"maintainers/core","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-bdf2049affa5a3fd","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/core/camera_selector.c:bdf2049affa5a3fd","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"internal","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/core/camera_selector.c","line":203,"revision":"1b8d4332"},"owner":"maintainers/core","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-946781b07a8a19f6","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/core/camera_selector.c:946781b07a8a19f6","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"internal","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/core/camera_selector.c","line":229,"revision":"1b8d4332"},"owner":"maintainers/core","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-73322317a31f8bcc","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/core/event_bus.c:73322317a31f8bcc","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"internal","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/core/event_bus.c","line":204,"revision":"1b8d4332"},"owner":"maintainers/core","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-dbe8bf00e4b146ee","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/core/event_bus.c:dbe8bf00e4b146ee","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"internal","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/core/event_bus.c","line":205,"revision":"1b8d4332"},"owner":"maintainers/core","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-2fcad01867c4b146","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/core/event_envelope.c:2fcad01867c4b146","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"internal","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/core/event_envelope.c","line":292,"revision":"1b8d4332"},"owner":"maintainers/core","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-f240093f03b567fb","fingerprint":"clang-tidy:clang-analyzer-core.NullDereference:src/core/event_envelope.c:f240093f03b567fb","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-core.NullDereference","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"internal","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/core/event_envelope.c","line":407,"revision":"1b8d4332"},"owner":"maintainers/core","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-51ab98673b990b2c","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/core/event_envelope.c:51ab98673b990b2c","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"internal","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/core/event_envelope.c","line":830,"revision":"1b8d4332"},"owner":"maintainers/core","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-a48d8d980b8dbfcc","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/core/event_envelope.c:a48d8d980b8dbfcc","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"internal","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/core/event_envelope.c","line":952,"revision":"1b8d4332"},"owner":"maintainers/core","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-767515747827ef14","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/core/event_router.c:767515747827ef14","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"internal","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/core/event_router.c","line":213,"revision":"1b8d4332"},"owner":"maintainers/core","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-ff30996a0be1b3ef","fingerprint":"clang-tidy:clang-analyzer-security.ArrayBound:src/core/logger_json.c:ff30996a0be1b3ef","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-security.ArrayBound","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"internal","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/core/logger_json.c","line":258,"revision":"1b8d4332"},"owner":"maintainers/core","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-470e897ffa76864e","fingerprint":"clang-tidy:clang-analyzer-security.ArrayBound:src/core/main.c:470e897ffa76864e","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-security.ArrayBound","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"internal","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/core/main.c","line":362,"revision":"1b8d4332"},"owner":"maintainers/core","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-ced78137a6871fda","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/core/mqtt_delivery_worker.c:ced78137a6871fda","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: outbound MQTT","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/core/mqtt_delivery_worker.c","line":468,"revision":"1b8d4332"},"owner":"maintainers/core","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-d7edea27d80824ed","fingerprint":"clang-tidy:bugprone-not-null-terminated-result:src/core/mqtt_destination_client.c:d7edea27d80824ed","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-not-null-terminated-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: outbound MQTT","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/core/mqtt_destination_client.c","line":163,"revision":"1b8d4332"},"owner":"maintainers/core","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-dda225859c807d72","fingerprint":"clang-tidy:bugprone-narrowing-conversions:src/core/path_utils.c:dda225859c807d72","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-narrowing-conversions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"internal","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/core/path_utils.c","line":23,"revision":"1b8d4332"},"owner":"maintainers/core","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-d86514e7015dbd70","fingerprint":"clang-tidy:clang-analyzer-core.UndefinedBinaryOperatorResult:src/core/path_utils.c:d86514e7015dbd70","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-core.UndefinedBinaryOperatorResult","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"internal","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/core/path_utils.c","line":224,"revision":"1b8d4332"},"owner":"maintainers/core","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-7bff304a77769e6c","fingerprint":"clang-tidy:bugprone-misplaced-widening-cast:src/database/db_fleet_query.c:7bff304a77769e6c","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-misplaced-widening-cast","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/database/db_fleet_query.c","line":297,"revision":"1b8d4332"},"owner":"maintainers/database","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-f8203edcc8863cd8","fingerprint":"clang-tidy:clang-analyzer-core.NullDereference:src/database/db_live_saved_layouts.c:f8203edcc8863cd8","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-core.NullDereference","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/database/db_live_saved_layouts.c","line":76,"revision":"1b8d4332"},"owner":"maintainers/database","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-4ce72e7a43d0bcce","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/database/db_operator_floor_plans.c:4ce72e7a43d0bcce","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/database/db_operator_floor_plans.c","line":71,"revision":"1b8d4332"},"owner":"maintainers/database","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-39f0ad6017069f02","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/database/db_storage_lifecycle.c:39f0ad6017069f02","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/database/db_storage_lifecycle.c","line":312,"revision":"1b8d4332"},"owner":"maintainers/database","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-c666354bdbc1df4b","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/database/db_storage_lifecycle.c:c666354bdbc1df4b","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/database/db_storage_lifecycle.c","line":316,"revision":"1b8d4332"},"owner":"maintainers/database","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-c8b906651c5b2c7f","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/database/db_storage_lifecycle.c:c8b906651c5b2c7f","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/database/db_storage_lifecycle.c","line":329,"revision":"1b8d4332"},"owner":"maintainers/database","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-8a2d068dc3e8b0c0","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/database/db_storage_lifecycle.c:8a2d068dc3e8b0c0","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/database/db_storage_lifecycle.c","line":329,"revision":"1b8d4332"},"owner":"maintainers/database","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-ad7afdbd70ca0a46","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/database/db_storage_lifecycle.c:ad7afdbd70ca0a46","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/database/db_storage_lifecycle.c","line":338,"revision":"1b8d4332"},"owner":"maintainers/database","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-76e54a4e3ac5efb3","fingerprint":"clang-tidy:bugprone-narrowing-conversions:src/database/db_storage_lifecycle.c:76e54a4e3ac5efb3","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-narrowing-conversions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/database/db_storage_lifecycle.c","line":579,"revision":"1b8d4332"},"owner":"maintainers/database","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-84fbbd387f95947a","fingerprint":"clang-tidy:bugprone-narrowing-conversions:src/database/db_storage_lifecycle.c:84fbbd387f95947a","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-narrowing-conversions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/database/db_storage_lifecycle.c","line":580,"revision":"1b8d4332"},"owner":"maintainers/database","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-a5ab5fe6add78d8e","fingerprint":"clang-tidy:clang-analyzer-core.NonNullParamChecker:src/database/db_storage_policies.c:a5ab5fe6add78d8e","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-core.NonNullParamChecker","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/database/db_storage_policies.c","line":47,"revision":"1b8d4332"},"owner":"maintainers/database","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-179513c629f1ecac","fingerprint":"clang-tidy:clang-analyzer-core.NullDereference:src/database/db_storage_policies.c:179513c629f1ecac","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-core.NullDereference","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/database/db_storage_policies.c","line":509,"revision":"1b8d4332"},"owner":"maintainers/database","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-b7cb62f9287bca53","fingerprint":"clang-tidy:clang-analyzer-core.DivideZero:src/database/db_storage_pools.c:b7cb62f9287bca53","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-core.DivideZero","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/database/db_storage_pools.c","line":385,"revision":"1b8d4332"},"owner":"maintainers/database","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-709dbb22240f409f","fingerprint":"clang-tidy:bugprone-suspicious-string-compare:src/database/db_storage_targets.c:709dbb22240f409f","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-suspicious-string-compare","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/database/db_storage_targets.c","line":865,"revision":"1b8d4332"},"owner":"maintainers/database","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-d68060f1555ca324","fingerprint":"clang-tidy:bugprone-suspicious-string-compare:src/database/db_storage_targets.c:d68060f1555ca324","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-suspicious-string-compare","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/database/db_storage_targets.c","line":867,"revision":"1b8d4332"},"owner":"maintainers/database","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-b922ced0e34aacea","fingerprint":"clang-tidy:bugprone-suspicious-string-compare:src/database/db_storage_targets.c:b922ced0e34aacea","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-suspicious-string-compare","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/database/db_storage_targets.c","line":868,"revision":"1b8d4332"},"owner":"maintainers/database","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-295d32efbfee9145","fingerprint":"clang-tidy:bugprone-suspicious-string-compare:src/database/db_storage_targets.c:295d32efbfee9145","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-suspicious-string-compare","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/database/db_storage_targets.c","line":870,"revision":"1b8d4332"},"owner":"maintainers/database","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-808f26556ac98110","fingerprint":"clang-tidy:bugprone-assignment-in-if-condition:src/database/db_system_health_incidents.c:808f26556ac98110","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-assignment-in-if-condition","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/database/db_system_health_incidents.c","line":45,"revision":"1b8d4332"},"owner":"maintainers/database","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-7e1ce15fe947a21d","fingerprint":"clang-tidy:bugprone-assignment-in-if-condition:src/database/db_system_health_incidents.c:7e1ce15fe947a21d","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-assignment-in-if-condition","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/database/db_system_health_incidents.c","line":265,"revision":"1b8d4332"},"owner":"maintainers/database","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-fe8af642c27ce051","fingerprint":"clang-tidy:clang-analyzer-deadcode.DeadStores:src/database/db_system_health_incidents.c:fe8af642c27ce051","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-deadcode.DeadStores","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/database/db_system_health_incidents.c","line":531,"revision":"1b8d4332"},"owner":"maintainers/database","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-2772ec37ee463512","fingerprint":"clang-tidy:clang-analyzer-security.ArrayBound:src/database/sqlite_migrate.c:2772ec37ee463512","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-security.ArrayBound","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/database/sqlite_migrate.c","line":404,"revision":"1b8d4332"},"owner":"maintainers/database","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-56955e0bf792f087","fingerprint":"clang-tidy:bugprone-suspicious-string-compare:src/storage/storage_deletion.c:56955e0bf792f087","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-suspicious-string-compare","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_deletion.c","line":341,"revision":"1b8d4332"},"owner":"maintainers/storage","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-f15ef4cfb6675401","fingerprint":"clang-tidy:clang-analyzer-unix.Errno:src/storage/storage_migration.c:f15ef4cfb6675401","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-unix.Errno","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_migration.c","line":124,"revision":"1b8d4332"},"owner":"maintainers/storage","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-50703d3018f9bed5","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_migration.c:50703d3018f9bed5","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_migration.c","line":138,"revision":"1b8d4332"},"owner":"maintainers/storage","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-15fa53ad8b574808","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_migration.c:15fa53ad8b574808","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_migration.c","line":149,"revision":"1b8d4332"},"owner":"maintainers/storage","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-d8903761e409b32d","fingerprint":"clang-tidy:clang-analyzer-unix.Errno:src/storage/storage_migration.c:d8903761e409b32d","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-unix.Errno","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_migration.c","line":276,"revision":"1b8d4332"},"owner":"maintainers/storage","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-e5960a2d15356c27","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_migration.c:e5960a2d15356c27","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_migration.c","line":291,"revision":"1b8d4332"},"owner":"maintainers/storage","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-1fac122c6010eb36","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_migration.c:1fac122c6010eb36","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_migration.c","line":328,"revision":"1b8d4332"},"owner":"maintainers/storage","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-d6379e87cfa699fa","fingerprint":"clang-tidy:bugprone-suspicious-string-compare:src/storage/storage_migration.c:d6379e87cfa699fa","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-suspicious-string-compare","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_migration.c","line":575,"revision":"1b8d4332"},"owner":"maintainers/storage","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-789d9f9254afa1b1","fingerprint":"clang-tidy:bugprone-suspicious-string-compare:src/storage/storage_s3.c:789d9f9254afa1b1","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-suspicious-string-compare","category":"optional-feature","feature_flag":"ENABLE_S3_ARCHIVE","severity":{"tool":"warning","normalized":"low"},"exposure":"network: outbound S3","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_s3.c","line":113,"revision":"1b8d4332"},"owner":"maintainers/storage","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-612c846365824225","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:612c846365824225","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"optional-feature","feature_flag":"ENABLE_S3_ARCHIVE","severity":{"tool":"warning","normalized":"low"},"exposure":"network: outbound S3","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_s3.c","line":211,"revision":"1b8d4332"},"owner":"maintainers/storage","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-1e0ea76108754cd5","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:1e0ea76108754cd5","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"optional-feature","feature_flag":"ENABLE_S3_ARCHIVE","severity":{"tool":"warning","normalized":"low"},"exposure":"network: outbound S3","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_s3.c","line":351,"revision":"1b8d4332"},"owner":"maintainers/storage","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-2f98dec54b741594","fingerprint":"clang-tidy:bugprone-suspicious-string-compare:src/storage/storage_s3.c:2f98dec54b741594","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-suspicious-string-compare","category":"optional-feature","feature_flag":"ENABLE_S3_ARCHIVE","severity":{"tool":"warning","normalized":"low"},"exposure":"network: outbound S3","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_s3.c","line":359,"revision":"1b8d4332"},"owner":"maintainers/storage","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-ab4dc4b3768799ca","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:ab4dc4b3768799ca","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"optional-feature","feature_flag":"ENABLE_S3_ARCHIVE","severity":{"tool":"warning","normalized":"low"},"exposure":"network: outbound S3","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_s3.c","line":368,"revision":"1b8d4332"},"owner":"maintainers/storage","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-14f55668eaa243b0","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:14f55668eaa243b0","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"optional-feature","feature_flag":"ENABLE_S3_ARCHIVE","severity":{"tool":"warning","normalized":"low"},"exposure":"network: outbound S3","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_s3.c","line":424,"revision":"1b8d4332"},"owner":"maintainers/storage","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-852f97f8aacc5432","fingerprint":"clang-tidy:bugprone-suspicious-string-compare:src/storage/storage_s3.c:852f97f8aacc5432","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-suspicious-string-compare","category":"optional-feature","feature_flag":"ENABLE_S3_ARCHIVE","severity":{"tool":"warning","normalized":"low"},"exposure":"network: outbound S3","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_s3.c","line":436,"revision":"1b8d4332"},"owner":"maintainers/storage","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-fbf040917d8b6cf7","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:fbf040917d8b6cf7","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"optional-feature","feature_flag":"ENABLE_S3_ARCHIVE","severity":{"tool":"warning","normalized":"low"},"exposure":"network: outbound S3","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_s3.c","line":454,"revision":"1b8d4332"},"owner":"maintainers/storage","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-52dada64b4a6e625","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:52dada64b4a6e625","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"optional-feature","feature_flag":"ENABLE_S3_ARCHIVE","severity":{"tool":"warning","normalized":"low"},"exposure":"network: outbound S3","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_s3.c","line":485,"revision":"1b8d4332"},"owner":"maintainers/storage","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-d1d1cf8dcb7070f8","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:d1d1cf8dcb7070f8","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"optional-feature","feature_flag":"ENABLE_S3_ARCHIVE","severity":{"tool":"warning","normalized":"low"},"exposure":"network: outbound S3","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_s3.c","line":510,"revision":"1b8d4332"},"owner":"maintainers/storage","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-bfb7d2825452ce0c","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:bfb7d2825452ce0c","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"optional-feature","feature_flag":"ENABLE_S3_ARCHIVE","severity":{"tool":"warning","normalized":"low"},"exposure":"network: outbound S3","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_s3.c","line":545,"revision":"1b8d4332"},"owner":"maintainers/storage","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-842c6bb171a64e75","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:842c6bb171a64e75","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"optional-feature","feature_flag":"ENABLE_S3_ARCHIVE","severity":{"tool":"warning","normalized":"low"},"exposure":"network: outbound S3","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_s3.c","line":595,"revision":"1b8d4332"},"owner":"maintainers/storage","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-4a2a60d787933d7d","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:4a2a60d787933d7d","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"optional-feature","feature_flag":"ENABLE_S3_ARCHIVE","severity":{"tool":"warning","normalized":"low"},"exposure":"network: outbound S3","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_s3.c","line":617,"revision":"1b8d4332"},"owner":"maintainers/storage","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-ba57287cdb3eb096","fingerprint":"clang-tidy:bugprone-suspicious-string-compare:src/storage/storage_s3.c:ba57287cdb3eb096","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-suspicious-string-compare","category":"optional-feature","feature_flag":"ENABLE_S3_ARCHIVE","severity":{"tool":"warning","normalized":"low"},"exposure":"network: outbound S3","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_s3.c","line":618,"revision":"1b8d4332"},"owner":"maintainers/storage","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-a145bd05b0189193","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:a145bd05b0189193","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"optional-feature","feature_flag":"ENABLE_S3_ARCHIVE","severity":{"tool":"warning","normalized":"low"},"exposure":"network: outbound S3","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_s3.c","line":649,"revision":"1b8d4332"},"owner":"maintainers/storage","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-bfbbf95e2bedfe38","fingerprint":"clang-tidy:bugprone-suspicious-string-compare:src/storage/storage_s3.c:bfbbf95e2bedfe38","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-suspicious-string-compare","category":"optional-feature","feature_flag":"ENABLE_S3_ARCHIVE","severity":{"tool":"warning","normalized":"low"},"exposure":"network: outbound S3","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_s3.c","line":686,"revision":"1b8d4332"},"owner":"maintainers/storage","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-65cc9415acf1be4d","fingerprint":"clang-tidy:bugprone-suspicious-string-compare:src/storage/storage_s3.c:65cc9415acf1be4d","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-suspicious-string-compare","category":"optional-feature","feature_flag":"ENABLE_S3_ARCHIVE","severity":{"tool":"warning","normalized":"low"},"exposure":"network: outbound S3","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_s3.c","line":697,"revision":"1b8d4332"},"owner":"maintainers/storage","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-5561b78de6be772b","fingerprint":"clang-tidy:bugprone-suspicious-string-compare:src/storage/storage_s3.c:5561b78de6be772b","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-suspicious-string-compare","category":"optional-feature","feature_flag":"ENABLE_S3_ARCHIVE","severity":{"tool":"warning","normalized":"low"},"exposure":"network: outbound S3","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_s3.c","line":697,"revision":"1b8d4332"},"owner":"maintainers/storage","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-6b719694dd2640c7","fingerprint":"clang-tidy:bugprone-suspicious-string-compare:src/storage/storage_s3.c:6b719694dd2640c7","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-suspicious-string-compare","category":"optional-feature","feature_flag":"ENABLE_S3_ARCHIVE","severity":{"tool":"warning","normalized":"low"},"exposure":"network: outbound S3","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_s3.c","line":697,"revision":"1b8d4332"},"owner":"maintainers/storage","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-cb260984bd5750f8","fingerprint":"clang-tidy:clang-analyzer-core.NonNullParamChecker:src/storage/storage_s3.c:cb260984bd5750f8","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-core.NonNullParamChecker","category":"optional-feature","feature_flag":"ENABLE_S3_ARCHIVE","severity":{"tool":"warning","normalized":"medium"},"exposure":"network: outbound S3","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_s3.c","line":717,"revision":"1b8d4332"},"owner":"maintainers/storage","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-f72760acc6c09e16","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:f72760acc6c09e16","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"optional-feature","feature_flag":"ENABLE_S3_ARCHIVE","severity":{"tool":"warning","normalized":"low"},"exposure":"network: outbound S3","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_s3.c","line":729,"revision":"1b8d4332"},"owner":"maintainers/storage","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-0866b8e57f533141","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:0866b8e57f533141","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"optional-feature","feature_flag":"ENABLE_S3_ARCHIVE","severity":{"tool":"warning","normalized":"low"},"exposure":"network: outbound S3","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_s3.c","line":738,"revision":"1b8d4332"},"owner":"maintainers/storage","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-3a081de1dd30ebb2","fingerprint":"clang-tidy:bugprone-unsafe-functions,cert-msc24-c,cert-msc33-c:src/storage/storage_s3.c:3a081de1dd30ebb2","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-unsafe-functions,cert-msc24-c,cert-msc33-c","category":"optional-feature","feature_flag":"ENABLE_S3_ARCHIVE","severity":{"tool":"warning","normalized":"low"},"exposure":"network: outbound S3","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_s3.c","line":757,"revision":"1b8d4332"},"owner":"maintainers/storage","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-d08422316656b39c","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:d08422316656b39c","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"optional-feature","feature_flag":"ENABLE_S3_ARCHIVE","severity":{"tool":"warning","normalized":"low"},"exposure":"network: outbound S3","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_s3.c","line":758,"revision":"1b8d4332"},"owner":"maintainers/storage","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-d7c0ab1bf29a42a3","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:d7c0ab1bf29a42a3","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"optional-feature","feature_flag":"ENABLE_S3_ARCHIVE","severity":{"tool":"warning","normalized":"low"},"exposure":"network: outbound S3","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_s3.c","line":763,"revision":"1b8d4332"},"owner":"maintainers/storage","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-9613b39c2e0a1e4c","fingerprint":"clang-tidy:bugprone-inc-dec-in-conditions:src/storage/storage_source.c:9613b39c2e0a1e4c","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-inc-dec-in-conditions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_source.c","line":186,"revision":"1b8d4332"},"owner":"maintainers/storage","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-6a07b625f331b20e","fingerprint":"clang-tidy:bugprone-suspicious-string-compare:src/storage/storage_source.c:6a07b625f331b20e","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-suspicious-string-compare","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/storage/storage_source.c","line":187,"revision":"1b8d4332"},"owner":"maintainers/storage","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-eac1097bd3780c16","fingerprint":"clang-tidy:bugprone-branch-clone:src/telemetry/collectors/linux_cgroup.c:eac1097bd3780c16","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-branch-clone","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: host procfs/sysfs/cgroup","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/telemetry/collectors/linux_cgroup.c","line":448,"revision":"1b8d4332"},"owner":"maintainers/telemetry","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-9259d0adb44e3ab3","fingerprint":"clang-tidy:clang-analyzer-security.ArrayBound:src/telemetry/collectors/linux_network.c:9259d0adb44e3ab3","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-security.ArrayBound","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"local: host procfs/sysfs/cgroup","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/telemetry/collectors/linux_network.c","line":136,"revision":"1b8d4332"},"owner":"maintainers/telemetry","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-b38fd5e59ea07d0e","fingerprint":"clang-tidy:clang-analyzer-unix.Stream:src/telemetry/collectors/linux_network.c:b38fd5e59ea07d0e","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-unix.Stream","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"local: host procfs/sysfs/cgroup","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/telemetry/collectors/linux_network.c","line":238,"revision":"1b8d4332"},"owner":"maintainers/telemetry","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-ebeb3bd843bc6421","fingerprint":"clang-tidy:clang-analyzer-unix.Stream:src/telemetry/collectors/linux_network.c:ebeb3bd843bc6421","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-unix.Stream","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"local: host procfs/sysfs/cgroup","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/telemetry/collectors/linux_network.c","line":238,"revision":"1b8d4332"},"owner":"maintainers/telemetry","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-8d33cee7806f5d43","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/telemetry/collectors/linux_network.c:8d33cee7806f5d43","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: host procfs/sysfs/cgroup","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/telemetry/collectors/linux_network.c","line":361,"revision":"1b8d4332"},"owner":"maintainers/telemetry","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-02b18b5e0f4e3b93","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/telemetry/collectors/linux_network.c:02b18b5e0f4e3b93","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: host procfs/sysfs/cgroup","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/telemetry/collectors/linux_network.c","line":372,"revision":"1b8d4332"},"owner":"maintainers/telemetry","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-b84c577b6e369ac3","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/telemetry/collectors/linux_process.c:b84c577b6e369ac3","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: host procfs/sysfs/cgroup","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/telemetry/collectors/linux_process.c","line":131,"revision":"1b8d4332"},"owner":"maintainers/telemetry","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-8b66085f0250d8e1","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/telemetry/collectors/linux_process.c:8b66085f0250d8e1","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: host procfs/sysfs/cgroup","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/telemetry/collectors/linux_process.c","line":134,"revision":"1b8d4332"},"owner":"maintainers/telemetry","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-55f597a830e65b4d","fingerprint":"clang-tidy:clang-analyzer-security.ArrayBound:src/telemetry/collectors/linux_process.c:55f597a830e65b4d","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-security.ArrayBound","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"local: host procfs/sysfs/cgroup","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/telemetry/collectors/linux_process.c","line":212,"revision":"1b8d4332"},"owner":"maintainers/telemetry","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-eaf20c1f0de62870","fingerprint":"clang-tidy:clang-analyzer-security.ArrayBound:src/telemetry/collectors/linux_restart.c:eaf20c1f0de62870","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-security.ArrayBound","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"local: host procfs/sysfs/cgroup","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/telemetry/collectors/linux_restart.c","line":59,"revision":"1b8d4332"},"owner":"maintainers/telemetry","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-c05a923060c50809","fingerprint":"clang-tidy:clang-analyzer-security.ArrayBound:src/telemetry/collectors/linux_thermal.c:c05a923060c50809","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-security.ArrayBound","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"local: host procfs/sysfs/cgroup","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/telemetry/collectors/linux_thermal.c","line":92,"revision":"1b8d4332"},"owner":"maintainers/telemetry","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-30cd36651cb697e6","fingerprint":"clang-tidy:clang-analyzer-security.ArrayBound:src/telemetry/collectors/linux_thermal.c:30cd36651cb697e6","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-security.ArrayBound","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"local: host procfs/sysfs/cgroup","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/telemetry/collectors/linux_thermal.c","line":158,"revision":"1b8d4332"},"owner":"maintainers/telemetry","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-15838d8765a7623e","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/telemetry/collectors/linux_thermal.c:15838d8765a7623e","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: host procfs/sysfs/cgroup","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/telemetry/collectors/linux_thermal.c","line":474,"revision":"1b8d4332"},"owner":"maintainers/telemetry","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-df8a271dac7dc00c","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/telemetry/collectors/linux_thermal.c:df8a271dac7dc00c","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: host procfs/sysfs/cgroup","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/telemetry/collectors/linux_thermal.c","line":485,"revision":"1b8d4332"},"owner":"maintainers/telemetry","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-8a0289975bb00ddb","fingerprint":"clang-tidy:clang-analyzer-unix.BlockInCriticalSection:src/telemetry/health_helper_runner.c:8a0289975bb00ddb","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-unix.BlockInCriticalSection","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"local: host procfs/sysfs/cgroup","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/telemetry/health_helper_runner.c","line":68,"revision":"1b8d4332"},"owner":"maintainers/telemetry","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-c52ffccc8c0fb590","fingerprint":"clang-tidy:cert-err34-c:src/telemetry/providers/linux_device_map.c:c52ffccc8c0fb590","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"cert-err34-c","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: host procfs/sysfs/cgroup","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/telemetry/providers/linux_device_map.c","line":72,"revision":"1b8d4332"},"owner":"maintainers/telemetry","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-65ab86fae5fd2213","fingerprint":"clang-tidy:bugprone-not-null-terminated-result:src/telemetry/providers/linux_hardware.c:65ab86fae5fd2213","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-not-null-terminated-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: host procfs/sysfs/cgroup","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/telemetry/providers/linux_hardware.c","line":72,"revision":"1b8d4332"},"owner":"maintainers/telemetry","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-29fe00c504db3f7e","fingerprint":"clang-tidy:clang-analyzer-security.ArrayBound:src/telemetry/providers/linux_hardware.c:29fe00c504db3f7e","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-security.ArrayBound","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"local: host procfs/sysfs/cgroup","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/telemetry/providers/linux_hardware.c","line":102,"revision":"1b8d4332"},"owner":"maintainers/telemetry","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-93f7df7451e39223","fingerprint":"clang-tidy:clang-analyzer-security.ArrayBound:src/telemetry/providers/linux_hardware.c:93f7df7451e39223","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-security.ArrayBound","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"local: host procfs/sysfs/cgroup","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/telemetry/providers/linux_hardware.c","line":148,"revision":"1b8d4332"},"owner":"maintainers/telemetry","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-811ab08155776051","fingerprint":"clang-tidy:cert-err34-c:src/telemetry/providers/linux_hardware.c:811ab08155776051","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"cert-err34-c","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: host procfs/sysfs/cgroup","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/telemetry/providers/linux_hardware.c","line":309,"revision":"1b8d4332"},"owner":"maintainers/telemetry","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-33d1c32daba1778e","fingerprint":"clang-tidy:clang-analyzer-core.NullDereference:src/telemetry/providers/smartctl_provider.c:33d1c32daba1778e","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-core.NullDereference","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"local: host procfs/sysfs/cgroup","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/telemetry/providers/smartctl_provider.c","line":194,"revision":"1b8d4332"},"owner":"maintainers/telemetry","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-192595ad5f7437f2","fingerprint":"clang-tidy:clang-analyzer-security.ArrayBound:src/telemetry/system_health.c:192595ad5f7437f2","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-security.ArrayBound","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"local: host procfs/sysfs/cgroup","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/telemetry/system_health.c","line":765,"revision":"1b8d4332"},"owner":"maintainers/telemetry","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-9b21a14b97b3a15e","fingerprint":"clang-tidy:clang-analyzer-core.CallAndMessage:src/telemetry/system_health_policy.c:9b21a14b97b3a15e","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-core.CallAndMessage","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"local: host procfs/sysfs/cgroup","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/telemetry/system_health_policy.c","line":496,"revision":"1b8d4332"},"owner":"maintainers/telemetry","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-11d1a497d98b8490","fingerprint":"clang-tidy:cert-err34-c:src/tools/ffmpeg_rss_guard.c:11d1a497d98b8490","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"cert-err34-c","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: CLI tool","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/tools/ffmpeg_rss_guard.c","line":73,"revision":"1b8d4332"},"owner":"maintainers/tools","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-802a0570e39a96a6","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/tools/ffmpeg_rss_guard.c:802a0570e39a96a6","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: CLI tool","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/tools/ffmpeg_rss_guard.c","line":147,"revision":"1b8d4332"},"owner":"maintainers/tools","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-a072eb98578bd9cf","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/tools/ffmpeg_rss_guard.c:a072eb98578bd9cf","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: CLI tool","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/tools/ffmpeg_rss_guard.c","line":148,"revision":"1b8d4332"},"owner":"maintainers/tools","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-576d7acbaee5cef6","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/utils/lpr_crypto.c:576d7acbaee5cef6","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"internal","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/utils/lpr_crypto.c","line":25,"revision":"1b8d4332"},"owner":"maintainers/utils","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-ae25a6959341dd10","fingerprint":"clang-tidy:bugprone-macro-parentheses:src/video/api_detection.c:ae25a6959341dd10","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-macro-parentheses","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/api_detection.c","line":59,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-c34509f97f5eb3bf","fingerprint":"clang-tidy:bugprone-assignment-in-if-condition:src/video/api_detection.c:c34509f97f5eb3bf","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-assignment-in-if-condition","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/api_detection.c","line":656,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-6ac00b1420332d40","fingerprint":"clang-tidy:bugprone-assignment-in-if-condition:src/video/api_detection.c:6ac00b1420332d40","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-assignment-in-if-condition","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/api_detection.c","line":657,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-1848d1ca57216f44","fingerprint":"clang-tidy:bugprone-assignment-in-if-condition:src/video/api_detection.c:1848d1ca57216f44","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-assignment-in-if-condition","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/api_detection.c","line":658,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-be52eb80a1a9b4e2","fingerprint":"clang-tidy:bugprone-assignment-in-if-condition:src/video/api_detection.c:be52eb80a1a9b4e2","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-assignment-in-if-condition","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/api_detection.c","line":659,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-eadc49a35e808a77","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_api.c:eadc49a35e808a77","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/go2rtc/go2rtc_api.c","line":180,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-bdcbae59a275ce50","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_api.c:bdcbae59a275ce50","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/go2rtc/go2rtc_api.c","line":184,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-5582e7df3dd25730","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_api.c:5582e7df3dd25730","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/go2rtc/go2rtc_api.c","line":274,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-23826be3117b0a5e","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_api.c:23826be3117b0a5e","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/go2rtc/go2rtc_api.c","line":288,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-cac166160ef5ab94","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_api.c:cac166160ef5ab94","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/go2rtc/go2rtc_api.c","line":364,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-6eced00c619f459a","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_api.c:6eced00c619f459a","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/go2rtc/go2rtc_api.c","line":491,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-a35257b195053d18","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_api.c:a35257b195053d18","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/go2rtc/go2rtc_api.c","line":494,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-14fc6cb721e4ff46","fingerprint":"clang-tidy:clang-analyzer-core.NullDereference:src/video/go2rtc/go2rtc_api.c:14fc6cb721e4ff46","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-core.NullDereference","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"warning","normalized":"medium"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/go2rtc/go2rtc_api.c","line":782,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-9fbcc527095ebbbb","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_api.c:9fbcc527095ebbbb","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/go2rtc/go2rtc_api.c","line":904,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-c263543788ddaa36","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_api.c:c263543788ddaa36","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/go2rtc/go2rtc_api.c","line":1143,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-d06458b2bdfca56d","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_consumer.c:d06458b2bdfca56d","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/go2rtc/go2rtc_consumer.c","line":150,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-1592d34d4e3dc54c","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_integration.c:1592d34d4e3dc54c","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/go2rtc/go2rtc_integration.c","line":189,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-957e3e8e5e143726","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_integration.c:957e3e8e5e143726","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/go2rtc/go2rtc_integration.c","line":190,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-a7a71d348e2c49f5","fingerprint":"clang-tidy:cert-err34-c:src/video/go2rtc/go2rtc_integration.c:a7a71d348e2c49f5","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"cert-err34-c","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/go2rtc/go2rtc_integration.c","line":325,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-76ebb6a603073b54","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_integration.c:76ebb6a603073b54","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/go2rtc/go2rtc_integration.c","line":361,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-2c1116134a2ee5a3","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_integration.c:2c1116134a2ee5a3","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/go2rtc/go2rtc_integration.c","line":503,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-88fbdf8930f67549","fingerprint":"clang-tidy:clang-analyzer-deadcode.DeadStores:src/video/go2rtc/go2rtc_integration.c:88fbdf8930f67549","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-deadcode.DeadStores","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/go2rtc/go2rtc_integration.c","line":1334,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-0ce2e7833fc885fd","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_integration.c:0ce2e7833fc885fd","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/go2rtc/go2rtc_integration.c","line":2167,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-6eb7be7d5d4be88a","fingerprint":"clang-tidy:clang-analyzer-security.ArrayBound:src/video/go2rtc/go2rtc_process.c:6eb7be7d5d4be88a","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-security.ArrayBound","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"warning","normalized":"medium"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/go2rtc/go2rtc_process.c","line":95,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-41876b44c3442c4b","fingerprint":"clang-tidy:cert-err34-c:src/video/go2rtc/go2rtc_process.c:41876b44c3442c4b","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"cert-err34-c","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/go2rtc/go2rtc_process.c","line":248,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-3a3cc8c9282e0fb5","fingerprint":"clang-tidy:cert-err34-c:src/video/go2rtc/go2rtc_process.c:3a3cc8c9282e0fb5","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"cert-err34-c","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/go2rtc/go2rtc_process.c","line":291,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-43d0d5170d6a8434","fingerprint":"clang-tidy:cert-err34-c:src/video/go2rtc/go2rtc_process.c:43d0d5170d6a8434","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"cert-err34-c","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/go2rtc/go2rtc_process.c","line":2094,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-4e94aa9ff957dec6","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_snapshot.c:4e94aa9ff957dec6","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/go2rtc/go2rtc_snapshot.c","line":131,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-f6ddc3b14e23e020","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_stream.c:f6ddc3b14e23e020","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/go2rtc/go2rtc_stream.c","line":624,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-f70e12d3b12447f9","fingerprint":"clang-tidy:clang-analyzer-unix.StdCLibraryFunctions:src/video/hls/hls_cache_cleanup.c:f70e12d3b12447f9","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-unix.StdCLibraryFunctions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/hls/hls_cache_cleanup.c","line":35,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-e88c078f85b44a5e","fingerprint":"clang-tidy:clang-analyzer-security.ArrayBound:src/video/hls/hls_cache_cleanup.c:e88c078f85b44a5e","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-security.ArrayBound","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/hls/hls_cache_cleanup.c","line":52,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-48d30c8fb35cc9cd","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/video/hls/hls_cache_cleanup.c:48d30c8fb35cc9cd","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/hls/hls_cache_cleanup.c","line":83,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-1634947d8289644f","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/video/hls/hls_cache_cleanup.c:1634947d8289644f","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/hls/hls_cache_cleanup.c","line":100,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-cb9a5afe872113f7","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/video/hls/hls_cache_cleanup.c:cb9a5afe872113f7","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/hls/hls_cache_cleanup.c","line":105,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-098d117140abdf3a","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/video/hls/hls_cache_cleanup.c:098d117140abdf3a","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/hls/hls_cache_cleanup.c","line":105,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-81dd4bf2eb1bd4a8","fingerprint":"clang-tidy:clang-analyzer-unix.StdCLibraryFunctions:src/video/hls/hls_cache_cleanup.c:81dd4bf2eb1bd4a8","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-unix.StdCLibraryFunctions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/hls/hls_cache_cleanup.c","line":107,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-a89af13dd80ae187","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/video/hls/hls_cache_cleanup.c:a89af13dd80ae187","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/hls/hls_cache_cleanup.c","line":122,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-1728287dd1cfa5a4","fingerprint":"clang-tidy:clang-analyzer-unix.BlockInCriticalSection:src/video/hls/hls_unified_thread.c:1728287dd1cfa5a4","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-unix.BlockInCriticalSection","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/hls/hls_unified_thread.c","line":2949,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-848024a1059f9105","fingerprint":"clang-tidy:clang-analyzer-core.NullDereference:src/video/hls_writer.c:848024a1059f9105","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-core.NullDereference","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/hls_writer.c","line":366,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-c18dbfa67bfd519e","fingerprint":"clang-tidy:clang-analyzer-core.NullDereference:src/video/hls_writer.c:c18dbfa67bfd519e","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-core.NullDereference","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/hls_writer.c","line":555,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-27ac318897664d8a","fingerprint":"clang-tidy:clang-analyzer-deadcode.DeadStores:src/video/mp4_segment_recorder.c:27ac318897664d8a","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-deadcode.DeadStores","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/mp4_segment_recorder.c","line":1772,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-30c3f7edea8fbd8d","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/video/mp4_segment_recorder.c:30c3f7edea8fbd8d","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/mp4_segment_recorder.c","line":1860,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-d421e791a6b63cc9","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/video/mp4_writer_core.c:d421e791a6b63cc9","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/mp4_writer_core.c","line":64,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-c74d7d04edeb4ee2","fingerprint":"clang-tidy:bugprone-narrowing-conversions:src/video/mp4_writer_utils.c:c74d7d04edeb4ee2","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-narrowing-conversions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/mp4_writer_utils.c","line":92,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-c536433a0089e4b9","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/video/mp4_writer_utils.c:c536433a0089e4b9","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/mp4_writer_utils.c","line":805,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-4e34d6b524364f03","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/video/mp4_writer_utils.c:4e34d6b524364f03","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/mp4_writer_utils.c","line":805,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-a19387fbb98806ae","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/mp4_writer_utils.c:a19387fbb98806ae","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/mp4_writer_utils.c","line":1242,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-cb47dbd2bd0937a1","fingerprint":"clang-tidy:bugprone-narrowing-conversions:src/video/mp4_writer_utils.c:cb47dbd2bd0937a1","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-narrowing-conversions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/mp4_writer_utils.c","line":1244,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-6f7bee0a60d5152f","fingerprint":"clang-tidy:bugprone-narrowing-conversions:src/video/mp4_writer_utils.c:6f7bee0a60d5152f","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-narrowing-conversions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/mp4_writer_utils.c","line":1245,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-18362aef7fade326","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/onvif_detection.c:18362aef7fade326","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/onvif_detection.c","line":148,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-eade1f2d38582a47","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/onvif_detection.c:eade1f2d38582a47","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/onvif_detection.c","line":149,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-a6e1105b549e0cf0","fingerprint":"clang-tidy:cert-err34-c:src/video/onvif_detection.c:a6e1105b549e0cf0","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"cert-err34-c","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/onvif_detection.c","line":525,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-8b074e54e83681ff","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/onvif_detection.c:8b074e54e83681ff","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/onvif_detection.c","line":571,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-eb4e649dccdb530f","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/onvif_event.c:eb4e649dccdb530f","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/onvif_event.c","line":309,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-7d7d3a3c4f1824bd","fingerprint":"clang-tidy:clang-analyzer-deadcode.DeadStores:src/video/onvif_ptz.c:7d7d3a3c4f1824bd","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-deadcode.DeadStores","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/onvif_ptz.c","line":509,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-44c350a8b7e2fd4a","fingerprint":"clang-tidy:clang-analyzer-deadcode.DeadStores:src/video/recording_path.c:44c350a8b7e2fd4a","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-deadcode.DeadStores","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/recording_path.c","line":28,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-a7fa9aad275f9425","fingerprint":"clang-tidy:clang-analyzer-deadcode.DeadStores:src/video/recording_path.c:a7fa9aad275f9425","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-deadcode.DeadStores","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/recording_path.c","line":147,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-d6eef8565b934dd8","fingerprint":"clang-tidy:clang-analyzer-security.insecureAPI.strcpy:src/video/recording_transcode.c:d6eef8565b934dd8","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-security.insecureAPI.strcpy","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/recording_transcode.c","line":311,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-4976fee144691228","fingerprint":"clang-tidy:clang-analyzer-security.insecureAPI.strcpy:src/video/recording_transcode.c:4976fee144691228","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-security.insecureAPI.strcpy","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/recording_transcode.c","line":312,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-e1b115ce18cb0926","fingerprint":"clang-tidy:bugprone-narrowing-conversions:src/video/stream_frame_rate.c:e1b115ce18cb0926","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-narrowing-conversions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/stream_frame_rate.c","line":41,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-9bb912a1e3d2bf88","fingerprint":"clang-tidy:bugprone-narrowing-conversions:src/video/stream_frame_rate.c:9bb912a1e3d2bf88","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-narrowing-conversions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/stream_frame_rate.c","line":41,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-87fe5c4f9b2c4103","fingerprint":"clang-tidy:clang-analyzer-security.ArrayBound:src/video/stream_manager.c:87fe5c4f9b2c4103","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-security.ArrayBound","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/stream_manager.c","line":278,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-5dc4623d12ccf5b2","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/video/unified_detection_thread.c:5dc4623d12ccf5b2","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/unified_detection_thread.c","line":477,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-3853c804fd823d76","fingerprint":"clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_authorization.c:3853c804fd823d76","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-core.NullDereference","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_authorization.c","line":892,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-e903e0b58c1ab7fb","fingerprint":"clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_authorization.c:e903e0b58c1ab7fb","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-core.NullDereference","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_authorization.c","line":893,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-7037bcf50d8dd6e1","fingerprint":"clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_authorization.c:7037bcf50d8dd6e1","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-core.NullDereference","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_authorization.c","line":918,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-a03bd79d6040e625","fingerprint":"clang-tidy:bugprone-branch-clone:src/web/api_handlers_authorization.c:a03bd79d6040e625","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-branch-clone","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_authorization.c","line":1027,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-468c829b1cc867f5","fingerprint":"clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_authorization.c:468c829b1cc867f5","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-core.NullDereference","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_authorization.c","line":1499,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-5546a3c4710ffc07","fingerprint":"clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_authorization.c:5546a3c4710ffc07","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-core.NullDereference","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_authorization.c","line":1520,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-9c42b9e1d1f45117","fingerprint":"clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_authorization.c:9c42b9e1d1f45117","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-core.NullDereference","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_authorization.c","line":1612,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-b45db718e3e94b0d","fingerprint":"clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_authorization.c:b45db718e3e94b0d","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-core.NullDereference","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_authorization.c","line":1620,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-1f9c86e17ca383f9","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:1f9c86e17ca383f9","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_camera_collections.c","line":142,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-316e32d23b15b780","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:316e32d23b15b780","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_camera_collections.c","line":152,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-7464eb7864628fd1","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:7464eb7864628fd1","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_camera_collections.c","line":160,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-5e2b3b364d163173","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:5e2b3b364d163173","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_camera_collections.c","line":176,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-81fbfb962103b645","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:81fbfb962103b645","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_camera_collections.c","line":332,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-c41e983019497e88","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:c41e983019497e88","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_camera_collections.c","line":405,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-308b0349ef001b56","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:308b0349ef001b56","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_camera_collections.c","line":567,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-7a3f68ca1e19c9db","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:7a3f68ca1e19c9db","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_camera_collections.c","line":577,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-475d0f82a4e9b764","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:475d0f82a4e9b764","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_camera_collections.c","line":589,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-2276a7bff678cf41","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:2276a7bff678cf41","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_camera_collections.c","line":623,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-63c736995704d2d6","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:63c736995704d2d6","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_camera_collections.c","line":627,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-f5ac788b77f1417a","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:f5ac788b77f1417a","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_camera_collections.c","line":636,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-ae6a96ea4d41087d","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:ae6a96ea4d41087d","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_camera_collections.c","line":650,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-f617ccfb4cfc3cc2","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:f617ccfb4cfc3cc2","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_camera_collections.c","line":693,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-169001b0559c7bcb","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:169001b0559c7bcb","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_camera_collections.c","line":703,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-6bce10f282924906","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:6bce10f282924906","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_camera_collections.c","line":721,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-b6500f12e4ee30b7","fingerprint":"clang-tidy:clang-analyzer-security.ArrayBound:src/web/api_handlers_fleet.c:b6500f12e4ee30b7","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-security.ArrayBound","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_fleet.c","line":274,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-0b0bcefaf7a0b24f","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_fleet.c:0b0bcefaf7a0b24f","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_fleet.c","line":698,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-d8c6998c9398adf1","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_fleet.c:d8c6998c9398adf1","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_fleet.c","line":733,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-79ebe40a23b7323a","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_fleet.c:79ebe40a23b7323a","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_fleet.c","line":742,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-6da59a8629d16699","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_fleet.c:6da59a8629d16699","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_fleet.c","line":771,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-773e04e041de5410","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_fleet.c:773e04e041de5410","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_fleet.c","line":786,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-f12d6e4a615966e9","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_fleet.c:f12d6e4a615966e9","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_fleet.c","line":805,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-dc1d8989b6dc0f0a","fingerprint":"clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_fleet.c:dc1d8989b6dc0f0a","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-core.NullDereference","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_fleet.c","line":816,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-a01b119b5b6a4463","fingerprint":"clang-tidy:clang-analyzer-security.ArrayBound:src/web/api_handlers_fleet.c:a01b119b5b6a4463","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-security.ArrayBound","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_fleet.c","line":816,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-ede4da279d79ec69","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_fleet.c:ede4da279d79ec69","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_fleet.c","line":820,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-36c8164a04c2420c","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_fleet.c:36c8164a04c2420c","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_fleet.c","line":835,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-4053884d5188ab2f","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_fleet.c:4053884d5188ab2f","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_fleet.c","line":850,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-ab5e571ba64af645","fingerprint":"clang-tidy:cert-err34-c:src/web/api_handlers_go2rtc_proxy.c:ab5e571ba64af645","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"cert-err34-c","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_go2rtc_proxy.c","line":203,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-4c710ebaa0f3ef18","fingerprint":"clang-tidy:clang-analyzer-security.insecureAPI.strcpy:src/web/api_handlers_go2rtc_proxy.c:4c710ebaa0f3ef18","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-security.insecureAPI.strcpy","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_go2rtc_proxy.c","line":259,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-e7f2b500346b1db4","fingerprint":"clang-tidy:clang-analyzer-security.insecureAPI.strcpy:src/web/api_handlers_go2rtc_proxy.c:e7f2b500346b1db4","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-security.insecureAPI.strcpy","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_go2rtc_proxy.c","line":264,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-59d7e244d1294daa","fingerprint":"clang-tidy:clang-analyzer-security.insecureAPI.strcpy:src/web/api_handlers_go2rtc_proxy.c:59d7e244d1294daa","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-security.insecureAPI.strcpy","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_go2rtc_proxy.c","line":293,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-de5c9750f9e973f2","fingerprint":"clang-tidy:clang-analyzer-security.insecureAPI.strcpy:src/web/api_handlers_go2rtc_proxy.c:de5c9750f9e973f2","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-security.insecureAPI.strcpy","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_go2rtc_proxy.c","line":332,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-18224b07c8f96008","fingerprint":"clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_health.c:18224b07c8f96008","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-core.NullDereference","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_health.c","line":367,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-cf5f09b5a02a9bca","fingerprint":"clang-tidy:clang-analyzer-deadcode.DeadStores:src/web/api_handlers_health.c:cf5f09b5a02a9bca","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-deadcode.DeadStores","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_health.c","line":407,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-6829e02764d9d278","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/api_handlers_investigations.c:6829e02764d9d278","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_investigations.c","line":259,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-113735d7300e4f01","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/api_handlers_investigations.c:113735d7300e4f01","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_investigations.c","line":496,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-25b00beae5a3f4a8","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/api_handlers_investigations.c:25b00beae5a3f4a8","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_investigations.c","line":693,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-e5ec24184e5b758c","fingerprint":"clang-tidy:cert-err34-c:src/web/api_handlers_investigations.c:e5ec24184e5b758c","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"cert-err34-c","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_investigations.c","line":1019,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-2387b22f15e219d3","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/api_handlers_investigations.c:2387b22f15e219d3","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_investigations.c","line":1131,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-36ab8111fbec813b","fingerprint":"clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_lpr.c:36ab8111fbec813b","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-core.NullDereference","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_lpr.c","line":32,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-0818b8d62b6628c5","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/api_handlers_lpr.c:0818b8d62b6628c5","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_lpr.c","line":62,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-21f4fa94b0f2d17d","fingerprint":"clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_lpr.c:21f4fa94b0f2d17d","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-core.NullDereference","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_lpr.c","line":150,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-02365646d53a2c50","fingerprint":"clang-tidy:bugprone-assignment-in-if-condition:src/web/api_handlers_metrics.c:02365646d53a2c50","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-assignment-in-if-condition","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_metrics.c","line":1284,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-a219d74f760de10e","fingerprint":"clang-tidy:bugprone-assignment-in-if-condition:src/web/api_handlers_metrics.c:a219d74f760de10e","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-assignment-in-if-condition","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_metrics.c","line":1286,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-96f8eef93ec11127","fingerprint":"clang-tidy:bugprone-assignment-in-if-condition:src/web/api_handlers_metrics.c:96f8eef93ec11127","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-assignment-in-if-condition","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_metrics.c","line":1288,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-221d97bd8b8ca157","fingerprint":"clang-tidy:bugprone-assignment-in-if-condition:src/web/api_handlers_metrics.c:221d97bd8b8ca157","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-assignment-in-if-condition","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_metrics.c","line":1290,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-b6b7c0de32a0c6b7","fingerprint":"clang-tidy:bugprone-assignment-in-if-condition:src/web/api_handlers_metrics.c:b6b7c0de32a0c6b7","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-assignment-in-if-condition","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_metrics.c","line":1292,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-4edbb01e2c9075ed","fingerprint":"clang-tidy:bugprone-assignment-in-if-condition:src/web/api_handlers_metrics.c:4edbb01e2c9075ed","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-assignment-in-if-condition","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_metrics.c","line":1294,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-ec9cd5d6ab7a3d6e","fingerprint":"clang-tidy:bugprone-assignment-in-if-condition:src/web/api_handlers_metrics.c:ec9cd5d6ab7a3d6e","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-assignment-in-if-condition","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_metrics.c","line":1296,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-2f30db61a3888f56","fingerprint":"clang-tidy:bugprone-assignment-in-if-condition:src/web/api_handlers_metrics.c:2f30db61a3888f56","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-assignment-in-if-condition","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_metrics.c","line":1298,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-53e88d8983baf290","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/api_handlers_operator_floor_plans.c:53e88d8983baf290","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_operator_floor_plans.c","line":395,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-dbd6a5de3a7e191c","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/api_handlers_operator_floor_plans.c:dbd6a5de3a7e191c","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_operator_floor_plans.c","line":995,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-e722e2369c13444f","fingerprint":"clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_recording_control.c:e722e2369c13444f","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-core.NullDereference","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_recording_control.c","line":153,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-0cc9a9ea64babfdc","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_retention.c:0cc9a9ea64babfdc","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_retention.c","line":418,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-234cb88ea5651731","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_retention.c:234cb88ea5651731","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_retention.c","line":427,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-67d853afc9b7eefe","fingerprint":"clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_retention.c:67d853afc9b7eefe","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-core.NullDereference","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_retention.c","line":532,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-88f84938e1b8feb0","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/api_handlers_storage.c:88f84938e1b8feb0","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_storage.c","line":72,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-6a756d858b2a4590","fingerprint":"clang-tidy:bugprone-narrowing-conversions:src/web/api_handlers_storage_compliance.c:6a756d858b2a4590","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-narrowing-conversions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_storage_compliance.c","line":80,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-0f6724ca27b42ed9","fingerprint":"clang-tidy:bugprone-narrowing-conversions:src/web/api_handlers_storage_compliance.c:0f6724ca27b42ed9","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-narrowing-conversions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_storage_compliance.c","line":82,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-ec3e72154d735330","fingerprint":"clang-tidy:bugprone-narrowing-conversions:src/web/api_handlers_storage_compliance.c:ec3e72154d735330","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-narrowing-conversions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_storage_compliance.c","line":84,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-e85c88c08460d2ef","fingerprint":"clang-tidy:bugprone-narrowing-conversions:src/web/api_handlers_storage_compliance.c:e85c88c08460d2ef","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-narrowing-conversions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_storage_compliance.c","line":85,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-9c90ce2f531301e0","fingerprint":"clang-tidy:bugprone-narrowing-conversions:src/web/api_handlers_storage_compliance.c:9c90ce2f531301e0","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-narrowing-conversions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_storage_compliance.c","line":182,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-3e6ff569aac7699e","fingerprint":"clang-tidy:bugprone-narrowing-conversions:src/web/api_handlers_storage_compliance.c:3e6ff569aac7699e","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-narrowing-conversions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_storage_compliance.c","line":183,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-ca4b8a2f2a2f60bf","fingerprint":"clang-tidy:bugprone-narrowing-conversions:src/web/api_handlers_storage_compliance.c:ca4b8a2f2a2f60bf","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-narrowing-conversions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_storage_compliance.c","line":183,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-c990523bb862f2b6","fingerprint":"clang-tidy:bugprone-narrowing-conversions:src/web/api_handlers_storage_compliance.c:c990523bb862f2b6","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-narrowing-conversions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_storage_compliance.c","line":190,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-7a5a584e25342a04","fingerprint":"clang-tidy:bugprone-narrowing-conversions:src/web/api_handlers_storage_compliance.c:7a5a584e25342a04","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-narrowing-conversions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_storage_compliance.c","line":191,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-8d9dd908cb4d8452","fingerprint":"clang-tidy:bugprone-narrowing-conversions:src/web/api_handlers_storage_compliance.c:8d9dd908cb4d8452","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-narrowing-conversions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_storage_compliance.c","line":191,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-44c26e7cc4f14d25","fingerprint":"clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_storage_migrations.c:44c26e7cc4f14d25","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-core.NullDereference","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_storage_migrations.c","line":202,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-7f68b57abf95cdae","fingerprint":"clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_storage_migrations.c:7f68b57abf95cdae","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-core.NullDereference","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_storage_migrations.c","line":206,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-312e6eafc5ebdca6","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_storage_policies.c:312e6eafc5ebdca6","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_storage_policies.c","line":479,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-1985156ff8e5c87d","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_storage_policies.c:1985156ff8e5c87d","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_storage_policies.c","line":487,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-ca7e963b9f3e3214","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_storage_policies.c:ca7e963b9f3e3214","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_storage_policies.c","line":498,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-aede9d1024b66426","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_storage_policies.c:aede9d1024b66426","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_storage_policies.c","line":516,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-07c63776b48ad48f","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_storage_policies.c:07c63776b48ad48f","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_storage_policies.c","line":532,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-ea16598ca26b9108","fingerprint":"clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_storage_policies.c:ea16598ca26b9108","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-multi-level-implicit-pointer-conversion","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_storage_policies.c","line":643,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-d562d8dbfbb1dcc3","fingerprint":"clang-tidy:clang-analyzer-security.ArrayBound:src/web/api_handlers_streams_get.c:d562d8dbfbb1dcc3","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-security.ArrayBound","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_streams_get.c","line":344,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-24b2873ab4fb113e","fingerprint":"clang-tidy:clang-analyzer-security.ArrayBound:src/web/api_handlers_streams_get.c:24b2873ab4fb113e","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-security.ArrayBound","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_streams_get.c","line":344,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-2b9b559954a51bc7","fingerprint":"clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_streams_get.c:2b9b559954a51bc7","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-core.NullDereference","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_streams_get.c","line":358,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-3ac69a72123df761","fingerprint":"clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_streams_modify.c:3ac69a72123df761","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-core.NullDereference","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_streams_modify.c","line":529,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-4f6abbd42f9a1855","fingerprint":"clang-tidy:clang-analyzer-security.ArrayBound:src/web/api_handlers_system.c:4f6abbd42f9a1855","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-security.ArrayBound","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_system.c","line":192,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-c7df8f3cce68c5a4","fingerprint":"clang-tidy:clang-analyzer-security.ArrayBound:src/web/api_handlers_system.c:c7df8f3cce68c5a4","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-security.ArrayBound","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_system.c","line":193,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-101a7d6e0cfda715","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/api_handlers_system_go2rtc.c:101a7d6e0cfda715","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_system_go2rtc.c","line":120,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-c586f58fa85c527e","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/api_handlers_system_go2rtc.c:c586f58fa85c527e","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_system_go2rtc.c","line":340,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-2eb8f8220e64672b","fingerprint":"clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_system_health.c:2eb8f8220e64672b","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-core.NullDereference","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_system_health.c","line":769,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-8935718b76906f1e","fingerprint":"clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_system_health.c:8935718b76906f1e","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-core.NullDereference","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_system_health.c","line":787,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-db6d4840afaa43ce","fingerprint":"clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_system_health.c:db6d4840afaa43ce","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-core.NullDereference","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_system_health.c","line":800,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-6253a319b7ed3b31","fingerprint":"clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_system_health.c:6253a319b7ed3b31","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"clang-analyzer-core.NullDereference","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"medium"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_system_health.c","line":810,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"exception_expiry_status":null,"evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-0fda904c59353043","fingerprint":"clang-tidy:cert-err34-c:src/web/api_handlers_system_logs.c:0fda904c59353043","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"cert-err34-c","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_system_logs.c","line":111,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-18895086ef6f0ed9","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/api_handlers_timeline.c:18895086ef6f0ed9","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_timeline.c","line":983,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-f1f70f55c95dfbaf","fingerprint":"clang-tidy:bugprone-branch-clone:src/web/api_handlers_timeline.c:f1f70f55c95dfbaf","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-branch-clone","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/api_handlers_timeline.c","line":1098,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-5bdf00371aedee4a","fingerprint":"clang-tidy:bugprone-branch-clone:src/web/audit_log.c:5bdf00371aedee4a","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-branch-clone","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/audit_log.c","line":599,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-6e45cad03ed5a9f3","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/go2rtc_websocket.c:6e45cad03ed5a9f3","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/go2rtc_websocket.c","line":142,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-82315a3f137f4aff","fingerprint":"clang-tidy:bugprone-assignment-in-if-condition:src/web/go2rtc_websocket.c:82315a3f137f4aff","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-assignment-in-if-condition","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/go2rtc_websocket.c","line":253,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-5c42b38e8a9c25ff","fingerprint":"clang-tidy:cert-err34-c:src/web/go2rtc_websocket.c:5c42b38e8a9c25ff","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"cert-err34-c","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/go2rtc_websocket.c","line":261,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-cb7511d8b0a3b651","fingerprint":"clang-tidy:bugprone-narrowing-conversions:src/web/httpd_utils.c:cb7511d8b0a3b651","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-narrowing-conversions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/httpd_utils.c","line":871,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-5bcac8af8164c1b0","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/recording_archive.c:5bcac8af8164c1b0","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/recording_archive.c","line":147,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-e2b358165654b79e","fingerprint":"clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/recording_archive.c:e2b358165654b79e","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-implicit-widening-of-multiplication-result","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/recording_archive.c","line":147,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-adf6edf7670e9010","fingerprint":"clang-tidy:bugprone-suspicious-string-compare:src/web/recording_archive.c:adf6edf7670e9010","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-suspicious-string-compare","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/recording_archive.c","line":201,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-ccff9a5b097b862e","fingerprint":"clang-tidy:bugprone-branch-clone:src/web/thumbnail_thread.c:ccff9a5b097b862e","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"bugprone-branch-clone","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: HTTP API / web server","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/web/thumbnail_thread.c","line":207,"revision":"1b8d4332"},"owner":"maintainers/web","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-b6947bb24c18c8ac","fingerprint":"clang-tidy:cert-int09-c:third_party/faac/include/faac.h:b6947bb24c18c8ac","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"cert-int09-c","category":"third-party","feature_flag":"third_party/faac (AAC encoder, default build)","severity":{"tool":"warning","normalized":"low"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"third_party/faac/include/faac.h","line":118,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-ddf685d0be472b86","fingerprint":"clang-tidy:cert-int09-c:third_party/faac/include/faac.h:ddf685d0be472b86","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"cert-int09-c","category":"third-party","feature_flag":"third_party/faac (AAC encoder, default build)","severity":{"tool":"warning","normalized":"low"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"third_party/faac/include/faac.h","line":126,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-296d5f7499179bc0","fingerprint":"clang-tidy:cert-int09-c:third_party/faac/include/faac.h:296d5f7499179bc0","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"cert-int09-c","category":"third-party","feature_flag":"third_party/faac (AAC encoder, default build)","severity":{"tool":"warning","normalized":"low"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"third_party/faac/include/faac.h","line":142,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CLANGTIDY-4c6957160cb5ae0c","fingerprint":"clang-tidy:cert-int09-c:third_party/faac/include/faac.h:4c6957160cb5ae0c","fingerprint_basis":"check+path+sha256(check|path|digit-normalized message|occurrence)","scanner_id":"clang-tidy","source_ref":{"workflow_run":41176542849,"artifact":"clang-tidy-report"},"rule_id":"cert-int09-c","category":"third-party","feature_flag":"third_party/faac (AAC encoder, default build)","severity":{"tool":"warning","normalized":"low"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"third_party/faac/include/faac.h","line":151,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"baseline-debt","exception_expiry":"2027-04-30","exception_expiry_status":"proposed-by-T1","evidence":"clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CPPCHECK-ac6f81ae03a685f3","fingerprint":"cppcheck:zerodivcond:include/sod/sod_img_reader.h:ac6f81ae03a685f3","fingerprint_basis":"id+path+sha256(id|path|digit-normalized msg|occurrence)","scanner_id":"cppcheck","source_ref":{"workflow_run":41176542849,"artifact":"cppcheck-reports"},"rule_id":"zerodivcond","cwe":"369","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"warning","normalized":"low"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"include/sod/sod_img_reader.h","line":1097,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"evidence":"cppcheck-report.xml from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CPPCHECK-582ed0e8d5a10fc1","fingerprint":"cppcheck:memleak:include/sod/sod_img_writer.h:582ed0e8d5a10fc1","fingerprint_basis":"id+path+sha256(id|path|digit-normalized msg|occurrence)","scanner_id":"cppcheck","source_ref":{"workflow_run":41176542849,"artifact":"cppcheck-reports"},"rule_id":"memleak","cwe":"401","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"error","normalized":"medium"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"include/sod/sod_img_writer.h","line":866,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"evidence":"cppcheck-report.xml from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CPPCHECK-38d664fd8e77f607","fingerprint":"cppcheck:nullPointerArithmeticRedundantCheck:include/sod/sod_img_writer.h:38d664fd8e77f607","fingerprint_basis":"id+path+sha256(id|path|digit-normalized msg|occurrence)","scanner_id":"cppcheck","source_ref":{"workflow_run":41176542849,"artifact":"cppcheck-reports"},"rule_id":"nullPointerArithmeticRedundantCheck","cwe":"682","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"warning","normalized":"low"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"include/sod/sod_img_writer.h","line":1022,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"evidence":"cppcheck-report.xml from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CPPCHECK-10a0fa2f24fefc90","fingerprint":"cppcheck:nullPointerRedundantCheck:include/sod/sod_img_writer.h:10a0fa2f24fefc90","fingerprint_basis":"id+path+sha256(id|path|digit-normalized msg|occurrence)","scanner_id":"cppcheck","source_ref":{"workflow_run":41176542849,"artifact":"cppcheck-reports"},"rule_id":"nullPointerRedundantCheck","cwe":"476","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"warning","normalized":"low"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"include/sod/sod_img_writer.h","line":1022,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"evidence":"cppcheck-report.xml from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CPPCHECK-3d1693ad77a15fa2","fingerprint":"cppcheck:nullPointerArithmeticRedundantCheck:include/sod/sod_img_writer.h:3d1693ad77a15fa2","fingerprint_basis":"id+path+sha256(id|path|digit-normalized msg|occurrence)","scanner_id":"cppcheck","source_ref":{"workflow_run":41176542849,"artifact":"cppcheck-reports"},"rule_id":"nullPointerArithmeticRedundantCheck","cwe":"682","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"warning","normalized":"low"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"include/sod/sod_img_writer.h","line":1023,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"evidence":"cppcheck-report.xml from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CPPCHECK-ffdd97ac6ebb6b4b","fingerprint":"cppcheck:nullPointerRedundantCheck:include/sod/sod_img_writer.h:ffdd97ac6ebb6b4b","fingerprint_basis":"id+path+sha256(id|path|digit-normalized msg|occurrence)","scanner_id":"cppcheck","source_ref":{"workflow_run":41176542849,"artifact":"cppcheck-reports"},"rule_id":"nullPointerRedundantCheck","cwe":"476","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"warning","normalized":"low"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"include/sod/sod_img_writer.h","line":1023,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"evidence":"cppcheck-report.xml from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CPPCHECK-3508a7db3ef7fc03","fingerprint":"cppcheck:nullPointerArithmeticRedundantCheck:include/sod/sod_img_writer.h:3508a7db3ef7fc03","fingerprint_basis":"id+path+sha256(id|path|digit-normalized msg|occurrence)","scanner_id":"cppcheck","source_ref":{"workflow_run":41176542849,"artifact":"cppcheck-reports"},"rule_id":"nullPointerArithmeticRedundantCheck","cwe":"682","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"warning","normalized":"low"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"include/sod/sod_img_writer.h","line":1024,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"evidence":"cppcheck-report.xml from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CPPCHECK-7dc87bf617f52146","fingerprint":"cppcheck:nullPointerRedundantCheck:include/sod/sod_img_writer.h:7dc87bf617f52146","fingerprint_basis":"id+path+sha256(id|path|digit-normalized msg|occurrence)","scanner_id":"cppcheck","source_ref":{"workflow_run":41176542849,"artifact":"cppcheck-reports"},"rule_id":"nullPointerRedundantCheck","cwe":"476","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"warning","normalized":"low"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"include/sod/sod_img_writer.h","line":1024,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"evidence":"cppcheck-report.xml from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CPPCHECK-ca79e52beb5f22bb","fingerprint":"cppcheck:nullPointerArithmeticRedundantCheck:include/sod/sod_img_writer.h:ca79e52beb5f22bb","fingerprint_basis":"id+path+sha256(id|path|digit-normalized msg|occurrence)","scanner_id":"cppcheck","source_ref":{"workflow_run":41176542849,"artifact":"cppcheck-reports"},"rule_id":"nullPointerArithmeticRedundantCheck","cwe":"682","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"warning","normalized":"low"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"include/sod/sod_img_writer.h","line":1044,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"evidence":"cppcheck-report.xml from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CPPCHECK-347fec696ca3fcab","fingerprint":"cppcheck:nullPointerRedundantCheck:include/sod/sod_img_writer.h:347fec696ca3fcab","fingerprint_basis":"id+path+sha256(id|path|digit-normalized msg|occurrence)","scanner_id":"cppcheck","source_ref":{"workflow_run":41176542849,"artifact":"cppcheck-reports"},"rule_id":"nullPointerRedundantCheck","cwe":"476","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"warning","normalized":"low"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"include/sod/sod_img_writer.h","line":1044,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"evidence":"cppcheck-report.xml from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CPPCHECK-5941fdb9ccb989f3","fingerprint":"cppcheck:nullPointerArithmeticRedundantCheck:include/sod/sod_img_writer.h:5941fdb9ccb989f3","fingerprint_basis":"id+path+sha256(id|path|digit-normalized msg|occurrence)","scanner_id":"cppcheck","source_ref":{"workflow_run":41176542849,"artifact":"cppcheck-reports"},"rule_id":"nullPointerArithmeticRedundantCheck","cwe":"682","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"warning","normalized":"low"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"include/sod/sod_img_writer.h","line":1045,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"evidence":"cppcheck-report.xml from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CPPCHECK-1980a8233237856a","fingerprint":"cppcheck:nullPointerRedundantCheck:include/sod/sod_img_writer.h:1980a8233237856a","fingerprint_basis":"id+path+sha256(id|path|digit-normalized msg|occurrence)","scanner_id":"cppcheck","source_ref":{"workflow_run":41176542849,"artifact":"cppcheck-reports"},"rule_id":"nullPointerRedundantCheck","cwe":"476","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"warning","normalized":"low"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"include/sod/sod_img_writer.h","line":1045,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"evidence":"cppcheck-report.xml from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CPPCHECK-a8a2fee09e04d7a2","fingerprint":"cppcheck:integerOverflow:src/core/config.c:a8a2fee09e04d7a2","fingerprint_basis":"id+path+sha256(id|path|digit-normalized msg|occurrence)","scanner_id":"cppcheck","source_ref":{"workflow_run":41176542849,"artifact":"cppcheck-reports"},"rule_id":"integerOverflow","cwe":"190","category":"application","feature_flag":null,"severity":{"tool":"error","normalized":"medium"},"exposure":"local: persistence/config","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/core/config.c","line":362,"revision":"1b8d4332"},"owner":"maintainers/core","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"evidence":"cppcheck-report.xml from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CPPCHECK-d14ab8cc9d321477","fingerprint":"cppcheck:memleak:src/sod/sod.c:d14ab8cc9d321477","fingerprint_basis":"id+path+sha256(id|path|digit-normalized msg|occurrence)","scanner_id":"cppcheck","source_ref":{"workflow_run":41176542849,"artifact":"cppcheck-reports"},"rule_id":"memleak","cwe":"401","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"error","normalized":"medium"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/sod/sod.c","line":8019,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"evidence":"cppcheck-report.xml from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CPPCHECK-7bc58272fe78e01c","fingerprint":"cppcheck:memleak:src/sod/sod.c:7bc58272fe78e01c","fingerprint_basis":"id+path+sha256(id|path|digit-normalized msg|occurrence)","scanner_id":"cppcheck","source_ref":{"workflow_run":41176542849,"artifact":"cppcheck-reports"},"rule_id":"memleak","cwe":"401","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"error","normalized":"medium"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/sod/sod.c","line":8019,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"evidence":"cppcheck-report.xml from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CPPCHECK-d1406d76ca075628","fingerprint":"cppcheck:memleak:src/sod/sod.c:d1406d76ca075628","fingerprint_basis":"id+path+sha256(id|path|digit-normalized msg|occurrence)","scanner_id":"cppcheck","source_ref":{"workflow_run":41176542849,"artifact":"cppcheck-reports"},"rule_id":"memleak","cwe":"401","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"error","normalized":"medium"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/sod/sod.c","line":8019,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"evidence":"cppcheck-report.xml from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CPPCHECK-187d49bac01afe0b","fingerprint":"cppcheck:memleak:src/sod/sod.c:187d49bac01afe0b","fingerprint_basis":"id+path+sha256(id|path|digit-normalized msg|occurrence)","scanner_id":"cppcheck","source_ref":{"workflow_run":41176542849,"artifact":"cppcheck-reports"},"rule_id":"memleak","cwe":"401","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"error","normalized":"medium"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/sod/sod.c","line":8019,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"evidence":"cppcheck-report.xml from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CPPCHECK-01d35c4f8b07a420","fingerprint":"cppcheck:memleak:src/sod/sod.c:01d35c4f8b07a420","fingerprint_basis":"id+path+sha256(id|path|digit-normalized msg|occurrence)","scanner_id":"cppcheck","source_ref":{"workflow_run":41176542849,"artifact":"cppcheck-reports"},"rule_id":"memleak","cwe":"401","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"error","normalized":"medium"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/sod/sod.c","line":8133,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"evidence":"cppcheck-report.xml from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CPPCHECK-7ed0f3ac85abfc0f","fingerprint":"cppcheck:memleak:src/sod/sod.c:7ed0f3ac85abfc0f","fingerprint_basis":"id+path+sha256(id|path|digit-normalized msg|occurrence)","scanner_id":"cppcheck","source_ref":{"workflow_run":41176542849,"artifact":"cppcheck-reports"},"rule_id":"memleak","cwe":"401","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"error","normalized":"medium"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/sod/sod.c","line":8133,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"evidence":"cppcheck-report.xml from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CPPCHECK-afd0bb6171ab9102","fingerprint":"cppcheck:memleak:src/sod/sod.c:afd0bb6171ab9102","fingerprint_basis":"id+path+sha256(id|path|digit-normalized msg|occurrence)","scanner_id":"cppcheck","source_ref":{"workflow_run":41176542849,"artifact":"cppcheck-reports"},"rule_id":"memleak","cwe":"401","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"error","normalized":"medium"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/sod/sod.c","line":8133,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"evidence":"cppcheck-report.xml from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CPPCHECK-6c275f8832cf9762","fingerprint":"cppcheck:memleak:src/sod/sod.c:6c275f8832cf9762","fingerprint_basis":"id+path+sha256(id|path|digit-normalized msg|occurrence)","scanner_id":"cppcheck","source_ref":{"workflow_run":41176542849,"artifact":"cppcheck-reports"},"rule_id":"memleak","cwe":"401","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"error","normalized":"medium"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/sod/sod.c","line":8133,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"evidence":"cppcheck-report.xml from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CPPCHECK-340c5f9dec875049","fingerprint":"cppcheck:memleak:src/sod/sod.c:340c5f9dec875049","fingerprint_basis":"id+path+sha256(id|path|digit-normalized msg|occurrence)","scanner_id":"cppcheck","source_ref":{"workflow_run":41176542849,"artifact":"cppcheck-reports"},"rule_id":"memleak","cwe":"401","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"error","normalized":"medium"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/sod/sod.c","line":8133,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"evidence":"cppcheck-report.xml from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CPPCHECK-94d7d3c523b01523","fingerprint":"cppcheck:memleak:src/sod/sod.c:94d7d3c523b01523","fingerprint_basis":"id+path+sha256(id|path|digit-normalized msg|occurrence)","scanner_id":"cppcheck","source_ref":{"workflow_run":41176542849,"artifact":"cppcheck-reports"},"rule_id":"memleak","cwe":"401","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"error","normalized":"medium"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/sod/sod.c","line":8133,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"evidence":"cppcheck-report.xml from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CPPCHECK-65f97e38c1e1c5df","fingerprint":"cppcheck:memleak:src/sod/sod.c:65f97e38c1e1c5df","fingerprint_basis":"id+path+sha256(id|path|digit-normalized msg|occurrence)","scanner_id":"cppcheck","source_ref":{"workflow_run":41176542849,"artifact":"cppcheck-reports"},"rule_id":"memleak","cwe":"401","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"error","normalized":"medium"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/sod/sod.c","line":8133,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"evidence":"cppcheck-report.xml from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CPPCHECK-377feb103d4c3b66","fingerprint":"cppcheck:memleak:src/sod/sod.c:377feb103d4c3b66","fingerprint_basis":"id+path+sha256(id|path|digit-normalized msg|occurrence)","scanner_id":"cppcheck","source_ref":{"workflow_run":41176542849,"artifact":"cppcheck-reports"},"rule_id":"memleak","cwe":"401","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"error","normalized":"medium"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/sod/sod.c","line":8133,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"evidence":"cppcheck-report.xml from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CPPCHECK-7975c2d572bc32c0","fingerprint":"cppcheck:invalidPointerCast:src/sod/sod.c:7975c2d572bc32c0","fingerprint_basis":"id+path+sha256(id|path|digit-normalized msg|occurrence)","scanner_id":"cppcheck","source_ref":{"workflow_run":41176542849,"artifact":"cppcheck-reports"},"rule_id":"invalidPointerCast","cwe":"704","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"portability","normalized":"low"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/sod/sod.c","line":13588,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"evidence":"cppcheck-report.xml from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CPPCHECK-291bebc3b95eca4e","fingerprint":"cppcheck:invalidPointerCast:src/sod/sod.c:291bebc3b95eca4e","fingerprint_basis":"id+path+sha256(id|path|digit-normalized msg|occurrence)","scanner_id":"cppcheck","source_ref":{"workflow_run":41176542849,"artifact":"cppcheck-reports"},"rule_id":"invalidPointerCast","cwe":"704","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"portability","normalized":"low"},"exposure":"third-party code linked into binary","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/sod/sod.c","line":13591,"revision":"1b8d4332"},"owner":"maintainers/third-party-integration","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"evidence":"cppcheck-report.xml from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CPPCHECK-e9cd8f29e136cbb8","fingerprint":"cppcheck:wrongPrintfScanfArgNum:src/telemetry/collectors/linux_thermal.c:e9cd8f29e136cbb8","fingerprint_basis":"id+path+sha256(id|path|digit-normalized msg|occurrence)","scanner_id":"cppcheck","source_ref":{"workflow_run":41176542849,"artifact":"cppcheck-reports"},"rule_id":"wrongPrintfScanfArgNum","cwe":"685","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"local: host procfs/sysfs/cgroup","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/telemetry/collectors/linux_thermal.c","line":45,"revision":"1b8d4332"},"owner":"maintainers/telemetry","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"evidence":"cppcheck-report.xml from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CPPCHECK-1c7b293c20ba8b3d","fingerprint":"cppcheck:preprocessorErrorDirective:src/telemetry/providers/nvme_provider.c:1c7b293c20ba8b3d","fingerprint_basis":"id+path+sha256(id|path|digit-normalized msg|occurrence)","scanner_id":"cppcheck","source_ref":{"workflow_run":41176542849,"artifact":"cppcheck-reports"},"rule_id":"preprocessorErrorDirective","cwe":null,"category":"application","feature_flag":null,"severity":{"tool":"error","normalized":"medium"},"exposure":"local: host procfs/sysfs/cgroup","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/telemetry/providers/nvme_provider.c","line":15,"revision":"1b8d4332"},"owner":"maintainers/telemetry","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"evidence":"cppcheck-report.xml from Static Analysis run 41176542849 @1b8d4332; preprocessor/config analysis error, likely tool limitation"}, + {"id":"CPPCHECK-1afeb1315d85ff61","fingerprint":"cppcheck:preprocessorErrorDirective:src/video/mp4_writer_utils.c:1afeb1315d85ff61","fingerprint_basis":"id+path+sha256(id|path|digit-normalized msg|occurrence)","scanner_id":"cppcheck","source_ref":{"workflow_run":41176542849,"artifact":"cppcheck-reports"},"rule_id":"preprocessorErrorDirective","cwe":null,"category":"application","feature_flag":null,"severity":{"tool":"error","normalized":"medium"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/mp4_writer_utils.c","line":1795,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"evidence":"cppcheck-report.xml from Static Analysis run 41176542849 @1b8d4332; preprocessor/config analysis error, likely tool limitation"}, + {"id":"CPPCHECK-1d3bfb4e5fc184fe","fingerprint":"cppcheck:arrayIndexOutOfBoundsCond:src/video/stream_protocol.c:1d3bfb4e5fc184fe","fingerprint_basis":"id+path+sha256(id|path|digit-normalized msg|occurrence)","scanner_id":"cppcheck","source_ref":{"workflow_run":41176542849,"artifact":"cppcheck-reports"},"rule_id":"arrayIndexOutOfBoundsCond","cwe":"788","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/stream_protocol.c","line":635,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"evidence":"cppcheck-report.xml from Static Analysis run 41176542849 @1b8d4332"}, + {"id":"CPPCHECK-0dfdce44e3f2c522","fingerprint":"cppcheck:arrayIndexOutOfBounds:src/video/stream_protocol.c:0dfdce44e3f2c522","fingerprint_basis":"id+path+sha256(id|path|digit-normalized msg|occurrence)","scanner_id":"cppcheck","source_ref":{"workflow_run":41176542849,"artifact":"cppcheck-reports"},"rule_id":"arrayIndexOutOfBounds","cwe":"788","category":"application","feature_flag":null,"severity":{"tool":"error","normalized":"medium"},"exposure":"network: camera/media input path","exposure_basis":"path heuristic; not yet triaged","location":{"path":"src/video/stream_protocol.c","line":637,"revision":"1b8d4332"},"owner":"maintainers/video","state_upstream":"reported","disposition":"needs-triage","exception_expiry":null,"evidence":"cppcheck-report.xml from Static Analysis run 41176542849 @1b8d4332"} + ], + "buckets": [ + {"id":"CPPCHECK-BUCKET-8bb35cef096bd68d","fingerprint":"cppcheck-bucket:arrayIndexThenCheck:include/sod/sod_img_writer.h","scanner_id":"cppcheck","rule_id":"arrayIndexThenCheck","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"style","normalized":"info"},"path":"include/sod/sod_img_writer.h","count":1,"owner":"maintainers/third-party-integration","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-1d212665be6abacf","fingerprint":"cppcheck-bucket:checkLevelNormal:src/core/config.c","scanner_id":"cppcheck","rule_id":"checkLevelNormal","category":"application","feature_flag":null,"severity":{"tool":"information","normalized":"info"},"path":"src/core/config.c","count":1,"owner":"maintainers/core","disposition":"informational","exception_expiry":null}, + {"id":"CPPCHECK-BUCKET-bf25cb222c0b2cec","fingerprint":"cppcheck-bucket:checkLevelNormal:src/core/main.c","scanner_id":"cppcheck","rule_id":"checkLevelNormal","category":"application","feature_flag":null,"severity":{"tool":"information","normalized":"info"},"path":"src/core/main.c","count":1,"owner":"maintainers/core","disposition":"informational","exception_expiry":null}, + {"id":"CPPCHECK-BUCKET-3b2a52c560d89f94","fingerprint":"cppcheck-bucket:checkLevelNormal:src/video/hls/hls_unified_thread.c","scanner_id":"cppcheck","rule_id":"checkLevelNormal","category":"application","feature_flag":null,"severity":{"tool":"information","normalized":"info"},"path":"src/video/hls/hls_unified_thread.c","count":1,"owner":"maintainers/video","disposition":"informational","exception_expiry":null}, + {"id":"CPPCHECK-BUCKET-2ae67633fb74b7c9","fingerprint":"cppcheck-bucket:checkLevelNormal:src/video/mp4_segment_recorder.c","scanner_id":"cppcheck","rule_id":"checkLevelNormal","category":"application","feature_flag":null,"severity":{"tool":"information","normalized":"info"},"path":"src/video/mp4_segment_recorder.c","count":1,"owner":"maintainers/video","disposition":"informational","exception_expiry":null}, + {"id":"CPPCHECK-BUCKET-c606b1ed76e58ccd","fingerprint":"cppcheck-bucket:checkLevelNormal:src/web/api_handlers_settings.c","scanner_id":"cppcheck","rule_id":"checkLevelNormal","category":"application","feature_flag":null,"severity":{"tool":"information","normalized":"info"},"path":"src/web/api_handlers_settings.c","count":1,"owner":"maintainers/web","disposition":"informational","exception_expiry":null}, + {"id":"CPPCHECK-BUCKET-d095c0f0e6168f4a","fingerprint":"cppcheck-bucket:checkLevelNormal:src/web/api_handlers_streams_modify.c","scanner_id":"cppcheck","rule_id":"checkLevelNormal","category":"application","feature_flag":null,"severity":{"tool":"information","normalized":"info"},"path":"src/web/api_handlers_streams_modify.c","count":1,"owner":"maintainers/web","disposition":"informational","exception_expiry":null}, + {"id":"CPPCHECK-BUCKET-d17837c5125ba58a","fingerprint":"cppcheck-bucket:checkersReport:","scanner_id":"cppcheck","rule_id":"checkersReport","category":"application","feature_flag":null,"severity":{"tool":"information","normalized":"info"},"path":"","count":1,"owner":"maintainers","disposition":"informational","exception_expiry":null}, + {"id":"CPPCHECK-BUCKET-7e66ded89b37cb4f","fingerprint":"cppcheck-bucket:constParameter:src/telemetry/collectors/linux_network.c","scanner_id":"cppcheck","rule_id":"constParameter","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/telemetry/collectors/linux_network.c","count":1,"owner":"maintainers/telemetry","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-c6d1df4e6770f40e","fingerprint":"cppcheck-bucket:constParameter:src/web/api_handlers_investigations.c","scanner_id":"cppcheck","rule_id":"constParameter","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/web/api_handlers_investigations.c","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-fb37582a72f59582","fingerprint":"cppcheck-bucket:constParameterCallback:include/sod/sod_img_reader.h","scanner_id":"cppcheck","rule_id":"constParameterCallback","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"style","normalized":"info"},"path":"include/sod/sod_img_reader.h","count":5,"owner":"maintainers/third-party-integration","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-c7b3ef530f996e26","fingerprint":"cppcheck-bucket:constParameterCallback:include/sod/sod_img_writer.h","scanner_id":"cppcheck","rule_id":"constParameterCallback","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"style","normalized":"info"},"path":"include/sod/sod_img_writer.h","count":1,"owner":"maintainers/third-party-integration","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-90ec02278e01bcac","fingerprint":"cppcheck-bucket:constParameterCallback:src/storage/storage_migration.c","scanner_id":"cppcheck","rule_id":"constParameterCallback","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/storage/storage_migration.c","count":1,"owner":"maintainers/storage","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-6291a48798ed350c","fingerprint":"cppcheck-bucket:constParameterCallback:src/utils/yaml_redact.c","scanner_id":"cppcheck","rule_id":"constParameterCallback","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/utils/yaml_redact.c","count":1,"owner":"maintainers/utils","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-681aedac30d87a1e","fingerprint":"cppcheck-bucket:constParameterCallback:src/video/api_detection.c","scanner_id":"cppcheck","rule_id":"constParameterCallback","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/video/api_detection.c","count":1,"owner":"maintainers/video","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-ee781b371da39bf5","fingerprint":"cppcheck-bucket:constParameterCallback:src/video/go2rtc/go2rtc_api.c","scanner_id":"cppcheck","rule_id":"constParameterCallback","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"style","normalized":"info"},"path":"src/video/go2rtc/go2rtc_api.c","count":2,"owner":"maintainers/video","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-dc056676c7084f53","fingerprint":"cppcheck-bucket:constParameterCallback:src/video/go2rtc/go2rtc_integration.c","scanner_id":"cppcheck","rule_id":"constParameterCallback","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"style","normalized":"info"},"path":"src/video/go2rtc/go2rtc_integration.c","count":1,"owner":"maintainers/video","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-0130dae8fb623afa","fingerprint":"cppcheck-bucket:constParameterCallback:src/video/go2rtc/go2rtc_snapshot.c","scanner_id":"cppcheck","rule_id":"constParameterCallback","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"style","normalized":"info"},"path":"src/video/go2rtc/go2rtc_snapshot.c","count":1,"owner":"maintainers/video","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-365ebbda46eacf74","fingerprint":"cppcheck-bucket:constParameterCallback:src/video/onvif_detection.c","scanner_id":"cppcheck","rule_id":"constParameterCallback","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/video/onvif_detection.c","count":1,"owner":"maintainers/video","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-8737ababcc06f484","fingerprint":"cppcheck-bucket:constParameterCallback:src/video/onvif_device_management.c","scanner_id":"cppcheck","rule_id":"constParameterCallback","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/video/onvif_device_management.c","count":1,"owner":"maintainers/video","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-baf28ba17bc25dd0","fingerprint":"cppcheck-bucket:constParameterCallback:src/video/onvif_imaging.c","scanner_id":"cppcheck","rule_id":"constParameterCallback","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/video/onvif_imaging.c","count":1,"owner":"maintainers/video","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-462bf13ae3867115","fingerprint":"cppcheck-bucket:constParameterCallback:src/video/onvif_ptz.c","scanner_id":"cppcheck","rule_id":"constParameterCallback","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/video/onvif_ptz.c","count":1,"owner":"maintainers/video","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-b6f82c4c9b287eba","fingerprint":"cppcheck-bucket:constParameterCallback:src/web/api_handlers_go2rtc_proxy.c","scanner_id":"cppcheck","rule_id":"constParameterCallback","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/web/api_handlers_go2rtc_proxy.c","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-c7a8e9a51802c60d","fingerprint":"cppcheck-bucket:constParameterCallback:src/web/api_handlers_health.c","scanner_id":"cppcheck","rule_id":"constParameterCallback","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/web/api_handlers_health.c","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-d3985740b2ac6585","fingerprint":"cppcheck-bucket:constParameterCallback:src/web/go2rtc_proxy_thread.c","scanner_id":"cppcheck","rule_id":"constParameterCallback","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/web/go2rtc_proxy_thread.c","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-82a085f0cc04468f","fingerprint":"cppcheck-bucket:constParameterPointer:include/sod/sod_img_reader.h","scanner_id":"cppcheck","rule_id":"constParameterPointer","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"style","normalized":"info"},"path":"include/sod/sod_img_reader.h","count":12,"owner":"maintainers/third-party-integration","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-27ab7ab1e74c2e72","fingerprint":"cppcheck-bucket:constParameterPointer:include/sod/sod_img_writer.h","scanner_id":"cppcheck","rule_id":"constParameterPointer","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"style","normalized":"info"},"path":"include/sod/sod_img_writer.h","count":7,"owner":"maintainers/third-party-integration","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-d0de2e4ac47c3191","fingerprint":"cppcheck-bucket:constParameterPointer:src/core/authorization.c","scanner_id":"cppcheck","rule_id":"constParameterPointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/core/authorization.c","count":1,"owner":"maintainers/core","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-fbb9e9402242eaba","fingerprint":"cppcheck-bucket:constParameterPointer:src/core/mqtt_destination_client.c","scanner_id":"cppcheck","rule_id":"constParameterPointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/core/mqtt_destination_client.c","count":2,"owner":"maintainers/core","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-fd8d6a4b8cc77400","fingerprint":"cppcheck-bucket:constParameterPointer:src/database/db_camera_collections.c","scanner_id":"cppcheck","rule_id":"constParameterPointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/database/db_camera_collections.c","count":1,"owner":"maintainers/database","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-43fcd9340a9e63ed","fingerprint":"cppcheck-bucket:constParameterPointer:src/ezxml/ezxml.c","scanner_id":"cppcheck","rule_id":"constParameterPointer","category":"third-party","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/ezxml/ezxml.c","count":1,"owner":"maintainers/third-party-integration","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-e7f8f80f0cd95f0d","fingerprint":"cppcheck-bucket:constParameterPointer:src/sod/sod.c","scanner_id":"cppcheck","rule_id":"constParameterPointer","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"style","normalized":"info"},"path":"src/sod/sod.c","count":75,"owner":"maintainers/third-party-integration","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-70e0496568faa30f","fingerprint":"cppcheck-bucket:constParameterPointer:src/telemetry/collectors/linux_cgroup.c","scanner_id":"cppcheck","rule_id":"constParameterPointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/telemetry/collectors/linux_cgroup.c","count":1,"owner":"maintainers/telemetry","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-5bdf073f41a6c65d","fingerprint":"cppcheck-bucket:constParameterPointer:src/telemetry/providers/nvme_provider.c","scanner_id":"cppcheck","rule_id":"constParameterPointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/telemetry/providers/nvme_provider.c","count":1,"owner":"maintainers/telemetry","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-527aa4750d3ac84a","fingerprint":"cppcheck-bucket:constParameterPointer:src/telemetry/system_health_evaluator.c","scanner_id":"cppcheck","rule_id":"constParameterPointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/telemetry/system_health_evaluator.c","count":2,"owner":"maintainers/telemetry","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-d9684d3aa203568c","fingerprint":"cppcheck-bucket:constParameterPointer:src/utils/go2rtc_base_path.c","scanner_id":"cppcheck","rule_id":"constParameterPointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/utils/go2rtc_base_path.c","count":1,"owner":"maintainers/utils","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-e228634622467328","fingerprint":"cppcheck-bucket:constParameterPointer:src/utils/strings.c","scanner_id":"cppcheck","rule_id":"constParameterPointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/utils/strings.c","count":1,"owner":"maintainers/utils","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-bdb708e597b5cade","fingerprint":"cppcheck-bucket:constParameterPointer:src/video/faac_encoder.c","scanner_id":"cppcheck","rule_id":"constParameterPointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/video/faac_encoder.c","count":1,"owner":"maintainers/video","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-cbab871259b9963d","fingerprint":"cppcheck-bucket:constParameterPointer:src/video/hls/hls_unified_thread.c","scanner_id":"cppcheck","rule_id":"constParameterPointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/video/hls/hls_unified_thread.c","count":1,"owner":"maintainers/video","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-8c644cc847574bfe","fingerprint":"cppcheck-bucket:constParameterPointer:src/video/unified_detection_thread.c","scanner_id":"cppcheck","rule_id":"constParameterPointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/video/unified_detection_thread.c","count":1,"owner":"maintainers/video","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-4c0052bc9de6e496","fingerprint":"cppcheck-bucket:constParameterPointer:src/web/go2rtc_websocket.c","scanner_id":"cppcheck","rule_id":"constParameterPointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/web/go2rtc_websocket.c","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-45cfee19afe8668f","fingerprint":"cppcheck-bucket:constParameterPointer:src/web/recording_archive.c","scanner_id":"cppcheck","rule_id":"constParameterPointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/web/recording_archive.c","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-933d7ae37be3c395","fingerprint":"cppcheck-bucket:constVariable:include/sod/sod_img_reader.h","scanner_id":"cppcheck","rule_id":"constVariable","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"style","normalized":"info"},"path":"include/sod/sod_img_reader.h","count":6,"owner":"maintainers/third-party-integration","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-b1c0c559c6e17a23","fingerprint":"cppcheck-bucket:constVariable:include/sod/sod_img_writer.h","scanner_id":"cppcheck","rule_id":"constVariable","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"style","normalized":"info"},"path":"include/sod/sod_img_writer.h","count":7,"owner":"maintainers/third-party-integration","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-8596888f0dd1cc7e","fingerprint":"cppcheck-bucket:constVariable:src/core/mqtt_delivery_worker.c","scanner_id":"cppcheck","rule_id":"constVariable","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/core/mqtt_delivery_worker.c","count":1,"owner":"maintainers/core","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-298feb4a490d6252","fingerprint":"cppcheck-bucket:constVariable:src/sod/sod.c","scanner_id":"cppcheck","rule_id":"constVariable","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"style","normalized":"info"},"path":"src/sod/sod.c","count":4,"owner":"maintainers/third-party-integration","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-a8ce2c3168c021de","fingerprint":"cppcheck-bucket:constVariable:src/sod/sod_ingenic_mxu.c","scanner_id":"cppcheck","rule_id":"constVariable","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"style","normalized":"info"},"path":"src/sod/sod_ingenic_mxu.c","count":2,"owner":"maintainers/third-party-integration","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-9575437f939001d5","fingerprint":"cppcheck-bucket:constVariablePointer:include/sod/sod_img_reader.h","scanner_id":"cppcheck","rule_id":"constVariablePointer","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"style","normalized":"info"},"path":"include/sod/sod_img_reader.h","count":12,"owner":"maintainers/third-party-integration","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-df230b0a5672f192","fingerprint":"cppcheck-bucket:constVariablePointer:include/sod/sod_img_writer.h","scanner_id":"cppcheck","rule_id":"constVariablePointer","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"style","normalized":"info"},"path":"include/sod/sod_img_writer.h","count":3,"owner":"maintainers/third-party-integration","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-8e110c5360beb299","fingerprint":"cppcheck-bucket:constVariablePointer:src/core/path_utils.c","scanner_id":"cppcheck","rule_id":"constVariablePointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/core/path_utils.c","count":1,"owner":"maintainers/core","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-6c5cf9bd3f338f84","fingerprint":"cppcheck-bucket:constVariablePointer:src/database/db_auth.c","scanner_id":"cppcheck","rule_id":"constVariablePointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/database/db_auth.c","count":3,"owner":"maintainers/database","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-08f60b7ec76ce9d3","fingerprint":"cppcheck-bucket:constVariablePointer:src/database/db_authorization.c","scanner_id":"cppcheck","rule_id":"constVariablePointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/database/db_authorization.c","count":1,"owner":"maintainers/database","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-7e7f6cc12d937123","fingerprint":"cppcheck-bucket:constVariablePointer:src/database/db_camera_tags.c","scanner_id":"cppcheck","rule_id":"constVariablePointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/database/db_camera_tags.c","count":1,"owner":"maintainers/database","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-f21c65912e355ace","fingerprint":"cppcheck-bucket:constVariablePointer:src/database/db_core.c","scanner_id":"cppcheck","rule_id":"constVariablePointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/database/db_core.c","count":2,"owner":"maintainers/database","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-9f651ab0c8ea6422","fingerprint":"cppcheck-bucket:constVariablePointer:src/database/db_fleet_query.c","scanner_id":"cppcheck","rule_id":"constVariablePointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/database/db_fleet_query.c","count":1,"owner":"maintainers/database","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-353deb8bba479029","fingerprint":"cppcheck-bucket:constVariablePointer:src/database/db_storage_lifecycle.c","scanner_id":"cppcheck","rule_id":"constVariablePointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/database/db_storage_lifecycle.c","count":2,"owner":"maintainers/database","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-c6ee03168003661f","fingerprint":"cppcheck-bucket:constVariablePointer:src/ezxml/ezxml.c","scanner_id":"cppcheck","rule_id":"constVariablePointer","category":"third-party","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/ezxml/ezxml.c","count":4,"owner":"maintainers/third-party-integration","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-5d8aaf042fefce78","fingerprint":"cppcheck-bucket:constVariablePointer:src/sod/sod.c","scanner_id":"cppcheck","rule_id":"constVariablePointer","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"style","normalized":"info"},"path":"src/sod/sod.c","count":24,"owner":"maintainers/third-party-integration","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-b4e128a1af325d4f","fingerprint":"cppcheck-bucket:constVariablePointer:src/storage/storage_deletion.c","scanner_id":"cppcheck","rule_id":"constVariablePointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/storage/storage_deletion.c","count":1,"owner":"maintainers/storage","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-77479b4ba7ef9849","fingerprint":"cppcheck-bucket:constVariablePointer:src/storage/storage_source.c","scanner_id":"cppcheck","rule_id":"constVariablePointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/storage/storage_source.c","count":1,"owner":"maintainers/storage","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-c9404ed2a73b0977","fingerprint":"cppcheck-bucket:constVariablePointer:src/telemetry/collectors/linux_network.c","scanner_id":"cppcheck","rule_id":"constVariablePointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/telemetry/collectors/linux_network.c","count":1,"owner":"maintainers/telemetry","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-e924700b1413accd","fingerprint":"cppcheck-bucket:constVariablePointer:src/telemetry/collectors/linux_process.c","scanner_id":"cppcheck","rule_id":"constVariablePointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/telemetry/collectors/linux_process.c","count":1,"owner":"maintainers/telemetry","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-2ca7413944026780","fingerprint":"cppcheck-bucket:constVariablePointer:src/telemetry/collectors/linux_thermal.c","scanner_id":"cppcheck","rule_id":"constVariablePointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/telemetry/collectors/linux_thermal.c","count":3,"owner":"maintainers/telemetry","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-a1edb744b382f8f5","fingerprint":"cppcheck-bucket:constVariablePointer:src/telemetry/providers/linux_device_map.c","scanner_id":"cppcheck","rule_id":"constVariablePointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/telemetry/providers/linux_device_map.c","count":1,"owner":"maintainers/telemetry","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-4001e3b91223c7ad","fingerprint":"cppcheck-bucket:constVariablePointer:src/telemetry/providers/linux_hardware.c","scanner_id":"cppcheck","rule_id":"constVariablePointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/telemetry/providers/linux_hardware.c","count":5,"owner":"maintainers/telemetry","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-ae15015525d96c08","fingerprint":"cppcheck-bucket:constVariablePointer:src/telemetry/providers/nvme_provider.c","scanner_id":"cppcheck","rule_id":"constVariablePointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/telemetry/providers/nvme_provider.c","count":1,"owner":"maintainers/telemetry","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-f3bb2108694b562f","fingerprint":"cppcheck-bucket:constVariablePointer:src/telemetry/system_health.c","scanner_id":"cppcheck","rule_id":"constVariablePointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/telemetry/system_health.c","count":1,"owner":"maintainers/telemetry","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-57093ce27e4aabc5","fingerprint":"cppcheck-bucket:constVariablePointer:src/telemetry/system_health_evaluator.c","scanner_id":"cppcheck","rule_id":"constVariablePointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/telemetry/system_health_evaluator.c","count":3,"owner":"maintainers/telemetry","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-4dc0544d99c6a120","fingerprint":"cppcheck-bucket:constVariablePointer:src/utils/go2rtc_base_path.c","scanner_id":"cppcheck","rule_id":"constVariablePointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/utils/go2rtc_base_path.c","count":1,"owner":"maintainers/utils","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-aa0082260172b3b9","fingerprint":"cppcheck-bucket:constVariablePointer:src/video/detection_model.c","scanner_id":"cppcheck","rule_id":"constVariablePointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/video/detection_model.c","count":1,"owner":"maintainers/video","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-5f736ad7b9095aea","fingerprint":"cppcheck-bucket:constVariablePointer:src/video/go2rtc/go2rtc_integration.c","scanner_id":"cppcheck","rule_id":"constVariablePointer","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"style","normalized":"info"},"path":"src/video/go2rtc/go2rtc_integration.c","count":5,"owner":"maintainers/video","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-eabea03354c7b4b7","fingerprint":"cppcheck-bucket:constVariablePointer:src/video/go2rtc/go2rtc_process.c","scanner_id":"cppcheck","rule_id":"constVariablePointer","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"style","normalized":"info"},"path":"src/video/go2rtc/go2rtc_process.c","count":1,"owner":"maintainers/video","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-e9a38e72fa2e4a7c","fingerprint":"cppcheck-bucket:constVariablePointer:src/video/mp4_recording_core.c","scanner_id":"cppcheck","rule_id":"constVariablePointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/video/mp4_recording_core.c","count":1,"owner":"maintainers/video","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-3ec7089cfaa16e94","fingerprint":"cppcheck-bucket:constVariablePointer:src/video/mp4_recording_writer.c","scanner_id":"cppcheck","rule_id":"constVariablePointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/video/mp4_recording_writer.c","count":1,"owner":"maintainers/video","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-4ffd5c5d72b2c6a0","fingerprint":"cppcheck-bucket:constVariablePointer:src/video/stream_state_adapter.c","scanner_id":"cppcheck","rule_id":"constVariablePointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/video/stream_state_adapter.c","count":2,"owner":"maintainers/video","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-f4469b09cc19dae9","fingerprint":"cppcheck-bucket:constVariablePointer:src/web/api_handlers_go2rtc_proxy.c","scanner_id":"cppcheck","rule_id":"constVariablePointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/web/api_handlers_go2rtc_proxy.c","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-611000c5c122ad1e","fingerprint":"cppcheck-bucket:constVariablePointer:src/web/api_handlers_recordings_list.c","scanner_id":"cppcheck","rule_id":"constVariablePointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/web/api_handlers_recordings_list.c","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-d41611e4fb1c1abd","fingerprint":"cppcheck-bucket:constVariablePointer:src/web/api_handlers_recordings_thumbnail.c","scanner_id":"cppcheck","rule_id":"constVariablePointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/web/api_handlers_recordings_thumbnail.c","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-b14c25475c91b307","fingerprint":"cppcheck-bucket:constVariablePointer:src/web/api_handlers_system_logs.c","scanner_id":"cppcheck","rule_id":"constVariablePointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/web/api_handlers_system_logs.c","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-03f92e362a140589","fingerprint":"cppcheck-bucket:constVariablePointer:src/web/api_handlers_timeline.c","scanner_id":"cppcheck","rule_id":"constVariablePointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/web/api_handlers_timeline.c","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-d45c6fa42b05db96","fingerprint":"cppcheck-bucket:constVariablePointer:src/web/api_handlers_users_backend_agnostic.c","scanner_id":"cppcheck","rule_id":"constVariablePointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/web/api_handlers_users_backend_agnostic.c","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-9551a431943d8273","fingerprint":"cppcheck-bucket:constVariablePointer:src/web/httpd_utils.c","scanner_id":"cppcheck","rule_id":"constVariablePointer","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/web/httpd_utils.c","count":3,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-86335be98f6f2e90","fingerprint":"cppcheck-bucket:duplicateAssignExpression:src/sod/sod.c","scanner_id":"cppcheck","rule_id":"duplicateAssignExpression","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"style","normalized":"info"},"path":"src/sod/sod.c","count":1,"owner":"maintainers/third-party-integration","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-f814692d9029a8a1","fingerprint":"cppcheck-bucket:duplicateCondition:src/video/motion_detection.c","scanner_id":"cppcheck","rule_id":"duplicateCondition","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/video/motion_detection.c","count":1,"owner":"maintainers/video","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-1f586f8741e770e9","fingerprint":"cppcheck-bucket:knownConditionTrueFalse:include/sod/sod_img_reader.h","scanner_id":"cppcheck","rule_id":"knownConditionTrueFalse","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"style","normalized":"info"},"path":"include/sod/sod_img_reader.h","count":7,"owner":"maintainers/third-party-integration","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-95058fe138843b1f","fingerprint":"cppcheck-bucket:knownConditionTrueFalse:src/core/event_router.c","scanner_id":"cppcheck","rule_id":"knownConditionTrueFalse","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/core/event_router.c","count":1,"owner":"maintainers/core","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-9c71189558451cd4","fingerprint":"cppcheck-bucket:knownConditionTrueFalse:src/core/mqtt_event_adapter.c","scanner_id":"cppcheck","rule_id":"knownConditionTrueFalse","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/core/mqtt_event_adapter.c","count":1,"owner":"maintainers/core","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-2f8dc61aeb7cdda6","fingerprint":"cppcheck-bucket:knownConditionTrueFalse:src/database/db_storage_targets.c","scanner_id":"cppcheck","rule_id":"knownConditionTrueFalse","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/database/db_storage_targets.c","count":1,"owner":"maintainers/database","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-c7e9176ca688d280","fingerprint":"cppcheck-bucket:knownConditionTrueFalse:src/ezxml/ezxml.c","scanner_id":"cppcheck","rule_id":"knownConditionTrueFalse","category":"third-party","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/ezxml/ezxml.c","count":1,"owner":"maintainers/third-party-integration","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-064299ecf7d09b55","fingerprint":"cppcheck-bucket:knownConditionTrueFalse:src/sod/sod.c","scanner_id":"cppcheck","rule_id":"knownConditionTrueFalse","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"style","normalized":"info"},"path":"src/sod/sod.c","count":4,"owner":"maintainers/third-party-integration","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-28b7ea4b18c686f4","fingerprint":"cppcheck-bucket:knownConditionTrueFalse:src/telemetry/collectors/linux_process.c","scanner_id":"cppcheck","rule_id":"knownConditionTrueFalse","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/telemetry/collectors/linux_process.c","count":1,"owner":"maintainers/telemetry","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-1ac7ae81e97d3df2","fingerprint":"cppcheck-bucket:knownConditionTrueFalse:src/telemetry/health_helper_runner.c","scanner_id":"cppcheck","rule_id":"knownConditionTrueFalse","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/telemetry/health_helper_runner.c","count":1,"owner":"maintainers/telemetry","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-0251d17e5b89df2a","fingerprint":"cppcheck-bucket:knownConditionTrueFalse:src/web/api_handlers_imaging.c","scanner_id":"cppcheck","rule_id":"knownConditionTrueFalse","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/web/api_handlers_imaging.c","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-8fc3dcb4cfe70835","fingerprint":"cppcheck-bucket:missingInclude:include/video/faac_encoder.h","scanner_id":"cppcheck","rule_id":"missingInclude","category":"application","feature_flag":null,"severity":{"tool":"information","normalized":"info"},"path":"include/video/faac_encoder.h","count":1,"owner":"maintainers/video","disposition":"informational","exception_expiry":null}, + {"id":"CPPCHECK-BUCKET-63161c8eafe92ae7","fingerprint":"cppcheck-bucket:missingInclude:src/core/config.c","scanner_id":"cppcheck","rule_id":"missingInclude","category":"application","feature_flag":null,"severity":{"tool":"information","normalized":"info"},"path":"src/core/config.c","count":1,"owner":"maintainers/core","disposition":"informational","exception_expiry":null}, + {"id":"CPPCHECK-BUCKET-b70962cce382071f","fingerprint":"cppcheck-bucket:missingInclude:src/core/main.c","scanner_id":"cppcheck","rule_id":"missingInclude","category":"application","feature_flag":null,"severity":{"tool":"information","normalized":"info"},"path":"src/core/main.c","count":1,"owner":"maintainers/core","disposition":"informational","exception_expiry":null}, + {"id":"CPPCHECK-BUCKET-814033f796b8ad0e","fingerprint":"cppcheck-bucket:missingInclude:src/core/mqtt_client.c","scanner_id":"cppcheck","rule_id":"missingInclude","category":"optional-feature","feature_flag":"ENABLE_MQTT","severity":{"tool":"information","normalized":"info"},"path":"src/core/mqtt_client.c","count":1,"owner":"maintainers/core","disposition":"informational","exception_expiry":null}, + {"id":"CPPCHECK-BUCKET-01e694ff6fbd689d","fingerprint":"cppcheck-bucket:missingInclude:src/core/mqtt_destination_client.c","scanner_id":"cppcheck","rule_id":"missingInclude","category":"application","feature_flag":null,"severity":{"tool":"information","normalized":"info"},"path":"src/core/mqtt_destination_client.c","count":1,"owner":"maintainers/core","disposition":"informational","exception_expiry":null}, + {"id":"CPPCHECK-BUCKET-cc922dd5985313ad","fingerprint":"cppcheck-bucket:missingInclude:src/database/db_detection_engines.c","scanner_id":"cppcheck","rule_id":"missingInclude","category":"application","feature_flag":null,"severity":{"tool":"information","normalized":"info"},"path":"src/database/db_detection_engines.c","count":1,"owner":"maintainers/database","disposition":"informational","exception_expiry":null}, + {"id":"CPPCHECK-BUCKET-3ae8fa421e075d0e","fingerprint":"cppcheck-bucket:missingInclude:src/sod/sod.c","scanner_id":"cppcheck","rule_id":"missingInclude","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"information","normalized":"info"},"path":"src/sod/sod.c","count":1,"owner":"maintainers/third-party-integration","disposition":"informational","exception_expiry":null}, + {"id":"CPPCHECK-BUCKET-d38eb9023c264f0b","fingerprint":"cppcheck-bucket:missingInclude:src/video/detection/litert_engine.cc","scanner_id":"cppcheck","rule_id":"missingInclude","category":"optional-feature","feature_flag":"ENABLE_LITERT","severity":{"tool":"information","normalized":"info"},"path":"src/video/detection/litert_engine.cc","count":5,"owner":"maintainers/video","disposition":"informational","exception_expiry":null}, + {"id":"CPPCHECK-BUCKET-f275f11a2e762883","fingerprint":"cppcheck-bucket:missingInclude:src/video/go2rtc/go2rtc_process.c","scanner_id":"cppcheck","rule_id":"missingInclude","category":"optional-feature","feature_flag":"ENABLE_GO2RTC","severity":{"tool":"information","normalized":"info"},"path":"src/video/go2rtc/go2rtc_process.c","count":1,"owner":"maintainers/video","disposition":"informational","exception_expiry":null}, + {"id":"CPPCHECK-BUCKET-3d9620f855b0045c","fingerprint":"cppcheck-bucket:missingInclude:src/web/api_handlers_setup.c","scanner_id":"cppcheck","rule_id":"missingInclude","category":"application","feature_flag":null,"severity":{"tool":"information","normalized":"info"},"path":"src/web/api_handlers_setup.c","count":1,"owner":"maintainers/web","disposition":"informational","exception_expiry":null}, + {"id":"CPPCHECK-BUCKET-ce2eb41d6af3de2c","fingerprint":"cppcheck-bucket:missingInclude:src/web/api_handlers_system.c","scanner_id":"cppcheck","rule_id":"missingInclude","category":"application","feature_flag":null,"severity":{"tool":"information","normalized":"info"},"path":"src/web/api_handlers_system.c","count":1,"owner":"maintainers/web","disposition":"informational","exception_expiry":null}, + {"id":"CPPCHECK-BUCKET-81673e70160cf41d","fingerprint":"cppcheck-bucket:noValidConfiguration:src/video/mp4_writer_utils.c","scanner_id":"cppcheck","rule_id":"noValidConfiguration","category":"application","feature_flag":null,"severity":{"tool":"information","normalized":"info"},"path":"src/video/mp4_writer_utils.c","count":1,"owner":"maintainers/video","disposition":"informational","exception_expiry":null}, + {"id":"CPPCHECK-BUCKET-eee46ed30daef891","fingerprint":"cppcheck-bucket:redundantCondition:include/sod/sod_img_reader.h","scanner_id":"cppcheck","rule_id":"redundantCondition","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"style","normalized":"info"},"path":"include/sod/sod_img_reader.h","count":1,"owner":"maintainers/third-party-integration","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-dcdbd8e6357d7e12","fingerprint":"cppcheck-bucket:redundantInitialization:include/sod/sod_img_reader.h","scanner_id":"cppcheck","rule_id":"redundantInitialization","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"style","normalized":"info"},"path":"include/sod/sod_img_reader.h","count":1,"owner":"maintainers/third-party-integration","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-bbeef7abfa51d073","fingerprint":"cppcheck-bucket:redundantInitialization:src/database/db_authorization.c","scanner_id":"cppcheck","rule_id":"redundantInitialization","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/database/db_authorization.c","count":1,"owner":"maintainers/database","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-0be349a4e3fc0518","fingerprint":"cppcheck-bucket:redundantInitialization:src/video/recording_path.c","scanner_id":"cppcheck","rule_id":"redundantInitialization","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/video/recording_path.c","count":2,"owner":"maintainers/video","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-8f929a70e127f155","fingerprint":"cppcheck-bucket:redundantPointerOp:src/sod/sod.c","scanner_id":"cppcheck","rule_id":"redundantPointerOp","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"style","normalized":"info"},"path":"src/sod/sod.c","count":59,"owner":"maintainers/third-party-integration","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-147fba26f7ae351b","fingerprint":"cppcheck-bucket:shadowFunction:src/database/db_storage_targets.c","scanner_id":"cppcheck","rule_id":"shadowFunction","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/database/db_storage_targets.c","count":1,"owner":"maintainers/database","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-05b22ae697eaa4ca","fingerprint":"cppcheck-bucket:shadowFunction:src/video/stream_manager.c","scanner_id":"cppcheck","rule_id":"shadowFunction","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/video/stream_manager.c","count":6,"owner":"maintainers/video","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-9d2c058ee958f85a","fingerprint":"cppcheck-bucket:shadowVariable:include/core/config.h","scanner_id":"cppcheck","rule_id":"shadowVariable","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"include/core/config.h","count":1,"owner":"maintainers/core","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-4f5bbc66f323399f","fingerprint":"cppcheck-bucket:toomanyconfigs:src/sod/sod.c","scanner_id":"cppcheck","rule_id":"toomanyconfigs","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"information","normalized":"info"},"path":"src/sod/sod.c","count":1,"owner":"maintainers/third-party-integration","disposition":"informational","exception_expiry":null}, + {"id":"CPPCHECK-BUCKET-99e8da0855ffc2d5","fingerprint":"cppcheck-bucket:unmatchedSuppression:src/core/main.c","scanner_id":"cppcheck","rule_id":"unmatchedSuppression","category":"application","feature_flag":null,"severity":{"tool":"information","normalized":"info"},"path":"src/core/main.c","count":2,"owner":"maintainers/core","disposition":"informational","exception_expiry":null}, + {"id":"CPPCHECK-BUCKET-426773bc9bc5a5d5","fingerprint":"cppcheck-bucket:unpreciseMathCall:src/sod/sod.c","scanner_id":"cppcheck","rule_id":"unpreciseMathCall","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"style","normalized":"info"},"path":"src/sod/sod.c","count":2,"owner":"maintainers/third-party-integration","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-eda9b7001501e847","fingerprint":"cppcheck-bucket:unreadVariable:include/sod/sod_img_reader.h","scanner_id":"cppcheck","rule_id":"unreadVariable","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"style","normalized":"info"},"path":"include/sod/sod_img_reader.h","count":6,"owner":"maintainers/third-party-integration","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-779ca0994d939da1","fingerprint":"cppcheck-bucket:unreadVariable:src/core/mqtt_client.c","scanner_id":"cppcheck","rule_id":"unreadVariable","category":"optional-feature","feature_flag":"ENABLE_MQTT","severity":{"tool":"style","normalized":"info"},"path":"src/core/mqtt_client.c","count":1,"owner":"maintainers/core","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-93112ea9a6a3c10d","fingerprint":"cppcheck-bucket:unreadVariable:src/sod/sod.c","scanner_id":"cppcheck","rule_id":"unreadVariable","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"style","normalized":"info"},"path":"src/sod/sod.c","count":51,"owner":"maintainers/third-party-integration","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-b1b17a4b9a2646a0","fingerprint":"cppcheck-bucket:unreadVariable:src/video/onvif_ptz.c","scanner_id":"cppcheck","rule_id":"unreadVariable","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/video/onvif_ptz.c","count":1,"owner":"maintainers/video","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-a4ae78869ec196b6","fingerprint":"cppcheck-bucket:unsignedLessThanZero:src/sod/sod.c","scanner_id":"cppcheck","rule_id":"unsignedLessThanZero","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"style","normalized":"info"},"path":"src/sod/sod.c","count":1,"owner":"maintainers/third-party-integration","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-efd7988ca87c95ed","fingerprint":"cppcheck-bucket:unusedStructMember:src/core/mqtt_destination_client.c","scanner_id":"cppcheck","rule_id":"unusedStructMember","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/core/mqtt_destination_client.c","count":1,"owner":"maintainers/core","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-49117790281d294c","fingerprint":"cppcheck-bucket:unusedStructMember:src/sod/sod.c","scanner_id":"cppcheck","rule_id":"unusedStructMember","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"style","normalized":"info"},"path":"src/sod/sod.c","count":22,"owner":"maintainers/third-party-integration","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-a12a87ba590d2536","fingerprint":"cppcheck-bucket:unusedStructMember:src/video/sod_detection.c","scanner_id":"cppcheck","rule_id":"unusedStructMember","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/video/sod_detection.c","count":18,"owner":"maintainers/video","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-56c122b53a2e50cb","fingerprint":"cppcheck-bucket:uselessAssignmentArg:src/sod/sod.c","scanner_id":"cppcheck","rule_id":"uselessAssignmentArg","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"style","normalized":"info"},"path":"src/sod/sod.c","count":1,"owner":"maintainers/third-party-integration","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-ae4dbf08b9cfd1fe","fingerprint":"cppcheck-bucket:variableScope:include/sod/sod_img_reader.h","scanner_id":"cppcheck","rule_id":"variableScope","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"style","normalized":"info"},"path":"include/sod/sod_img_reader.h","count":16,"owner":"maintainers/third-party-integration","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-b9ff6009cfa26f69","fingerprint":"cppcheck-bucket:variableScope:include/sod/sod_img_writer.h","scanner_id":"cppcheck","rule_id":"variableScope","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"style","normalized":"info"},"path":"include/sod/sod_img_writer.h","count":3,"owner":"maintainers/third-party-integration","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-b614f3b94230fe9a","fingerprint":"cppcheck-bucket:variableScope:src/database/db_detection_engines.c","scanner_id":"cppcheck","rule_id":"variableScope","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/database/db_detection_engines.c","count":1,"owner":"maintainers/database","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-664e70c550c3ef36","fingerprint":"cppcheck-bucket:variableScope:src/database/db_lpr_reads.c","scanner_id":"cppcheck","rule_id":"variableScope","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/database/db_lpr_reads.c","count":1,"owner":"maintainers/database","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-2afdb0b1f1146eeb","fingerprint":"cppcheck-bucket:variableScope:src/database/db_recordings.c","scanner_id":"cppcheck","rule_id":"variableScope","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/database/db_recordings.c","count":2,"owner":"maintainers/database","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-96d5b13210206feb","fingerprint":"cppcheck-bucket:variableScope:src/ezxml/ezxml.c","scanner_id":"cppcheck","rule_id":"variableScope","category":"third-party","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/ezxml/ezxml.c","count":3,"owner":"maintainers/third-party-integration","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-50bc6e286ac69abd","fingerprint":"cppcheck-bucket:variableScope:src/sod/sod.c","scanner_id":"cppcheck","rule_id":"variableScope","category":"third-party","feature_flag":"ENABLE_SOD","severity":{"tool":"style","normalized":"info"},"path":"src/sod/sod.c","count":56,"owner":"maintainers/third-party-integration","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-89a47a59067748c1","fingerprint":"cppcheck-bucket:variableScope:src/storage/storage_deletion.c","scanner_id":"cppcheck","rule_id":"variableScope","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/storage/storage_deletion.c","count":1,"owner":"maintainers/storage","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-da5006735d5c5165","fingerprint":"cppcheck-bucket:variableScope:src/storage/storage_migration.c","scanner_id":"cppcheck","rule_id":"variableScope","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/storage/storage_migration.c","count":5,"owner":"maintainers/storage","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-51dd1a644803f48d","fingerprint":"cppcheck-bucket:variableScope:src/storage/storage_placement.c","scanner_id":"cppcheck","rule_id":"variableScope","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/storage/storage_placement.c","count":1,"owner":"maintainers/storage","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-a3e8d56a93d61112","fingerprint":"cppcheck-bucket:variableScope:src/storage/storage_s3.c","scanner_id":"cppcheck","rule_id":"variableScope","category":"optional-feature","feature_flag":"ENABLE_S3_ARCHIVE","severity":{"tool":"style","normalized":"info"},"path":"src/storage/storage_s3.c","count":3,"owner":"maintainers/storage","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-771b3fde1937be8a","fingerprint":"cppcheck-bucket:variableScope:src/telemetry/collectors/linux_cgroup.c","scanner_id":"cppcheck","rule_id":"variableScope","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/telemetry/collectors/linux_cgroup.c","count":1,"owner":"maintainers/telemetry","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-e4dae70b5d1bd770","fingerprint":"cppcheck-bucket:variableScope:src/telemetry/collectors/linux_thermal.c","scanner_id":"cppcheck","rule_id":"variableScope","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/telemetry/collectors/linux_thermal.c","count":1,"owner":"maintainers/telemetry","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-9cc73ce911540ad4","fingerprint":"cppcheck-bucket:variableScope:src/telemetry/stream_metrics.c","scanner_id":"cppcheck","rule_id":"variableScope","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/telemetry/stream_metrics.c","count":1,"owner":"maintainers/telemetry","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-905555e786df0459","fingerprint":"cppcheck-bucket:variableScope:src/video/api_detection.c","scanner_id":"cppcheck","rule_id":"variableScope","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/video/api_detection.c","count":1,"owner":"maintainers/video","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-5d0aacd6263110c5","fingerprint":"cppcheck-bucket:variableScope:src/video/hls/hls_directory.c","scanner_id":"cppcheck","rule_id":"variableScope","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/video/hls/hls_directory.c","count":1,"owner":"maintainers/video","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-ec17ee32f6d27cdb","fingerprint":"cppcheck-bucket:variableScope:src/video/recording_transcode.c","scanner_id":"cppcheck","rule_id":"variableScope","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/video/recording_transcode.c","count":2,"owner":"maintainers/video","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"CPPCHECK-BUCKET-d4393cc822a0c2d3","fingerprint":"cppcheck-bucket:variableScope:src/video/unified_detection_thread.c","scanner_id":"cppcheck","rule_id":"variableScope","category":"application","feature_flag":null,"severity":{"tool":"style","normalized":"info"},"path":"src/video/unified_detection_thread.c","count":1,"owner":"maintainers/video","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-366138c5d194685c","fingerprint":"eslint-bucket:jsx-a11y/anchor-is-valid:web/js/components/preact/Header.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/anchor-is-valid","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/Header.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-ed278d9594c2abdb","fingerprint":"eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/GridPicker.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/click-events-have-key-events","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/GridPicker.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-67fcff31d1a4cf75","fingerprint":"eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/HLSVideoCell.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/click-events-have-key-events","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/HLSVideoCell.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-a642f51dfd2a124a","fingerprint":"eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/HealthView.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/click-events-have-key-events","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/HealthView.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-404de092ea97cc43","fingerprint":"eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/MSEVideoCell.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/click-events-have-key-events","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/MSEVideoCell.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-6243e36ec0fdb5cd","fingerprint":"eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/StreamCard.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/click-events-have-key-events","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/StreamCard.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-5c63d53fbef3ba6d","fingerprint":"eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/StreamsView.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/click-events-have-key-events","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/StreamsView.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-ab2c863c82952346","fingerprint":"eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/ToastContainer.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/click-events-have-key-events","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/ToastContainer.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-f53a71c368c33ab9","fingerprint":"eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/UI.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/click-events-have-key-events","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/UI.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-45887456841ead8b","fingerprint":"eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/WebRTCVideoCell.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/click-events-have-key-events","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/WebRTCVideoCell.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-cb235968867c79e3","fingerprint":"eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/ZoneEditor.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/click-events-have-key-events","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/ZoneEditor.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-02418efc105b6ab9","fingerprint":"eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/common/LanguageSelector.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/click-events-have-key-events","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/common/LanguageSelector.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-4e8530c09d5fd082","fingerprint":"eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/common/ModalDialog.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/click-events-have-key-events","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/common/ModalDialog.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-f16c5e93d86bc6f9","fingerprint":"eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/live/LiveOperatorNavigator.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/click-events-have-key-events","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/live/LiveOperatorNavigator.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-41381cd9bd64279e","fingerprint":"eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/recordings/RecordingsGrid.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/click-events-have-key-events","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/recordings/RecordingsGrid.jsx","count":3,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-422485a76dc61a9b","fingerprint":"eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/settings/Go2rtcTab.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/click-events-have-key-events","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/settings/Go2rtcTab.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-44ea0e63c82a7151","fingerprint":"eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/system/ClearLogsModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/click-events-have-key-events","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/system/ClearLogsModal.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-155480cbfd270011","fingerprint":"eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/system/RestartModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/click-events-have-key-events","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/system/RestartModal.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-79b6e7adf4959fbc","fingerprint":"eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/timeline/TimelinePlayer.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/click-events-have-key-events","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/timeline/TimelinePlayer.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-0a786d21e1ee7bd2","fingerprint":"eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/users/AccessPolicyModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/click-events-have-key-events","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/AccessPolicyModal.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-c2dc58af6543d1f5","fingerprint":"eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/users/AddUserModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/click-events-have-key-events","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/AddUserModal.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-3b71a4c47dfd1075","fingerprint":"eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/users/ApiKeyModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/click-events-have-key-events","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/ApiKeyModal.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-ea11ae604e62541e","fingerprint":"eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/users/AuditHistoryModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/click-events-have-key-events","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/AuditHistoryModal.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-8d573ae471211e73","fingerprint":"eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/users/DeleteUserModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/click-events-have-key-events","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/DeleteUserModal.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-22666b8c08cd887e","fingerprint":"eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/users/EditUserModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/click-events-have-key-events","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/EditUserModal.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-9190884804c0c65d","fingerprint":"eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/users/RoleManagerModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/click-events-have-key-events","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/RoleManagerModal.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-e8ce699e42be07b3","fingerprint":"eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/users/TotpSetupModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/click-events-have-key-events","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/TotpSetupModal.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-0f4bbeb4ab715fee","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/AuthGate.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/AuthGate.jsx","count":3,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-ef00a494fd69875c","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/BatchDownloadModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/BatchDownloadModal.jsx","count":3,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-e93ca9cb727a0aee","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/DetectionOverlay.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/DetectionOverlay.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-20e1a03b32e40002","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/FleetView.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/FleetView.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-e7e0cc4f8fd4c513","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/FullscreenManager.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/FullscreenManager.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-aa839344c6e5b30d","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/HLSVideoCell.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/HLSVideoCell.jsx","count":3,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-ae74d74f4f8f96b4","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/LiveView.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/LiveView.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-33c31857a85153c5","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/LoginView.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/LoginView.jsx","count":6,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-2b401ef7608cff74","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/MSEVideoCell.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/MSEVideoCell.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-6b623e0db3f455c7","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/SetupWizard.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/SetupWizard.jsx","count":5,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-63e9c68b97a2b704","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/SnapshotManager.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/SnapshotManager.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-3d882f111ea61422","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/StreamConfigModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/StreamConfigModal.jsx","count":53,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-ba71da8483425ebf","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/StreamsView.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/StreamsView.jsx","count":6,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-6ffa955639ab6418","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/ThemeCustomizer.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/ThemeCustomizer.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-6faae6bddf434aab","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/UI.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/UI.jsx","count":4,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-9bd9a8994dceced4","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/WebRTCVideoCell.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/WebRTCVideoCell.jsx","count":3,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-e845a2e465702318","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/ZoneEditor.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/ZoneEditor.jsx","count":4,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-1f35f119bab13f92","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/common/ModalDialog.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/common/ModalDialog.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-5088d976b993e707","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/events/EventDestinationEditor.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/events/EventDestinationEditor.jsx","count":15,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-fea403cece7fffa3","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/events/EventRouteEditor.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/events/EventRouteEditor.jsx","count":20,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-20d0442e85244a5d","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/fleet/BulkOrganizeModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/fleet/BulkOrganizeModal.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-03b8b95f3bd44235","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/fleet/CollectionManager.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/fleet/CollectionManager.jsx","count":3,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-993ef9a219cc29a2","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/fleet/CollectionSelectorBuilder.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/fleet/CollectionSelectorBuilder.jsx","count":4,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-eaa9041228587f50","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/fleet/FleetFilters.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/fleet/FleetFilters.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-19d5fc636e3f15e6","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/fleet/OrganizationManager.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/fleet/OrganizationManager.jsx","count":5,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-2cdd7ef73529551e","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/fleet/SavedViewsBar.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/fleet/SavedViewsBar.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-5a25b9ace393f230","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/fleet/StaticCollectionMembers.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/fleet/StaticCollectionMembers.jsx","count":3,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-12c7bb31966e53aa","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/investigation/InvestigationActions.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/investigation/InvestigationActions.jsx","count":4,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-274240d1fc0300f7","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/investigation/InvestigationBookmarks.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/investigation/InvestigationBookmarks.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-2a20bf23c61a102e","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/investigation/InvestigationView.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/investigation/InvestigationView.jsx","count":8,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-bb1a968a245405ec","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/live/LiveBuildingPlan.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/live/LiveBuildingPlan.jsx","count":3,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-3a6fb0a94ef6ffdf","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/live/LiveOperatorNavigator.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/live/LiveOperatorNavigator.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-e0e4b387af698b40","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/live/PlanSketchControls.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/live/PlanSketchControls.jsx","count":5,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-389226ea0147ea5d","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/recordings/FiltersSidebar.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/recordings/FiltersSidebar.jsx","count":5,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-aab67d5bbb7b5489","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/recordings/RecordingsGrid.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/recordings/RecordingsGrid.jsx","count":8,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-f492731b13ec277c","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/recordings/RecordingsTable.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/recordings/RecordingsTable.jsx","count":6,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-d03afa69ead3203e","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/recordings/TagsOverlay.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/recordings/TagsOverlay.jsx","count":3,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-8ce22b0413a485e1","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/settings/AdvancedTab.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/settings/AdvancedTab.jsx","count":10,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-40ef7b2f328bb9ef","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/settings/AuthTab.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/settings/AuthTab.jsx","count":11,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-93d2b8db97a42555","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/settings/DetectionTab.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/settings/DetectionTab.jsx","count":7,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-ea86635ccd79513e","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/settings/GeneralTab.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/settings/GeneralTab.jsx","count":6,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-5ec0649750441f81","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/settings/Go2rtcTab.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/settings/Go2rtcTab.jsx","count":13,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-fe8c1e237393fb23","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/settings/HealthTab.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/settings/HealthTab.jsx","count":6,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-59e343114dc251b1","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/settings/MqttTab.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/settings/MqttTab.jsx","count":13,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-5a1cbbfddf8f3fcc","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/settings/StorageTab.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/settings/StorageTab.jsx","count":40,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-350da16b1c3b2274","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/settings/StreamsDefaultsTab.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/settings/StreamsDefaultsTab.jsx","count":3,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-44b516dc2eeb97bf","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/system/StreamStorage.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/system/StreamStorage.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-5da42ce096a9fa82","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/timeline/CalendarPicker.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/timeline/CalendarPicker.jsx","count":4,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-7b00d558899dd292","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/timeline/TimelineControls.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/timeline/TimelineControls.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-4e38c49052b49016","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/timeline/TimelinePlayer.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/timeline/TimelinePlayer.jsx","count":3,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-6af902622576c683","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/users/AddUserModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/AddUserModal.jsx","count":6,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-098293b0fb5320bb","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/users/ApiKeyModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/ApiKeyModal.jsx","count":4,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-f25f197e02c782fc","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/users/AuditHistoryModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/AuditHistoryModal.jsx","count":6,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-ccf3e6e7959d2bd7","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/users/EditUserModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/EditUserModal.jsx","count":6,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-400e44e71536be4e","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/users/RoleManagerModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/RoleManagerModal.jsx","count":3,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-d3aede71a08c3a5f","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/users/TotpSetupModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/TotpSetupModal.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-fcf1de019f6b4533","fingerprint":"eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/users/UsersTable.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/control-has-associated-label","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/UsersTable.jsx","count":6,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-3469a0a703cdbc12","fingerprint":"eslint-bucket:jsx-a11y/interactive-supports-focus:web/js/components/preact/MobileTileGestures.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/interactive-supports-focus","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/MobileTileGestures.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-199d3d91208953b4","fingerprint":"eslint-bucket:jsx-a11y/label-has-associated-control:web/js/components/preact/BatchDownloadModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-associated-control","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/BatchDownloadModal.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-81a756fe7228ad5b","fingerprint":"eslint-bucket:jsx-a11y/label-has-associated-control:web/js/components/preact/StreamConfigModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-associated-control","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/StreamConfigModal.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-ddc6803a9b16e391","fingerprint":"eslint-bucket:jsx-a11y/label-has-associated-control:web/js/components/preact/events/EventDestinationEditor.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-associated-control","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/events/EventDestinationEditor.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-7cde28afaa9ffb65","fingerprint":"eslint-bucket:jsx-a11y/label-has-associated-control:web/js/components/preact/events/EventRouteEditor.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-associated-control","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/events/EventRouteEditor.jsx","count":5,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-7dcecd444f491721","fingerprint":"eslint-bucket:jsx-a11y/label-has-associated-control:web/js/components/preact/fleet/CollectionManager.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-associated-control","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/fleet/CollectionManager.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-9308fe6583bcdce7","fingerprint":"eslint-bucket:jsx-a11y/label-has-associated-control:web/js/components/preact/fleet/StaticCollectionMembers.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-associated-control","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/fleet/StaticCollectionMembers.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-5e7cfcb56208eaa9","fingerprint":"eslint-bucket:jsx-a11y/label-has-associated-control:web/js/components/preact/settings/HealthTab.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-associated-control","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/settings/HealthTab.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-e84d458d8fcd3eef","fingerprint":"eslint-bucket:jsx-a11y/label-has-associated-control:web/js/components/preact/settings/StorageTab.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-associated-control","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/settings/StorageTab.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-cf4b93673820960b","fingerprint":"eslint-bucket:jsx-a11y/label-has-associated-control:web/js/components/preact/users/ApiKeyModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-associated-control","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/ApiKeyModal.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-00c9eb79387b90d1","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/AuthGate.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/AuthGate.jsx","count":3,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-c603f4c09210c0bd","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/BatchDownloadModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/BatchDownloadModal.jsx","count":3,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-07e48ad6ea9ce45e","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/FleetView.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/FleetView.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-dfeaa6c4a9abf5fa","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/LiveView.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/LiveView.jsx","count":4,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-98f2a6813a7ad225","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/LoginView.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/LoginView.jsx","count":6,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-e73c0530b2243573","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/SetupWizard.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/SetupWizard.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-c4c40aa44f4e62e4","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/StreamCard.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/StreamCard.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-d900a116e1f06cf4","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/StreamConfigModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/StreamConfigModal.jsx","count":59,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-de63541e57266afb","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/StreamsView.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/StreamsView.jsx","count":8,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-e810ef87137eb5d8","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/UI.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/UI.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-38ac9714530327f7","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/ZoneEditor.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/ZoneEditor.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-b1a74f710eb47a22","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/common/ModalDialog.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/common/ModalDialog.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-2d6e882afea8fed1","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/events/EventDestinationEditor.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/events/EventDestinationEditor.jsx","count":3,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-f3bd5129ab03f352","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/events/EventRouteEditor.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/events/EventRouteEditor.jsx","count":9,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-7ba2e66a4eb3914f","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/fleet/BulkOrganizeModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/fleet/BulkOrganizeModal.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-05ad31a80cc2b3a2","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/fleet/CollectionManager.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/fleet/CollectionManager.jsx","count":4,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-30a2e484727d4a5a","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/fleet/CollectionSelectorBuilder.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/fleet/CollectionSelectorBuilder.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-b32370126e568d01","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/fleet/FleetTable.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/fleet/FleetTable.jsx","count":3,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-f77074e66ed65721","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/fleet/OrganizationManager.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/fleet/OrganizationManager.jsx","count":8,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-e26c8068ece9c0e0","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/fleet/SavedViewsBar.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/fleet/SavedViewsBar.jsx","count":3,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-4246d4277a0b8f04","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/fleet/StaticCollectionMembers.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/fleet/StaticCollectionMembers.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-642b5326a1034302","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/investigation/InvestigationActions.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/investigation/InvestigationActions.jsx","count":4,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-c0802f3ddbb20b2e","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/investigation/InvestigationBookmarks.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/investigation/InvestigationBookmarks.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-137cbeae12c87193","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/investigation/InvestigationView.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/investigation/InvestigationView.jsx","count":18,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-a167dfb879b1b9cf","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/live/LiveBuildingPlan.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/live/LiveBuildingPlan.jsx","count":3,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-b0e1dbc8e8cc536e","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/live/LiveOperatorNavigator.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/live/LiveOperatorNavigator.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-50994f387baeaa69","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/recordings/FiltersSidebar.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/recordings/FiltersSidebar.jsx","count":3,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-dcde47440ba091e3","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/recordings/RecordingsGrid.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/recordings/RecordingsGrid.jsx","count":3,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-114c375fcc3b4802","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/recordings/RecordingsTable.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/recordings/RecordingsTable.jsx","count":3,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-8b431e9fa35d81ba","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/recordings/TagsOverlay.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/recordings/TagsOverlay.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-a4e1217d107c230c","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/settings/AdvancedTab.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/settings/AdvancedTab.jsx","count":10,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-4a0d0e1ea3635a24","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/settings/AuthTab.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/settings/AuthTab.jsx","count":12,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-d6ed69efe339ce37","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/settings/DetectionTab.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/settings/DetectionTab.jsx","count":10,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-61d1473d84fbeea6","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/settings/GeneralTab.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/settings/GeneralTab.jsx","count":9,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-dd680edebf6809ff","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/settings/Go2rtcTab.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/settings/Go2rtcTab.jsx","count":13,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-e267f8f47c3806d3","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/settings/HealthTab.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/settings/HealthTab.jsx","count":3,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-d5ecbc0292c55216","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/settings/MqttTab.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/settings/MqttTab.jsx","count":14,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-c067bb3093f57d49","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/settings/StorageTab.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/settings/StorageTab.jsx","count":53,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-4e8b56001c3a0722","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/settings/StreamsDefaultsTab.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/settings/StreamsDefaultsTab.jsx","count":5,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-223399111dfd4016","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/settings/WorkspacesTab.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/settings/WorkspacesTab.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-7d2f50f4d066f6e4","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/timeline/TimelinePage.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/timeline/TimelinePage.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-00d366c5691b4bb5","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/timeline/TimelinePlayer.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/timeline/TimelinePlayer.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-7f43090b7b01626a","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/users/AccessPolicyModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/AccessPolicyModal.jsx","count":4,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-17ad0e14291e8ec3","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/users/AddUserModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/AddUserModal.jsx","count":5,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-18b7f3add93999e4","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/users/ApiKeyModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/ApiKeyModal.jsx","count":7,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-d3157833e1568912","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/users/AuditDecisionModes.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/AuditDecisionModes.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-184f5809a1f3d621","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/users/AuditHistoryModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/AuditHistoryModal.jsx","count":10,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-682efc8151a90daf","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/users/EditUserModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/EditUserModal.jsx","count":7,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-2e14d60ae388c180","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/users/RoleManagerModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/RoleManagerModal.jsx","count":3,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-9a54a74c58d29d4c","fingerprint":"eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/users/TotpSetupModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/label-has-for","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/TotpSetupModal.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-165a348ebdcecd71","fingerprint":"eslint-bucket:jsx-a11y/media-has-caption:web/js/components/preact/HLSVideoCell.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/media-has-caption","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/HLSVideoCell.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-1760eab07e0cce49","fingerprint":"eslint-bucket:jsx-a11y/media-has-caption:web/js/components/preact/MSEVideoCell.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/media-has-caption","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/MSEVideoCell.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-df0c5f209b6ef6ab","fingerprint":"eslint-bucket:jsx-a11y/media-has-caption:web/js/components/preact/UI.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/media-has-caption","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/UI.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-c464a6c1e23bf196","fingerprint":"eslint-bucket:jsx-a11y/media-has-caption:web/js/components/preact/WebRTCVideoCell.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/media-has-caption","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/WebRTCVideoCell.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-de50a4c99ae7d421","fingerprint":"eslint-bucket:jsx-a11y/media-has-caption:web/js/components/preact/investigation/InvestigationView.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/media-has-caption","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/investigation/InvestigationView.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-7189b497b5a855df","fingerprint":"eslint-bucket:jsx-a11y/media-has-caption:web/js/components/preact/timeline/TimelinePlayer.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/media-has-caption","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/timeline/TimelinePlayer.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-bc4e9a8b10d83163","fingerprint":"eslint-bucket:jsx-a11y/mouse-events-have-key-events:web/js/components/preact/DayNightControl.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/mouse-events-have-key-events","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/DayNightControl.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-c31a4d9816cac7ce","fingerprint":"eslint-bucket:jsx-a11y/mouse-events-have-key-events:web/js/components/preact/HLSVideoCell.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/mouse-events-have-key-events","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/HLSVideoCell.jsx","count":14,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-e715a00f3dbe2f4f","fingerprint":"eslint-bucket:jsx-a11y/mouse-events-have-key-events:web/js/components/preact/SnapshotManager.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/mouse-events-have-key-events","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/SnapshotManager.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-9a70a1ccf37b9405","fingerprint":"eslint-bucket:jsx-a11y/mouse-events-have-key-events:web/js/components/preact/StreamCard.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/mouse-events-have-key-events","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/StreamCard.jsx","count":8,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-e876245abbef0a79","fingerprint":"eslint-bucket:jsx-a11y/mouse-events-have-key-events:web/js/components/preact/StreamsView.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/mouse-events-have-key-events","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/StreamsView.jsx","count":4,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-c811624672d6bfff","fingerprint":"eslint-bucket:jsx-a11y/mouse-events-have-key-events:web/js/components/preact/Toast.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/mouse-events-have-key-events","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/Toast.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-a4f59c579d19ce1e","fingerprint":"eslint-bucket:jsx-a11y/mouse-events-have-key-events:web/js/components/preact/WebRTCVideoCell.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/mouse-events-have-key-events","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/WebRTCVideoCell.jsx","count":18,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-7a540f91903a1e57","fingerprint":"eslint-bucket:jsx-a11y/mouse-events-have-key-events:web/js/components/preact/recordings/RecordingsTable.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/mouse-events-have-key-events","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/recordings/RecordingsTable.jsx","count":10,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-dcdb657c2038e332","fingerprint":"eslint-bucket:jsx-a11y/mouse-events-have-key-events:web/js/components/preact/timeline/TimelinePage.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/mouse-events-have-key-events","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/timeline/TimelinePage.jsx","count":10,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-20016996a3c7e096","fingerprint":"eslint-bucket:jsx-a11y/no-autofocus:web/js/components/preact/AuthGate.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-autofocus","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/AuthGate.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-92718cbd3fc79c29","fingerprint":"eslint-bucket:jsx-a11y/no-autofocus:web/js/components/preact/LoginView.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-autofocus","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/LoginView.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-71520b6429344586","fingerprint":"eslint-bucket:jsx-a11y/no-autofocus:web/js/components/preact/events/EventDestinationEditor.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-autofocus","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/events/EventDestinationEditor.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-82f90000b805b238","fingerprint":"eslint-bucket:jsx-a11y/no-autofocus:web/js/components/preact/events/EventRouteEditor.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-autofocus","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/events/EventRouteEditor.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-2acf09b0886c70c8","fingerprint":"eslint-bucket:jsx-a11y/no-autofocus:web/js/components/preact/fleet/CollectionManager.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-autofocus","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/fleet/CollectionManager.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-e6884093b3a77737","fingerprint":"eslint-bucket:jsx-a11y/no-autofocus:web/js/components/preact/fleet/OrganizationManager.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-autofocus","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/fleet/OrganizationManager.jsx","count":3,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-24d767472f9eac0b","fingerprint":"eslint-bucket:jsx-a11y/no-autofocus:web/js/components/preact/investigation/InvestigationBookmarks.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-autofocus","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/investigation/InvestigationBookmarks.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-6040ad491a730d6d","fingerprint":"eslint-bucket:jsx-a11y/no-autofocus:web/js/components/preact/users/TotpSetupModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-autofocus","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/TotpSetupModal.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-d8c2127f8046b560","fingerprint":"eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/FisheyeEptzCanvas.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-noninteractive-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/FisheyeEptzCanvas.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-e4342be069acaf24","fingerprint":"eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/StreamCard.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-noninteractive-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/StreamCard.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-141e103765b7c505","fingerprint":"eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/ZoneEditor.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-noninteractive-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/ZoneEditor.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-370c727cb2690828","fingerprint":"eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/common/LanguageSelector.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-noninteractive-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/common/LanguageSelector.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-bf7012d93c48094c","fingerprint":"eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/investigation/InvestigationView.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-noninteractive-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/investigation/InvestigationView.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-11c6ba5b7bf02e40","fingerprint":"eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/live/LiveBuildingPlan.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-noninteractive-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/live/LiveBuildingPlan.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-87cfe9ce5d499faf","fingerprint":"eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/live/LiveOperatorNavigator.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-noninteractive-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/live/LiveOperatorNavigator.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-4d679d89b4da6865","fingerprint":"eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/recordings/RecordingsGrid.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-noninteractive-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/recordings/RecordingsGrid.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-d670cad0625d4f2c","fingerprint":"eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/timeline/TimelineCursor.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-noninteractive-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/timeline/TimelineCursor.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-03caeab009bdc4fd","fingerprint":"eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/timeline/TimelineSegments.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-noninteractive-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/timeline/TimelineSegments.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-939df4abd7adefdd","fingerprint":"eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/users/AccessPolicyModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-noninteractive-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/AccessPolicyModal.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-4cf2eab3dda13b90","fingerprint":"eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/users/AddUserModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-noninteractive-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/AddUserModal.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-68103860cfe78d89","fingerprint":"eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/users/ApiKeyModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-noninteractive-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/ApiKeyModal.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-be996c224380b85e","fingerprint":"eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/users/AuditHistoryModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-noninteractive-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/AuditHistoryModal.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-65f403c439392041","fingerprint":"eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/users/EditUserModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-noninteractive-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/EditUserModal.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-752682010e0c301c","fingerprint":"eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/users/RoleManagerModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-noninteractive-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/RoleManagerModal.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-f32c4fd5a51337d3","fingerprint":"eslint-bucket:jsx-a11y/no-noninteractive-tabindex:web/js/components/preact/FisheyeEptzCanvas.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-noninteractive-tabindex","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/FisheyeEptzCanvas.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-d5958c65428cdc31","fingerprint":"eslint-bucket:jsx-a11y/no-noninteractive-tabindex:web/js/components/preact/common/LanguageSelector.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-noninteractive-tabindex","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/common/LanguageSelector.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-45ebdb33421d89d5","fingerprint":"eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/GridPicker.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-static-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/GridPicker.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-d6af678aacfbb026","fingerprint":"eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/HLSVideoCell.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-static-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/HLSVideoCell.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-e48ab90f6d76f69a","fingerprint":"eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/HealthView.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-static-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/HealthView.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-6cf65d94c0e817c8","fingerprint":"eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/LiveView.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-static-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/LiveView.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-d0493f3174391c77","fingerprint":"eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/MSEVideoCell.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-static-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/MSEVideoCell.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-134e1087e8cda477","fingerprint":"eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/StreamCard.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-static-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/StreamCard.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-8a059d804561f236","fingerprint":"eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/StreamConfigModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-static-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/StreamConfigModal.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-21e6c2fa9c26c964","fingerprint":"eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/StreamsView.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-static-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/StreamsView.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-b18881a630321191","fingerprint":"eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/ToastContainer.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-static-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/ToastContainer.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-d9d81163d1e1193d","fingerprint":"eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/UI.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-static-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/UI.jsx","count":3,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-3322f39793a9258c","fingerprint":"eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/WebRTCVideoCell.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-static-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/WebRTCVideoCell.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-6bdf7c909180cb5e","fingerprint":"eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/ZoneEditor.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-static-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/ZoneEditor.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-243fa74ece4acc83","fingerprint":"eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/common/ModalDialog.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-static-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/common/ModalDialog.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-aa87081e964848f0","fingerprint":"eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/fleet/BulkOrganizeModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-static-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/fleet/BulkOrganizeModal.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-b9126919c0a748d2","fingerprint":"eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/fleet/CollectionManager.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-static-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/fleet/CollectionManager.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-ac70bbab0047fa80","fingerprint":"eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/fleet/OrganizationManager.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-static-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/fleet/OrganizationManager.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-23073b0c71d7d2e3","fingerprint":"eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/live/LiveBuildingPlan.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-static-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/live/LiveBuildingPlan.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-be705595f12d1850","fingerprint":"eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/live/LiveOperatorNavigator.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-static-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/live/LiveOperatorNavigator.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-55a74c5d3180cf15","fingerprint":"eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/recordings/RecordingsGrid.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-static-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/recordings/RecordingsGrid.jsx","count":4,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-fd743aa60d9abb1f","fingerprint":"eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/settings/Go2rtcTab.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-static-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/settings/Go2rtcTab.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-fbc7ca1e0083c1d1","fingerprint":"eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/system/ClearLogsModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-static-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/system/ClearLogsModal.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-259ca1824a1d1447","fingerprint":"eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/system/RestartModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-static-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/system/RestartModal.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-c06de8e6c5473e61","fingerprint":"eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/timeline/TimelinePlayer.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-static-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/timeline/TimelinePlayer.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-6bab06cb3c8102a9","fingerprint":"eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/users/AccessPolicyModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-static-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/AccessPolicyModal.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-3ace786e8c2cd1a8","fingerprint":"eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/users/AddUserModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-static-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/AddUserModal.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-08d8785eb7476330","fingerprint":"eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/users/ApiKeyModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-static-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/ApiKeyModal.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-51093f104f4e1cbb","fingerprint":"eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/users/AuditHistoryModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-static-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/AuditHistoryModal.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-7c82f257c4fb1103","fingerprint":"eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/users/DeleteUserModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-static-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/DeleteUserModal.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-c4dd2be3483455e5","fingerprint":"eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/users/EditUserModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-static-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/EditUserModal.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-5c8c07852ed0b107","fingerprint":"eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/users/RoleManagerModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-static-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/RoleManagerModal.jsx","count":1,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"}, + {"id":"ESLINT-BUCKET-e046fbe269eed0dc","fingerprint":"eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/users/TotpSetupModal.jsx","scanner_id":"eslint-web","rule_id":"jsx-a11y/no-static-element-interactions","category":"application","feature_flag":null,"severity":{"tool":"warning","normalized":"low"},"path":"web/js/components/preact/users/TotpSetupModal.jsx","count":2,"owner":"maintainers/web","disposition":"baseline-debt","exception_expiry":"2027-04-30"} + ], + "coverage_gaps": [ + {"id":"GAP-secret-scanning-disabled","scanner_id":"secret-scanning","severity":"high","summary":"Secret scanning, non-provider patterns, validity checks and push protection are disabled; alerts API returns HTTP 404. No secret-scan baseline exists (not a clean result).","evidence":"GET repos/opensensor/lightNVR/secret-scanning/alerts -> 404; repo security_and_analysis flags","owner":"maintainers/security"}, + {"id":"GAP-codeql-not-on-pull-request","scanner_id":"codeql-cpp","severity":"medium","summary":"codeql-analysis.yml triggers on push to main, weekly schedule and dispatch only; SECURITY.md claims CodeQL runs on every PR.","evidence":".github/workflows/codeql-analysis.yml 'on:' block; SECURITY.md","owner":"T14"}, + {"id":"GAP-no-js-ts-sast","scanner_id":"codeql-javascript-typescript","severity":"medium","summary":"No security SAST for web JS/TS (CodeQL matrix is c-cpp only; default setup not-configured). Only GitHub Code Quality (maintainability) inspects web JS. Actions/Python also unscanned.","evidence":"codeql-analysis.yml matrix; GET code-scanning/default-setup -> state not-configured","owner":"T14"}, + {"id":"GAP-scanners-non-blocking","scanner_id":"*","severity":"medium","summary":"All scanners are report-only: clang-tidy forced exit 0, cppcheck --error-exitcode=0, trivy --exit-code 0, jsx-a11y rules are warn; branch protection on main has no required status checks; CodeQL upload is not a gate.","evidence":"static-analysis.yml, container-scan.yml, web/eslint.config.js, GET branches/main/protection (required_status_checks null)","owner":"T6/T14/T15"}, + {"id":"GAP-sast-optional-feature-scope","scanner_id":"codeql-cpp,clang-tidy","severity":"medium","summary":"CodeQL and clang-tidy compile with ENABLE_SOD=OFF ENABLE_GO2RTC=OFF BUILD_TESTS=OFF; LiteRT (submodule not checked out), Sentry and SSL are also off. go2rtc integration sources are therefore not analyzed by CodeQL; 9 dismissed go2rtc_api.c alerts (#19,#20,#69-#71,#75-#78) are unobservable rather than resolved. MQTT/S3 are analyzed only because the full profile enables them by default.","evidence":"workflow cmake flags; CMakeLists.txt options; dismissed alerts with last instance at d123e2f3","owner":"T14"}, + {"id":"GAP-cppcheck-config-coverage","scanner_id":"cppcheck","severity":"low","summary":"cppcheck runs without compile database/defines: 'information' entries (missingInclude, checkLevelNormal, toomanyconfigs) show partial analysis; third-party src/sod is included while clang-tidy excludes it.","evidence":"cppcheck-report.xml information-severity buckets","owner":"T14"}, + {"id":"GAP-eslint-no-artifact","scanner_id":"eslint-web","severity":"low","summary":"jsx-a11y lint output exists only in the job log (stylish format); no machine-readable artifact is uploaded. Issue #647 (WCAG audit) is CLOSED while 897 warnings remain.","evidence":"static-analysis.yml web-jsx-a11y job; job 124465163606 log; gh issue view 647","owner":"T14/T10"}, + {"id":"GAP-trivy-scope","scanner_id":"trivy-container","severity":"medium","summary":"Trivy scans only the linux/amd64 image built from Dockerfile, CRITICAL/HIGH/MEDIUM only, on push/tags (not PRs). arm64/arm-v7 published images, Dockerfile.alpine and the sentry image are not scanned. Raw artifact upload is skipped if the SARIF step fails.","evidence":"container-scan.yml; docker-publish.yml has no scan step","owner":"T14"}, + {"id":"GAP-dependency-coverage","scanner_id":"dependabot","severity":"low","summary":"No .github/dependabot.yml: Dependabot security alerts cover only npm manifests (package.json, package-lock.json, web/package-lock.json). GitHub Actions, go2rtc Go modules (submodule) and Docker base images rely solely on Trivy image scanning. Dependabot lagged npm audit by two advisories published 2026-10-30.","evidence":"GET dependabot/alerts manifest_path histogram; npm audit vs Dependabot reconciliation","owner":"T14"}, + {"id":"GAP-no-codeowners","scanner_id":"*","severity":"low","summary":"No CODEOWNERS file; finding owners are recorded as maintainers/ placeholders until assigned.","evidence":"no .github/CODEOWNERS or CODEOWNERS","owner":"maintainers"} + ], + "summary": { + "itemized_by_scanner_and_category": { + "clang-tidy": { + "third-party": 12, + "application": 235, + "optional-feature": 49 + }, + "codeql-cpp": { + "application": 33, + "third-party": 1, + "optional-feature": 11 + }, + "cppcheck": { + "third-party": 26, + "application": 6 + }, + "dependabot": { + "build-only": 1 + }, + "github-code-quality": { + "application": 1 + }, + "npm-audit-web": { + "build-only": 3 + }, + "repo-security-advisories": { + "application": 6 + } + }, + "bucketed_occurrences_by_scanner": { + "cppcheck": 573, + "eslint-web": 897 + }, + "bucket_count": 359, + "codeql_alert_states": { + "open": 34, + "dismissed": 11 + }, + "npm_audit": { + "root": { + "all": { + "info": 0, + "low": 0, + "moderate": 0, + "high": 0, + "critical": 0, + "total": 0 + }, + "prod": { + "info": 0, + "low": 0, + "moderate": 0, + "high": 0, + "critical": 0, + "total": 0 + }, + "affected_packages": 0 + }, + "web": { + "all": { + "info": 0, + "low": 1, + "moderate": 25, + "high": 0, + "critical": 0, + "total": 26 + }, + "prod": { + "info": 0, + "low": 0, + "moderate": 0, + "high": 0, + "critical": 0, + "total": 0 + }, + "affected_packages": 26 + } + }, + "trivy_results": 0 + } +} diff --git a/quality/scanners.json b/quality/scanners.json new file mode 100644 index 000000000..ccb34d41b --- /dev/null +++ b/quality/scanners.json @@ -0,0 +1,482 @@ +{ + "schema_version": 1, + "producer": "T1", + "generated_at": "2026-10-31", + "repository": "opensensor/lightNVR", + "report_root": "build/eng-artifacts/ (gitignored); T1 raw reports in build/eng-artifacts/T1/", + "access_status_values": { + "accessible": "report retrieved and parsed", + "accessible-log-only": "results only in job log text; no artifact", + "not-configured": "expected scanner has no workflow/setup; absence is NOT a clean result", + "disabled": "feature disabled for repository; API returns 404", + "missing": "expected report absent/expired/crashed for the revision (record http_status/reason)" + }, + "policy_notes_for_T6": [ + "A scanner with access_status other than accessible/accessible-log-only, or with no report at the expected path for the evaluated revision, is a failed check, never an empty pass.", + "A valid empty result requires the report file to exist and parse with the expected tool/run metadata (e.g. Trivy SARIF with runs[0].results == [] and tool version present).", + "Exit codes: clang-tidy/cppcheck/trivy are forced to 0 and npm audit exits 1 on findings; decide success from report contents, not exit codes.", + "Revisions differ per scanner (see last_observed.revision); compare fingerprints, not line numbers." + ], + "fingerprint_schemes": { + "codeql": "codeql:::; fallback codeql-alert: when the instance is not in the current analysis. Line-number independent.", + "code-quality": "code-quality:::sha256(digit-normalized message)[:16]", + "line-tool": ":::sha256('|| N>|')[:16]. Line numbers are excluded so header/SPDX shifts do not churn identity; runner prefix /__w/lightNVR/lightNVR/ is stripped.", + "bucket": "-bucket:: with an integer count; policy compares counts (increase = new finding, decrease = progress requiring baseline edit).", + "sca": ":::", + "secret": "secret::: (never the secret value)", + "advisory": "repo-advisory:sha256(GHSA id)[:16] so private advisory IDs are not disclosed" + }, + "scanners": [ + { + "id": "codeql-cpp", + "tool": "CodeQL", + "tool_version": "2.27.3", + "kind": "sast", + "workflow": ".github/workflows/codeql-analysis.yml", + "job": "analyze (matrix language=c-cpp)", + "triggers": [ + "push:main", + "schedule:weekly Mon 06:00 UTC", + "workflow_dispatch" + ], + "runs_on_pull_request": false, + "report_format": "sarif-2.1.0", + "retrieval": "gh api -H 'Accept: application/sarif+json' repos/opensensor/lightNVR/code-scanning/analyses/; alert states via code-scanning/alerts?state=open|dismissed|fixed", + "scope": { + "languages": [ + "c-cpp" + ], + "query_suite": "security-extended", + "category": "/language:c-cpp", + "build": "cmake -DCMAKE_BUILD_TYPE=Release -DENABLE_SOD=OFF -DENABLE_GO2RTC=OFF -DBUILD_TESTS=OFF (full profile defaults otherwise)", + "excluded": [ + "go2rtc integration sources (ENABLE_GO2RTC=OFF)", + "src/sod (ENABLE_SOD=OFF)", + "LiteRT (submodule not initialized)", + "Sentry (ENABLE_SENTRY default OFF)", + "SSL backends (ENABLE_SSL default OFF)", + "tests/" + ], + "included_third_party": [ + "third_party/faac" + ] + }, + "access_status": "accessible", + "http_status": 200, + "last_observed": { + "revision": "8927bc8a", + "analysis_id": 2067529268, + "results": 35, + "rules": 95, + "open_alerts": 34, + "dismissed_alerts": 11, + "fixed_alerts_total": 300, + "cross_check": "analysis 2067474950 @1b8d4332 has identical 35 (rule,path,lineHash) keys" + }, + "report_path_convention": "build/eng-artifacts//github/codeql-.sarif", + "blocking": false, + "inventory_mode": "itemized", + "fingerprint_scheme": "codeql" + }, + { + "id": "codeql-javascript-typescript", + "tool": "CodeQL", + "kind": "sast", + "workflow": null, + "job": null, + "triggers": [], + "report_format": "sarif-2.1.0", + "scope": { + "languages": [ + "javascript-typescript" + ], + "paths": [ + "web/js/**", + "tests/**/*.ts", + "playwright.config.ts" + ] + }, + "access_status": "not-configured", + "http_status": null, + "reason": "No workflow analyzes JS/TS for security; code-scanning default-setup state=not-configured. Expected scanner to be added by T14.", + "last_observed": null, + "report_path_convention": "build/eng-artifacts//github/codeql-js-.sarif", + "blocking": false, + "inventory_mode": "itemized", + "fingerprint_scheme": "codeql" + }, + { + "id": "github-code-quality", + "tool": "GitHub Code Quality (CodeQL quality queries)", + "kind": "quality", + "workflow": "dynamic GitHub-managed workflow 'CodeQL - Code Quality'", + "job": null, + "triggers": [ + "push:main (GitHub-managed)" + ], + "report_format": "json (REST repos/{repo}/code-quality/findings)", + "retrieval": "gh api 'repos/opensensor/lightNVR/code-quality/findings?per_page=100' --paginate", + "scope": { + "languages": [ + "as configured by GitHub (observed: javascript)" + ] + }, + "access_status": "accessible", + "http_status": 200, + "last_observed": { + "revision": "8927bc8a (run 41178210527)", + "open_findings": 1 + }, + "report_path_convention": "build/eng-artifacts//github/code-quality-findings.json", + "blocking": false, + "inventory_mode": "itemized", + "fingerprint_scheme": "code-quality" + }, + { + "id": "clang-tidy", + "tool": "clang-tidy", + "tool_version": "Debian LLVM 21.1.8 (debian:sid-slim container)", + "kind": "sast/lint", + "workflow": ".github/workflows/static-analysis.yml", + "job": "clang-tidy", + "triggers": [ + "push:main", + "pull_request:main", + "workflow_dispatch" + ], + "report_format": "clang-diagnostic-text (path:line:col: severity: message [check])", + "retrieval": "gh run download -R opensensor/lightNVR -n clang-tidy-report (30-day retention)", + "config": ".clang-tidy (WarningsAsErrors empty; HeaderFilterRegex include/.*\\.h$)", + "scope": { + "files": "find src/ -name '*.c' excluding */sod/* and */ezxml/*", + "compile_db": "cmake Release ENABLE_SOD=OFF ENABLE_GO2RTC=OFF BUILD_TESTS=OFF", + "notes": "258 source files scanned; go2rtc integration files are passed even though ENABLE_GO2RTC=OFF omits them from compile_commands (analyzed with inferred flags)" + }, + "access_status": "accessible", + "http_status": 200, + "last_observed": { + "revision": "1b8d4332", + "workflow_run": 41176542849, + "artifact_id": 13033827361, + "diagnostics": 296, + "errors": 0, + "artifact_expires": "2026-11-30" + }, + "report_path_convention": "build/eng-artifacts//actions/static-analysis-/clang-tidy-report/clang-tidy-report.txt", + "exit_semantics": "report-only: set +e around clang-tidy; job always succeeds; a crashed clang-tidy yields an empty/short report that must be treated as missing", + "blocking": false, + "inventory_mode": "itemized", + "fingerprint_scheme": "line-tool" + }, + { + "id": "cppcheck", + "tool": "cppcheck", + "tool_version": "2.13.0", + "kind": "sast/lint", + "workflow": ".github/workflows/static-analysis.yml", + "job": "cppcheck", + "triggers": [ + "push:main", + "pull_request:main", + "workflow_dispatch" + ], + "report_format": "cppcheck-xml-v2 (+ text template)", + "retrieval": "gh run download -R opensensor/lightNVR -n cppcheck-reports", + "scope": { + "paths": [ + "src/ (including third-party src/sod, src/ezxml)" + ], + "includes": [ + "include/" + ], + "options": "--enable=all --suppress=missingIncludeSystem --suppress=unusedFunction --inline-suppr", + "compile_db": null + }, + "access_status": "accessible", + "http_status": 200, + "last_observed": { + "revision": "1b8d4332", + "workflow_run": 41176542849, + "artifact_id": 13033507116, + "results": 605, + "by_severity": { + "error": 17, + "warning": 13, + "portability": 2, + "style": 547, + "information": 26 + } + }, + "report_path_convention": "build/eng-artifacts//actions/static-analysis-/cppcheck-reports/cppcheck-report.xml", + "exit_semantics": "report-only: --error-exitcode=0", + "blocking": false, + "inventory_mode": "itemized for error/warning/portability; bucketed (rule,path,count) for style/information", + "fingerprint_scheme": "line-tool / bucket" + }, + { + "id": "eslint-web", + "tool": "eslint + eslint-plugin-jsx-a11y (recommended, all warn) + lightnvr-i18n/no-literal-ui-string (error)", + "kind": "lint/a11y", + "workflow": ".github/workflows/static-analysis.yml", + "job": "web-jsx-a11y (npm run lint --prefix web)", + "triggers": [ + "push:main", + "pull_request:main", + "workflow_dispatch" + ], + "report_format": "eslint stylish text in job log only (no artifact)", + "retrieval": "gh run view -R opensensor/lightNVR --job --log", + "config": "web/eslint.config.js", + "scope": { + "paths": [ + "web/js/**/*.js", + "web/js/**/*.jsx" + ] + }, + "access_status": "accessible-log-only", + "http_status": 200, + "last_observed": { + "revision": "1b8d4332", + "workflow_run": 41176542849, + "job_id": 124465163606, + "warnings": 897, + "errors": 0 + }, + "report_path_convention": "build/eng-artifacts//actions/static-analysis-/web-jsx-a11y.log (T14 target: eslint -f json artifact)", + "exit_semantics": "warnings never fail; only the i18n rule is an error", + "blocking": "partial (i18n rule only)", + "inventory_mode": "bucketed (rule,path,count)", + "fingerprint_scheme": "bucket" + }, + { + "id": "trivy-container", + "tool": "Trivy", + "tool_version": "0.76.1 (apt repo latest at run time; vuln DB version not recorded)", + "kind": "container/sca", + "workflow": ".github/workflows/container-scan.yml", + "job": "trivy", + "triggers": [ + "push:main", + "push:tags *.*.*", + "workflow_dispatch" + ], + "runs_on_pull_request": false, + "report_format": "sarif-2.1.0", + "retrieval": "artifact trivy-scan-results, or code-scanning analyses (category container-scanning)", + "scope": { + "image": "lightnvr:scan built from ./Dockerfile", + "platforms": [ + "linux/amd64" + ], + "severities": [ + "CRITICAL", + "HIGH", + "MEDIUM" + ], + "not_scanned": [ + "linux/arm64 and linux/arm/v7 images from docker-publish.yml", + "Dockerfile.alpine", + "opensensor-sentry-image.yml image", + ".devcontainer/Dockerfile" + ] + }, + "access_status": "accessible", + "http_status": 200, + "last_observed": { + "revision": "1b8d4332", + "workflow_run": 41176542798, + "analysis_id": 2067494754, + "results": 0, + "history": "7 go2rtc Go-module CVEs (golang.org/x/crypto, golang.org/x/net) reported through b38e91c3 were fixed 2026-10-29" + }, + "report_path_convention": "build/eng-artifacts//actions/container-scan-/trivy-results.sarif", + "exit_semantics": "report-only: --exit-code 0; SARIF/artifact upload skipped when the scan step fails (missing report must fail policy)", + "blocking": false, + "inventory_mode": "itemized", + "fingerprint_scheme": "sca" + }, + { + "id": "dependabot", + "tool": "GitHub Dependabot alerts", + "kind": "sca", + "workflow": null, + "job": null, + "triggers": [ + "GitHub-managed on dependency graph change / advisory publication" + ], + "report_format": "json (REST repos/{repo}/dependabot/alerts)", + "retrieval": "gh api 'repos/opensensor/lightNVR/dependabot/alerts?per_page=100&state=open' --paginate", + "scope": { + "manifests": [ + "package.json", + "package-lock.json", + "web/package-lock.json" + ], + "config_file": null, + "not_covered": [ + "GitHub Actions", + "go2rtc Go modules (submodule)", + "Docker base images", + "C system libraries" + ] + }, + "access_status": "accessible", + "http_status": 200, + "last_observed": { + "date": "2026-10-31", + "open": 1, + "fixed": 87, + "total": 88 + }, + "report_path_convention": "build/eng-artifacts//github/dependabot-open.json", + "blocking": false, + "inventory_mode": "itemized", + "fingerprint_scheme": "sca" + }, + { + "id": "npm-audit-root", + "tool": "npm audit", + "tool_version": "npm 11.19.1 / node 24.22.1", + "kind": "sca", + "workflow": null, + "job": null, + "triggers": [ + "manual (T1); T14 to add CI job" + ], + "report_format": "npm-audit-json (auditReportVersion 2)", + "retrieval": "npm audit --package-lock-only --json [--omit=dev]", + "scope": { + "lockfile": "package-lock.json", + "variants": [ + "all", + "prod (--omit=dev)" + ] + }, + "access_status": "accessible", + "http_status": 200, + "last_observed": { + "date": "2026-10-31", + "all_total": 0, + "prod_total": 0, + "dependencies": 36, + "note": "valid empty result (dev-only Playwright/sharp tree)" + }, + "report_path_convention": "build/eng-artifacts//npm/root-audit-{all,prod}.json", + "blocking": false, + "inventory_mode": "itemized", + "fingerprint_scheme": "sca" + }, + { + "id": "npm-audit-web", + "tool": "npm audit", + "tool_version": "npm 11.19.1 / node 24.22.1", + "kind": "sca", + "workflow": null, + "job": null, + "triggers": [ + "manual (T1); T14 to add CI job" + ], + "report_format": "npm-audit-json (auditReportVersion 2)", + "retrieval": "cd web && npm audit --package-lock-only --json [--omit=dev]", + "scope": { + "lockfile": "web/package-lock.json", + "variants": [ + "all", + "prod (--omit=dev)" + ] + }, + "access_status": "accessible", + "http_status": 200, + "last_observed": { + "date": "2026-10-31", + "all_total_packages": 26, + "all_by_severity": { + "low": 1, + "moderate": 25 + }, + "root_advisories": 3, + "prod_total": 0, + "dependencies": 1145 + }, + "report_path_convention": "build/eng-artifacts//npm/web-audit-{all,prod}.json", + "exit_semantics": "npm audit exits 1 when vulnerabilities exist; exit status is not scan failure \u2014 parse JSON 'error' key for failures", + "blocking": false, + "inventory_mode": "itemized per (package, advisory) root cause; propagated parents not itemized", + "fingerprint_scheme": "sca" + }, + { + "id": "secret-scanning", + "tool": "GitHub secret scanning", + "kind": "secrets", + "workflow": null, + "job": null, + "triggers": [], + "report_format": "json (REST repos/{repo}/secret-scanning/alerts)", + "scope": { + "repository": "all branches/history once enabled" + }, + "access_status": "disabled", + "http_status": 404, + "reason": "API: 'Secret scanning is disabled on this repository.' security_and_analysis: secret_scanning, push_protection, non_provider_patterns, validity_checks all disabled. No local secret scanner (gitleaks/trufflehog) is installed or in CI.", + "last_observed": null, + "report_path_convention": "build/eng-artifacts//github/secret-scanning-alerts.json", + "blocking": false, + "inventory_mode": "itemized (rule id + location only; never secret values)", + "fingerprint_scheme": "secret" + }, + { + "id": "repo-security-advisories", + "tool": "GitHub repository security advisories", + "kind": "advisories", + "workflow": null, + "job": null, + "triggers": [ + "maintainer/PVR reports" + ], + "report_format": "json (REST repos/{repo}/security-advisories)", + "scope": { + "private_vulnerability_reporting": "enabled" + }, + "access_status": "accessible (admin)", + "http_status": 200, + "last_observed": { + "date": "2026-10-31", + "published": 3, + "draft": 2, + "closed": 1 + }, + "report_path_convention": "build/eng-artifacts//github/repo-security-advisories.json (gitignored; contains private drafts)", + "blocking": false, + "inventory_mode": "itemized; non-published records use sanitized IDs", + "fingerprint_scheme": "advisory" + }, + { + "id": "sanitizer-asan-ubsan", + "tool": "GCC ASan+UBSan via ctest", + "kind": "dynamic/gate", + "workflow": ".github/workflows/sanitizer.yml", + "job": "asan-ubsan", + "triggers": [ + "push:main", + "pull_request:main", + "workflow_dispatch" + ], + "report_format": "job conclusion + ctest log (no artifact)", + "scope": { + "tests": "explicit ctest -R allow-list of 42 unit tests + 15 s startup smoke", + "build": "Debug BUILD_TESTS=ON ENABLE_SOD=OFF ENABLE_GO2RTC=OFF ENABLE_MQTT=OFF" + }, + "access_status": "accessible", + "http_status": 200, + "last_observed": { + "revision": "1b8d4332 and 8927bc8a", + "conclusion": "success", + "findings": 0 + }, + "report_path_convention": "build/eng-artifacts//actions/sanitizer-.log", + "blocking": "fails job on sanitizer error but not a required check", + "inventory_mode": "pass/fail gate (no finding records)", + "fingerprint_scheme": null + } + ] +} From 8d715d7fbdf67b243a782ce3b2aaf6f55d7c4dd8 Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Sat, 31 Oct 2026 03:02:17 -0400 Subject: [PATCH 003/230] T2: Map application, API, and rename ownership Inventory all 193 web/js files with proposed domain owners, import graph, entrypoints, shared i18n/auth/toast/modal/ZoneEditor/query consumers, tests, and extension-sensitive test/config consumers. Map 297 UI operations onto the 239 registered C routes (first-match router semantics) with 10 recorded discrepancies, Streams summary/full/role variants and list/edit option dependencies for T11, and the PR #691 Live compatibility behavior. Co-Authored-By: Claude Opus 5.5 --- quality/api-inventory.json | 7963 +++++++++++++++++++++++++++ quality/application-inventory.json | 8163 ++++++++++++++++++++++++++++ quality/evidence/T2.md | 206 + 3 files changed, 16332 insertions(+) create mode 100644 quality/api-inventory.json create mode 100644 quality/application-inventory.json create mode 100644 quality/evidence/T2.md diff --git a/quality/api-inventory.json b/quality/api-inventory.json new file mode 100644 index 000000000..1967e7fd0 --- /dev/null +++ b/quality/api-inventory.json @@ -0,0 +1,7963 @@ +{ + "schema_version": 1, + "task": "T2", + "generated_at": "2026-10-31", + "revision": "ff6a7d60", + "routing": { + "registration": "src/web/libuv_api_handlers.c register_all_libuv_handlers() (called from src/core/main.c); sole call site of http_server_register_handler besides its definition in src/web/libuv_server.c.", + "dispatch": "src/web/libuv_connection.c on_message_complete(): iterate handlers in registration order; skip when method differs (empty = any); first path_matches_pattern() hit wins. \"#\" matches a possibly-empty run of non-\"/\" characters, \"*\" matches the rest. Dot segments (incl. percent-encoded) are rejected with 400 before dispatch. /go2rtc and /go2rtc/* always go to the go2rtc proxy thread. No match => static_file_resolve_handler (web root, 404 JSON when missing).", + "backend": "HTTP_BACKEND=libuv is the only CMake option.", + "route_count": 239, + "shadowing_hazards": [], + "duplicate_registrations": {} + }, + "routes": [ + { + "order": 1, + "method": "GET", + "pattern": "/api/setup/status", + "handler": "handle_get_setup_status", + "registered_at": "src/web/libuv_api_handlers.c:96", + "handler_defined_at": "src/web/api_handlers_setup.c:33", + "ui_consumers": [ + "web/js/pages/index-page.jsx:41" + ], + "integration_tests_referencing_path": [ + "tests/integration/fixtures/test-fixtures.ts", + "tests/integration/specs/camera-favorites.ui.spec.ts", + "tests/integration/specs/detection-overlay-requests.ui.spec.ts", + "tests/integration/specs/live-inventory-refresh.ui.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 2, + "method": "POST", + "pattern": "/api/setup/status", + "handler": "handle_post_setup_complete", + "registered_at": "src/web/libuv_api_handlers.c:97", + "handler_defined_at": "src/web/api_handlers_setup.c:69", + "ui_consumers": [ + "web/js/components/preact/SetupWizard.jsx:281", + "web/js/components/preact/SetupWizard.jsx:330", + "web/js/components/preact/settings/GeneralTab.jsx:190" + ], + "integration_tests_referencing_path": [ + "tests/integration/fixtures/test-fixtures.ts", + "tests/integration/specs/camera-favorites.ui.spec.ts", + "tests/integration/specs/detection-overlay-requests.ui.spec.ts", + "tests/integration/specs/live-inventory-refresh.ui.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 3, + "method": "GET", + "pattern": "/api/health", + "handler": "handle_get_health", + "registered_at": "src/web/libuv_api_handlers.c:100", + "handler_defined_at": "src/web/api_handlers_health.c:238", + "ui_consumers": [ + "web/js/components/preact/HealthView.jsx:156", + "web/js/components/preact/HealthView.jsx:162", + "web/js/components/preact/system/WebServiceInfo.jsx:34" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/comprehensive.api.spec.ts", + "tests/integration/specs/system-health.api.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 4, + "method": "GET", + "pattern": "/api/health/hls", + "handler": "handle_get_hls_health", + "registered_at": "src/web/libuv_api_handlers.c:101", + "handler_defined_at": "src/web/api_handlers_health.c:533", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 5, + "method": "GET", + "pattern": "/api/metrics", + "handler": "handle_get_metrics", + "registered_at": "src/web/libuv_api_handlers.c:104", + "handler_defined_at": "src/web/api_handlers_metrics.c:1077", + "ui_consumers": [], + "integration_tests_referencing_path": [ + "tests/integration/specs/system-health-mqtt.api.spec.ts", + "tests/integration/specs/system-health.api.spec.ts" + ], + "has_ui_consumer": false + }, + { + "order": 6, + "method": "POST", + "pattern": "/api/telemetry/player", + "handler": "handle_post_player_telemetry", + "registered_at": "src/web/libuv_api_handlers.c:105", + "handler_defined_at": "src/web/api_handlers_metrics.c:1265", + "ui_consumers": [ + "web/js/utils/player-telemetry.js:37", + "web/js/utils/player-telemetry.js:39" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 7, + "method": "POST", + "pattern": "/api/motion/trigger", + "handler": "handle_post_motion_trigger", + "registered_at": "src/web/libuv_api_handlers.c:108", + "handler_defined_at": "src/web/api_handlers_motion.c:324", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 8, + "method": "GET", + "pattern": "/api/streams", + "handler": "handle_get_streams", + "registered_at": "src/web/libuv_api_handlers.c:111", + "handler_defined_at": "src/web/api_handlers_streams_get.c:444", + "ui_consumers": [ + "web/js/components/preact/StreamsView.jsx:199", + "web/js/utils/stream-summaries.js:24" + ], + "integration_tests_referencing_path": [ + "tests/integration/fixtures/test-fixtures.ts", + "tests/integration/go2rtc.api.spec.ts", + "tests/integration/lightnvr.api.spec.ts", + "tests/integration/pages/StreamsPage.ts", + "tests/integration/specs/camera-favorites.ui.spec.ts", + "tests/integration/specs/comprehensive.api.spec.ts", + "tests/integration/specs/detection-overlay-requests.ui.spec.ts", + "tests/integration/specs/live-inventory-refresh.ui.spec.ts", + "tests/integration/specs/liveview.ui.spec.ts", + "tests/integration/specs/stream-snapshot-requests.ui.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 9, + "method": "POST", + "pattern": "/api/streams", + "handler": "handle_post_stream", + "registered_at": "src/web/libuv_api_handlers.c:112", + "handler_defined_at": "src/web/api_handlers_streams_modify.c:562", + "ui_consumers": [ + "web/js/components/preact/StreamsView.jsx:358" + ], + "integration_tests_referencing_path": [ + "tests/integration/fixtures/test-fixtures.ts", + "tests/integration/go2rtc.api.spec.ts", + "tests/integration/lightnvr.api.spec.ts", + "tests/integration/pages/StreamsPage.ts", + "tests/integration/specs/camera-favorites.ui.spec.ts", + "tests/integration/specs/comprehensive.api.spec.ts", + "tests/integration/specs/detection-overlay-requests.ui.spec.ts", + "tests/integration/specs/live-inventory-refresh.ui.spec.ts", + "tests/integration/specs/liveview.ui.spec.ts", + "tests/integration/specs/stream-snapshot-requests.ui.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 10, + "method": "POST", + "pattern": "/api/streams/test", + "handler": "handle_test_stream", + "registered_at": "src/web/libuv_api_handlers.c:113", + "handler_defined_at": "src/web/api_handlers_streams_test.c:140", + "ui_consumers": [ + "web/js/components/preact/StreamsView.jsx:406" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/comprehensive.api.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 11, + "method": "GET", + "pattern": "/api/locations", + "handler": "handle_get_locations", + "registered_at": "src/web/libuv_api_handlers.c:116", + "handler_defined_at": "src/web/api_handlers_locations.c:272", + "ui_consumers": [ + "web/js/components/preact/EventRoutingView.jsx:125", + "web/js/components/preact/FleetView.jsx:151", + "web/js/components/preact/live/LiveOperatorNavigator.jsx:97", + "web/js/components/preact/settings/StorageTab.jsx:560", + "web/js/components/preact/users/AccessPolicyModal.jsx:186", + "web/js/components/preact/users/ApiKeyModal.jsx:149" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/api-tokens.ui.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 12, + "method": "POST", + "pattern": "/api/locations", + "handler": "handle_post_location", + "registered_at": "src/web/libuv_api_handlers.c:117", + "handler_defined_at": "src/web/api_handlers_locations.c:371", + "ui_consumers": [ + "web/js/components/preact/fleet/OrganizationManager.jsx:25" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/api-tokens.ui.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 13, + "method": "GET", + "pattern": "/api/locations/#", + "handler": "handle_get_location", + "registered_at": "src/web/libuv_api_handlers.c:118", + "handler_defined_at": "src/web/api_handlers_locations.c:398", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 14, + "method": "PUT", + "pattern": "/api/locations/#", + "handler": "handle_put_location", + "registered_at": "src/web/libuv_api_handlers.c:119", + "handler_defined_at": "src/web/api_handlers_locations.c:444", + "ui_consumers": [ + "web/js/components/preact/fleet/OrganizationManager.jsx:25" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 15, + "method": "DELETE", + "pattern": "/api/locations/#", + "handler": "handle_delete_location", + "registered_at": "src/web/libuv_api_handlers.c:120", + "handler_defined_at": "src/web/api_handlers_locations.c:476", + "ui_consumers": [ + "web/js/components/preact/fleet/OrganizationManager.jsx:89" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 16, + "method": "PUT", + "pattern": "/api/cameras/#/location", + "handler": "handle_put_camera_location", + "registered_at": "src/web/libuv_api_handlers.c:121", + "handler_defined_at": "src/web/api_handlers_locations.c:490", + "ui_consumers": [ + "web/js/components/preact/fleet/fleetOrganization.js:100" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 17, + "method": "GET", + "pattern": "/api/live/plans", + "handler": "handle_get_operator_floor_plans", + "registered_at": "src/web/libuv_api_handlers.c:125", + "handler_defined_at": "src/web/api_handlers_operator_floor_plans.c:634", + "ui_consumers": [ + "web/js/components/preact/live/LiveBuildingPlan.jsx:207", + "web/js/components/preact/live/LiveOperatorNavigator.jsx:107" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 18, + "method": "POST", + "pattern": "/api/live/plans", + "handler": "handle_post_operator_floor_plan", + "registered_at": "src/web/libuv_api_handlers.c:127", + "handler_defined_at": "src/web/api_handlers_operator_floor_plans.c:727", + "ui_consumers": [ + "web/js/components/preact/live/LiveBuildingPlan.jsx:318" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 19, + "method": "GET", + "pattern": "/api/live/plans/#/background", + "handler": "handle_get_operator_floor_plan_background", + "registered_at": "src/web/libuv_api_handlers.c:130", + "handler_defined_at": "src/web/api_handlers_operator_floor_plans.c:948", + "ui_consumers": [ + "web/js/components/preact/live/LiveBuildingPlan.jsx:67" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 20, + "method": "PUT", + "pattern": "/api/live/plans/#/background", + "handler": "handle_put_operator_floor_plan_background", + "registered_at": "src/web/libuv_api_handlers.c:132", + "handler_defined_at": "src/web/api_handlers_operator_floor_plans.c:985", + "ui_consumers": [ + "web/js/components/preact/live/LiveBuildingPlan.jsx:408" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 21, + "method": "DELETE", + "pattern": "/api/live/plans/#/background", + "handler": "handle_delete_operator_floor_plan_background", + "registered_at": "src/web/libuv_api_handlers.c:134", + "handler_defined_at": "src/web/api_handlers_operator_floor_plans.c:1092", + "ui_consumers": [ + "web/js/components/preact/live/LiveBuildingPlan.jsx:460" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 22, + "method": "GET", + "pattern": "/api/live/plans/#", + "handler": "handle_get_operator_floor_plan", + "registered_at": "src/web/libuv_api_handlers.c:137", + "handler_defined_at": "src/web/api_handlers_operator_floor_plans.c:686", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 23, + "method": "PUT", + "pattern": "/api/live/plans/#", + "handler": "handle_put_operator_floor_plan", + "registered_at": "src/web/libuv_api_handlers.c:139", + "handler_defined_at": "src/web/api_handlers_operator_floor_plans.c:760", + "ui_consumers": [ + "web/js/components/preact/live/LiveBuildingPlan.jsx:350", + "web/js/components/preact/live/LiveBuildingPlan.jsx:433", + "web/js/components/preact/live/LiveBuildingPlan.jsx:660" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 24, + "method": "DELETE", + "pattern": "/api/live/plans/#", + "handler": "handle_delete_operator_floor_plan", + "registered_at": "src/web/libuv_api_handlers.c:141", + "handler_defined_at": "src/web/api_handlers_operator_floor_plans.c:801", + "ui_consumers": [ + "web/js/components/preact/live/LiveBuildingPlan.jsx:371" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 25, + "method": "GET", + "pattern": "/api/camera-tags", + "handler": "handle_get_camera_tags", + "registered_at": "src/web/libuv_api_handlers.c:144", + "handler_defined_at": "src/web/api_handlers_camera_tags.c:216", + "ui_consumers": [ + "web/js/components/preact/EventRoutingView.jsx:126", + "web/js/components/preact/FleetView.jsx:159", + "web/js/components/preact/settings/StorageTab.jsx:561", + "web/js/components/preact/users/AccessPolicyModal.jsx:187", + "web/js/components/preact/users/ApiKeyModal.jsx:150" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/api-tokens.ui.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 26, + "method": "POST", + "pattern": "/api/camera-tags", + "handler": "handle_post_camera_tag", + "registered_at": "src/web/libuv_api_handlers.c:146", + "handler_defined_at": "src/web/api_handlers_camera_tags.c:284", + "ui_consumers": [ + "web/js/components/preact/fleet/OrganizationManager.jsx:177" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/api-tokens.ui.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 27, + "method": "POST", + "pattern": "/api/camera-tags/#/merge", + "handler": "handle_post_camera_tag_merge", + "registered_at": "src/web/libuv_api_handlers.c:148", + "handler_defined_at": "src/web/api_handlers_camera_tags.c:369", + "ui_consumers": [ + "web/js/components/preact/fleet/OrganizationManager.jsx:172" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 28, + "method": "GET", + "pattern": "/api/camera-tags/#", + "handler": "handle_get_camera_tag", + "registered_at": "src/web/libuv_api_handlers.c:150", + "handler_defined_at": "src/web/api_handlers_camera_tags.c:306", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 29, + "method": "PUT", + "pattern": "/api/camera-tags/#", + "handler": "handle_put_camera_tag", + "registered_at": "src/web/libuv_api_handlers.c:152", + "handler_defined_at": "src/web/api_handlers_camera_tags.c:329", + "ui_consumers": [ + "web/js/components/preact/fleet/OrganizationManager.jsx:177" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 30, + "method": "DELETE", + "pattern": "/api/camera-tags/#", + "handler": "handle_delete_camera_tag", + "registered_at": "src/web/libuv_api_handlers.c:154", + "handler_defined_at": "src/web/api_handlers_camera_tags.c:357", + "ui_consumers": [ + "web/js/components/preact/fleet/OrganizationManager.jsx:237" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 31, + "method": "GET", + "pattern": "/api/cameras/#/tags", + "handler": "handle_get_camera_tag_assignments", + "registered_at": "src/web/libuv_api_handlers.c:156", + "handler_defined_at": "src/web/api_handlers_camera_tags.c:453", + "ui_consumers": [ + "web/js/components/preact/fleet/fleetOrganization.js:110" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 32, + "method": "PUT", + "pattern": "/api/cameras/#/tags", + "handler": "handle_put_camera_tag_assignments", + "registered_at": "src/web/libuv_api_handlers.c:158", + "handler_defined_at": "src/web/api_handlers_camera_tags.c:463", + "ui_consumers": [ + "web/js/components/preact/fleet/fleetOrganization.js:122" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 33, + "method": "POST", + "pattern": "/api/fleet/cameras/query", + "handler": "handle_post_fleet_camera_query", + "registered_at": "src/web/libuv_api_handlers.c:162", + "handler_defined_at": "src/web/api_handlers_fleet.c:870", + "ui_consumers": [ + "web/js/components/preact/FleetView.jsx:134", + "web/js/components/preact/fleet/CollectionSelectorBuilder.jsx:52", + "web/js/components/preact/fleet/CollectionSelectorBuilder.jsx:88", + "web/js/components/preact/fleet/StaticCollectionMembers.jsx:29", + "web/js/components/preact/fleet/collectionMembership.js:14" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/camera-favorites.ui.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 34, + "method": "POST", + "pattern": "/api/fleet/selectors/preview", + "handler": "handle_post_fleet_selector_preview", + "registered_at": "src/web/libuv_api_handlers.c:164", + "handler_defined_at": "src/web/api_handlers_fleet.c:875", + "ui_consumers": [ + "web/js/components/preact/fleet/CollectionSelectorBuilder.jsx:306" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 35, + "method": "GET", + "pattern": "/api/fleet/views", + "handler": "handle_get_fleet_saved_views", + "registered_at": "src/web/libuv_api_handlers.c:166", + "handler_defined_at": "src/web/api_handlers_fleet_views.c:220", + "ui_consumers": [ + "web/js/components/preact/FleetView.jsx:173" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 36, + "method": "POST", + "pattern": "/api/fleet/views", + "handler": "handle_post_fleet_saved_view", + "registered_at": "src/web/libuv_api_handlers.c:168", + "handler_defined_at": "src/web/api_handlers_fleet_views.c:258", + "ui_consumers": [ + "web/js/components/preact/fleet/SavedViewsBar.jsx:33" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 37, + "method": "GET", + "pattern": "/api/fleet/views/#", + "handler": "handle_get_fleet_saved_view", + "registered_at": "src/web/libuv_api_handlers.c:170", + "handler_defined_at": "src/web/api_handlers_fleet_views.c:298", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 38, + "method": "PUT", + "pattern": "/api/fleet/views/#", + "handler": "handle_put_fleet_saved_view", + "registered_at": "src/web/libuv_api_handlers.c:172", + "handler_defined_at": "src/web/api_handlers_fleet_views.c:310", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 39, + "method": "DELETE", + "pattern": "/api/fleet/views/#", + "handler": "handle_delete_fleet_saved_view", + "registered_at": "src/web/libuv_api_handlers.c:174", + "handler_defined_at": "src/web/api_handlers_fleet_views.c:356", + "ui_consumers": [ + "web/js/components/preact/fleet/SavedViewsBar.jsx:54" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 40, + "method": "GET", + "pattern": "/api/live/layouts", + "handler": "handle_get_live_layouts", + "registered_at": "src/web/libuv_api_handlers.c:178", + "handler_defined_at": "src/web/api_handlers_live_layouts.c:286", + "ui_consumers": [ + "web/js/components/preact/live/LiveOperatorNavigator.jsx:102" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 41, + "method": "POST", + "pattern": "/api/live/layouts", + "handler": "handle_post_live_layout", + "registered_at": "src/web/libuv_api_handlers.c:180", + "handler_defined_at": "src/web/api_handlers_live_layouts.c:332", + "ui_consumers": [ + "web/js/components/preact/live/LiveOperatorNavigator.jsx:235" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 42, + "method": "PUT", + "pattern": "/api/live/layouts/#", + "handler": "handle_put_live_layout", + "registered_at": "src/web/libuv_api_handlers.c:182", + "handler_defined_at": "src/web/api_handlers_live_layouts.c:361", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 43, + "method": "DELETE", + "pattern": "/api/live/layouts/#", + "handler": "handle_delete_live_layout", + "registered_at": "src/web/libuv_api_handlers.c:184", + "handler_defined_at": "src/web/api_handlers_live_layouts.c:412", + "ui_consumers": [ + "web/js/components/preact/live/LiveOperatorNavigator.jsx:265" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 44, + "method": "GET", + "pattern": "/api/camera-favorites", + "handler": "handle_get_camera_favorites", + "registered_at": "src/web/libuv_api_handlers.c:188", + "handler_defined_at": "src/web/api_handlers_camera_favorites.c:121", + "ui_consumers": [ + "web/js/components/preact/live/cameraFavorites.js:47" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/camera-favorites.ui.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 45, + "method": "PUT", + "pattern": "/api/camera-favorites/#", + "handler": "handle_put_camera_favorite", + "registered_at": "src/web/libuv_api_handlers.c:190", + "handler_defined_at": "src/web/api_handlers_camera_favorites.c:166", + "ui_consumers": [ + "web/js/components/preact/live/cameraFavorites.js:41" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 46, + "method": "DELETE", + "pattern": "/api/camera-favorites/#", + "handler": "handle_delete_camera_favorite", + "registered_at": "src/web/libuv_api_handlers.c:192", + "handler_defined_at": "src/web/api_handlers_camera_favorites.c:199", + "ui_consumers": [ + "web/js/components/preact/live/cameraFavorites.js:41" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 47, + "method": "GET", + "pattern": "/api/camera-collections", + "handler": "handle_get_camera_collections", + "registered_at": "src/web/libuv_api_handlers.c:196", + "handler_defined_at": "src/web/api_handlers_camera_collections.c:366", + "ui_consumers": [ + "web/js/components/preact/FleetView.jsx:167", + "web/js/components/preact/RecordingsView.jsx:82", + "web/js/components/preact/fleet/collectionMembership.js:42", + "web/js/components/preact/users/AccessPolicyModal.jsx:185", + "web/js/components/preact/users/ApiKeyModal.jsx:148" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/api-tokens.ui.spec.ts", + "tests/integration/specs/camera-favorites.ui.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 48, + "method": "POST", + "pattern": "/api/camera-collections", + "handler": "handle_post_camera_collection", + "registered_at": "src/web/libuv_api_handlers.c:198", + "handler_defined_at": "src/web/api_handlers_camera_collections.c:450", + "ui_consumers": [ + "web/js/components/preact/fleet/CollectionManager.jsx:40" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/api-tokens.ui.spec.ts", + "tests/integration/specs/camera-favorites.ui.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 49, + "method": "GET", + "pattern": "/api/camera-collections/#/members", + "handler": "handle_get_camera_collection_members", + "registered_at": "src/web/libuv_api_handlers.c:200", + "handler_defined_at": "src/web/api_handlers_camera_collections.c:536", + "ui_consumers": [ + "web/js/components/preact/fleet/CollectionManager.jsx:193" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 50, + "method": "PUT", + "pattern": "/api/camera-collections/#/members", + "handler": "handle_put_camera_collection_members", + "registered_at": "src/web/libuv_api_handlers.c:202", + "handler_defined_at": "src/web/api_handlers_camera_collections.c:608", + "ui_consumers": [ + "web/js/components/preact/fleet/CollectionManager.jsx:48" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 51, + "method": "POST", + "pattern": "/api/camera-collections/#/preview", + "handler": "handle_post_camera_collection_preview", + "registered_at": "src/web/libuv_api_handlers.c:204", + "handler_defined_at": "src/web/api_handlers_camera_collections.c:665", + "ui_consumers": [ + "web/js/components/preact/fleet/CollectionManager.jsx:177" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 52, + "method": "GET", + "pattern": "/api/camera-collections/#", + "handler": "handle_get_camera_collection", + "registered_at": "src/web/libuv_api_handlers.c:206", + "handler_defined_at": "src/web/api_handlers_camera_collections.c:474", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 53, + "method": "PUT", + "pattern": "/api/camera-collections/#", + "handler": "handle_put_camera_collection", + "registered_at": "src/web/libuv_api_handlers.c:208", + "handler_defined_at": "src/web/api_handlers_camera_collections.c:495", + "ui_consumers": [ + "web/js/components/preact/fleet/CollectionManager.jsx:40" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 54, + "method": "DELETE", + "pattern": "/api/camera-collections/#", + "handler": "handle_delete_camera_collection", + "registered_at": "src/web/libuv_api_handlers.c:210", + "handler_defined_at": "src/web/api_handlers_camera_collections.c:523", + "ui_consumers": [ + "web/js/components/preact/fleet/CollectionManager.jsx:206" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 55, + "method": "GET", + "pattern": "/api/streams/#/recording", + "handler": "handle_get_stream_recording", + "registered_at": "src/web/libuv_api_handlers.c:214", + "handler_defined_at": "src/web/api_handlers_recording_control.c:90", + "ui_consumers": [ + "web/js/components/preact/ManualRecordingButton.jsx:10" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 56, + "method": "POST", + "pattern": "/api/streams/#/recording", + "handler": "handle_post_stream_recording", + "registered_at": "src/web/libuv_api_handlers.c:216", + "handler_defined_at": "src/web/api_handlers_recording_control.c:139", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 57, + "method": "GET", + "pattern": "/api/streams/#/zones", + "handler": "handle_get_zones", + "registered_at": "src/web/libuv_api_handlers.c:220", + "handler_defined_at": "src/web/api_handlers_zones.c:26", + "ui_consumers": [ + "web/js/components/preact/DetectionOverlay.jsx:43", + "web/js/components/preact/StreamConfigModal.jsx:336", + "web/js/components/preact/ZoneEditor.jsx:53" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 58, + "method": "POST", + "pattern": "/api/streams/#/zones", + "handler": "handle_post_zones", + "registered_at": "src/web/libuv_api_handlers.c:221", + "handler_defined_at": "src/web/api_handlers_zones.c:114", + "ui_consumers": [ + "web/js/components/preact/ZoneEditor.jsx:481" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 59, + "method": "DELETE", + "pattern": "/api/streams/#/zones", + "handler": "handle_delete_zones", + "registered_at": "src/web/libuv_api_handlers.c:222", + "handler_defined_at": "src/web/api_handlers_zones.c:255", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 60, + "method": "GET", + "pattern": "/api/streams/#/retention", + "handler": "handle_get_stream_retention", + "registered_at": "src/web/libuv_api_handlers.c:225", + "handler_defined_at": "src/web/api_handlers_retention.c:89", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 61, + "method": "PUT", + "pattern": "/api/streams/#/retention", + "handler": "handle_put_stream_retention", + "registered_at": "src/web/libuv_api_handlers.c:226", + "handler_defined_at": "src/web/api_handlers_retention.c:133", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 62, + "method": "GET", + "pattern": "/api/streams/#/detection-engines", + "handler": "handle_get_detection_engines", + "registered_at": "src/web/libuv_api_handlers.c:227", + "handler_defined_at": "src/web/api_handlers_detection_engines.c:87", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 63, + "method": "PUT", + "pattern": "/api/streams/#/detection-engines", + "handler": "handle_put_detection_engines", + "registered_at": "src/web/libuv_api_handlers.c:229", + "handler_defined_at": "src/web/api_handlers_detection_engines.c:140", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 64, + "method": "POST", + "pattern": "/api/streams/#/refresh", + "handler": "handle_post_stream_refresh", + "registered_at": "src/web/libuv_api_handlers.c:233", + "handler_defined_at": "src/web/api_handlers_streams_modify.c:2641", + "ui_consumers": [ + "web/js/components/preact/HLSVideoCell.jsx:153", + "web/js/components/preact/WebRTCVideoCell.jsx:1123" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 65, + "method": "GET", + "pattern": "/api/streams/#/ptz/capabilities", + "handler": "handle_ptz_capabilities", + "registered_at": "src/web/libuv_api_handlers.c:236", + "handler_defined_at": "src/web/api_handlers_ptz.c:815", + "ui_consumers": [ + "web/js/components/preact/ptzActions.js:2" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 66, + "method": "GET", + "pattern": "/api/streams/#/ptz/presets", + "handler": "handle_ptz_get_presets", + "registered_at": "src/web/libuv_api_handlers.c:237", + "handler_defined_at": "src/web/api_handlers_ptz.c:596", + "ui_consumers": [ + "web/js/components/preact/ptzActions.js:2" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 67, + "method": "POST", + "pattern": "/api/streams/#/ptz/move", + "handler": "handle_ptz_move", + "registered_at": "src/web/libuv_api_handlers.c:238", + "handler_defined_at": "src/web/api_handlers_ptz.c:135", + "ui_consumers": [ + "web/js/components/preact/PTZControls.jsx:17" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 68, + "method": "POST", + "pattern": "/api/streams/#/ptz/stop", + "handler": "handle_ptz_stop", + "registered_at": "src/web/libuv_api_handlers.c:239", + "handler_defined_at": "src/web/api_handlers_ptz.c:219", + "ui_consumers": [ + "web/js/components/preact/PTZControls.jsx:26" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 69, + "method": "POST", + "pattern": "/api/streams/#/ptz/absolute", + "handler": "handle_ptz_absolute", + "registered_at": "src/web/libuv_api_handlers.c:240", + "handler_defined_at": "src/web/api_handlers_ptz.c:278", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 70, + "method": "POST", + "pattern": "/api/streams/#/ptz/relative", + "handler": "handle_ptz_relative", + "registered_at": "src/web/libuv_api_handlers.c:241", + "handler_defined_at": "src/web/api_handlers_ptz.c:377", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 71, + "method": "POST", + "pattern": "/api/streams/#/ptz/home", + "handler": "handle_ptz_home", + "registered_at": "src/web/libuv_api_handlers.c:242", + "handler_defined_at": "src/web/api_handlers_ptz.c:476", + "ui_consumers": [ + "web/js/components/preact/PTZControls.jsx:33" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 72, + "method": "POST", + "pattern": "/api/streams/#/ptz/set-home", + "handler": "handle_ptz_set_home", + "registered_at": "src/web/libuv_api_handlers.c:243", + "handler_defined_at": "src/web/api_handlers_ptz.c:536", + "ui_consumers": [ + "web/js/components/preact/ptzActions.js:2" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 73, + "method": "POST", + "pattern": "/api/streams/#/ptz/goto-preset", + "handler": "handle_ptz_goto_preset", + "registered_at": "src/web/libuv_api_handlers.c:244", + "handler_defined_at": "src/web/api_handlers_ptz.c:654", + "ui_consumers": [ + "web/js/components/preact/PTZControls.jsx:40" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 74, + "method": "PUT", + "pattern": "/api/streams/#/ptz/preset", + "handler": "handle_ptz_set_preset", + "registered_at": "src/web/libuv_api_handlers.c:245", + "handler_defined_at": "src/web/api_handlers_ptz.c:735", + "ui_consumers": [ + "web/js/components/preact/ptzActions.js:2" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 75, + "method": "GET", + "pattern": "/api/streams/#/imaging/settings", + "handler": "handle_imaging_get_settings", + "registered_at": "src/web/libuv_api_handlers.c:248", + "handler_defined_at": "src/web/api_handlers_imaging.c:489", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 76, + "method": "PUT", + "pattern": "/api/streams/#/imaging/settings", + "handler": "handle_imaging_put_settings", + "registered_at": "src/web/libuv_api_handlers.c:249", + "handler_defined_at": "src/web/api_handlers_imaging.c:557", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 77, + "method": "GET", + "pattern": "/api/streams/#/imaging/options", + "handler": "handle_imaging_get_options", + "registered_at": "src/web/libuv_api_handlers.c:250", + "handler_defined_at": "src/web/api_handlers_imaging.c:523", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 78, + "method": "GET", + "pattern": "/api/streams/#/daynight", + "handler": "handle_daynight_get", + "registered_at": "src/web/libuv_api_handlers.c:251", + "handler_defined_at": "src/web/api_handlers_imaging.c:600", + "ui_consumers": [ + "web/js/components/preact/DayNightControl.jsx:69" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 79, + "method": "PUT", + "pattern": "/api/streams/#/daynight", + "handler": "handle_daynight_put", + "registered_at": "src/web/libuv_api_handlers.c:252", + "handler_defined_at": "src/web/api_handlers_imaging.c:654", + "ui_consumers": [ + "web/js/components/preact/DayNightControl.jsx:95" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 80, + "method": "GET", + "pattern": "/api/streams/#/full", + "handler": "handle_get_stream_full", + "registered_at": "src/web/libuv_api_handlers.c:255", + "handler_defined_at": "src/web/api_handlers_streams_get.c:951", + "ui_consumers": [ + "web/js/components/preact/StreamsView.jsx:808", + "web/js/components/preact/StreamsView.jsx:900" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 81, + "method": "GET", + "pattern": "/api/streams/#", + "handler": "handle_get_stream", + "registered_at": "src/web/libuv_api_handlers.c:256", + "handler_defined_at": "src/web/api_handlers_streams_get.c:748", + "ui_consumers": [], + "integration_tests_referencing_path": [ + "tests/integration/lightnvr.api.spec.ts", + "tests/integration/specs/comprehensive.api.spec.ts", + "tests/integration/specs/stream-snapshot-requests.ui.spec.ts" + ], + "has_ui_consumer": false + }, + { + "order": 82, + "method": "PUT", + "pattern": "/api/streams/#", + "handler": "handle_put_stream", + "registered_at": "src/web/libuv_api_handlers.c:257", + "handler_defined_at": "src/web/api_handlers_streams_modify.c:1251", + "ui_consumers": [ + "web/js/components/preact/HLSVideoCell.jsx:665", + "web/js/components/preact/HLSVideoCell.jsx:688", + "web/js/components/preact/MSEVideoCell.jsx:553", + "web/js/components/preact/MSEVideoCell.jsx:576", + "web/js/components/preact/StreamsView.jsx:343", + "web/js/components/preact/StreamsView.jsx:484", + "web/js/components/preact/StreamsView.jsx:532", + "web/js/components/preact/WebRTCVideoCell.jsx:1201", + "web/js/components/preact/WebRTCVideoCell.jsx:1224" + ], + "integration_tests_referencing_path": [ + "tests/integration/lightnvr.api.spec.ts", + "tests/integration/specs/comprehensive.api.spec.ts", + "tests/integration/specs/stream-snapshot-requests.ui.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 83, + "method": "DELETE", + "pattern": "/api/streams/#", + "handler": "handle_delete_stream", + "registered_at": "src/web/libuv_api_handlers.c:258", + "handler_defined_at": "src/web/api_handlers_streams_modify.c:2328", + "ui_consumers": [ + "web/js/components/preact/StreamsView.jsx:433", + "web/js/components/preact/StreamsView.jsx:459", + "web/js/components/preact/StreamsView.jsx:562", + "web/js/components/preact/StreamsView.jsx:583" + ], + "integration_tests_referencing_path": [ + "tests/integration/lightnvr.api.spec.ts", + "tests/integration/specs/comprehensive.api.spec.ts", + "tests/integration/specs/stream-snapshot-requests.ui.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 84, + "method": "GET", + "pattern": "/api/settings", + "handler": "handle_get_settings", + "registered_at": "src/web/libuv_api_handlers.c:261", + "handler_defined_at": "src/web/api_handlers_settings.c:705", + "ui_consumers": [ + "web/js/components/preact/EventRoutingView.jsx:124", + "web/js/components/preact/SettingsView.jsx:221", + "web/js/components/preact/SetupWizard.jsx:216", + "web/js/components/preact/StreamsView.jsx:999" + ], + "integration_tests_referencing_path": [ + "tests/integration/fixtures/test-fixtures.ts", + "tests/integration/lightnvr.api.spec.ts", + "tests/integration/specs/comprehensive.api.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 85, + "method": "GET", + "pattern": "/api/client-config", + "handler": "handle_get_client_config", + "registered_at": "src/web/libuv_api_handlers.c:262", + "handler_defined_at": "src/web/api_handlers_settings.c:641", + "ui_consumers": [ + "web/js/components/preact/RecordingsView.jsx:184", + "web/js/components/preact/StreamsView.jsx:229", + "web/js/pages/hls-page.jsx:36", + "web/js/pages/index-page.jsx:40", + "web/js/utils/settings-utils.js:37" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/camera-favorites.ui.spec.ts", + "tests/integration/specs/detection-overlay-requests.ui.spec.ts", + "tests/integration/specs/health-monitoring-state.ui.spec.ts", + "tests/integration/specs/live-inventory-refresh.ui.spec.ts", + "tests/integration/specs/stream-snapshot-requests.ui.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 86, + "method": "POST", + "pattern": "/api/settings", + "handler": "handle_post_settings", + "registered_at": "src/web/libuv_api_handlers.c:264", + "handler_defined_at": "src/web/api_handlers_settings.c:954", + "ui_consumers": [ + "web/js/components/preact/SettingsView.jsx:233", + "web/js/components/preact/SetupWizard.jsx:259" + ], + "integration_tests_referencing_path": [ + "tests/integration/fixtures/test-fixtures.ts", + "tests/integration/lightnvr.api.spec.ts", + "tests/integration/specs/comprehensive.api.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 87, + "method": "POST", + "pattern": "/api/settings/go2rtc/validate", + "handler": "handle_post_settings_go2rtc_validate", + "registered_at": "src/web/libuv_api_handlers.c:265", + "handler_defined_at": "src/web/api_handlers_settings.c:575", + "ui_consumers": [ + "web/js/components/preact/settings/Go2rtcTab.jsx:112" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 88, + "method": "GET", + "pattern": "/api/ui/workspaces", + "handler": "handle_get_ui_workspaces", + "registered_at": "src/web/libuv_api_handlers.c:267", + "handler_defined_at": "src/web/api_handlers_workspaces.c:77", + "ui_consumers": [ + "web/js/components/preact/live/LiveOperatorNavigator.jsx:92", + "web/js/components/preact/settings/WorkspacesTab.jsx:24" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 89, + "method": "PUT", + "pattern": "/api/ui/workspaces", + "handler": "handle_put_ui_workspaces", + "registered_at": "src/web/libuv_api_handlers.c:269", + "handler_defined_at": "src/web/api_handlers_workspaces.c:95", + "ui_consumers": [ + "web/js/components/preact/settings/WorkspacesTab.jsx:35" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 90, + "method": "GET", + "pattern": "/api/ice-servers", + "handler": "handle_get_ice_servers", + "registered_at": "src/web/libuv_api_handlers.c:273", + "handler_defined_at": "src/web/api_handlers_ice_servers.c:31", + "ui_consumers": [ + "web/js/components/preact/WebRTCVideoCell.jsx:347" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 91, + "method": "GET", + "pattern": "/api/system", + "handler": "handle_get_system_info", + "registered_at": "src/web/libuv_api_handlers.c:276", + "handler_defined_at": "src/web/api_handlers_system.c:694", + "ui_consumers": [], + "integration_tests_referencing_path": [ + "tests/integration/fixtures/test-fixtures.ts", + "tests/integration/lightnvr.api.spec.ts", + "tests/integration/specs/auth.api.spec.ts", + "tests/integration/specs/comprehensive.api.spec.ts" + ], + "has_ui_consumer": false + }, + { + "order": 92, + "method": "GET", + "pattern": "/api/system/info", + "handler": "handle_get_system_info", + "registered_at": "src/web/libuv_api_handlers.c:277", + "handler_defined_at": "src/web/api_handlers_system.c:694", + "ui_consumers": [ + "web/js/components/preact/SetupWizard.jsx:234", + "web/js/components/preact/SystemView.jsx:139" + ], + "integration_tests_referencing_path": [ + "tests/integration/lightnvr.api.spec.ts", + "tests/integration/specs/health-monitoring-state.ui.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 93, + "method": "GET", + "pattern": "/api/system/health/incidents", + "handler": "handle_get_system_health_incidents", + "registered_at": "src/web/libuv_api_handlers.c:278", + "handler_defined_at": "src/web/api_handlers_system_health.c:860", + "ui_consumers": [ + "web/js/components/preact/system/HealthIncidentHistory.jsx:10" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/health-monitoring-state.ui.spec.ts", + "tests/integration/specs/system-health.api.spec.ts", + "tests/integration/specs/system-health.ui.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 94, + "method": "GET", + "pattern": "/api/system/health", + "handler": "handle_get_system_health", + "registered_at": "src/web/libuv_api_handlers.c:280", + "handler_defined_at": "src/web/api_handlers_system_health.c:499", + "ui_consumers": [ + "web/js/components/preact/system/SystemHealth.jsx:184" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/health-monitoring-state.ui.spec.ts", + "tests/integration/specs/system-health-mqtt.api.spec.ts", + "tests/integration/specs/system-health.api.spec.ts", + "tests/integration/specs/system-health.ui.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 95, + "method": "GET", + "pattern": "/api/system/logs", + "handler": "handle_get_system_logs", + "registered_at": "src/web/libuv_api_handlers.c:282", + "handler_defined_at": "src/web/api_handlers_system_logs.c:98", + "ui_consumers": [ + "web/js/components/preact/system/LogsPoller.jsx:57" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/comprehensive.api.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 96, + "method": "POST", + "pattern": "/api/system/restart", + "handler": "handle_post_system_restart", + "registered_at": "src/web/libuv_api_handlers.c:283", + "handler_defined_at": "src/web/api_handlers_system.c:1106", + "ui_consumers": [ + "web/js/components/preact/SystemView.jsx:199" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 97, + "method": "POST", + "pattern": "/api/system/shutdown", + "handler": "handle_post_system_shutdown", + "registered_at": "src/web/libuv_api_handlers.c:284", + "handler_defined_at": "src/web/api_handlers_system.c:1166", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 98, + "method": "POST", + "pattern": "/api/system/logs/clear", + "handler": "handle_post_system_logs_clear", + "registered_at": "src/web/libuv_api_handlers.c:285", + "handler_defined_at": "src/web/api_handlers_system_logs.c:174", + "ui_consumers": [ + "web/js/components/preact/SystemView.jsx:151" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 99, + "method": "POST", + "pattern": "/api/system/backup", + "handler": "handle_post_system_backup", + "registered_at": "src/web/libuv_api_handlers.c:286", + "handler_defined_at": "src/web/api_handlers_system.c:1254", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 100, + "method": "GET", + "pattern": "/api/system/status", + "handler": "handle_get_system_status", + "registered_at": "src/web/libuv_api_handlers.c:287", + "handler_defined_at": "src/web/api_handlers_system.c:1504", + "ui_consumers": [ + "web/js/components/preact/system/RestartModal.jsx:54", + "web/js/components/preact/system/RestartModal.jsx:90" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/comprehensive.api.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 101, + "method": "GET", + "pattern": "/api/system/go2rtc/effective-config", + "handler": "handle_get_system_go2rtc_effective_config", + "registered_at": "src/web/libuv_api_handlers.c:288", + "handler_defined_at": "src/web/api_handlers_system_go2rtc.c:184", + "ui_consumers": [ + "web/js/components/preact/settings/Go2rtcTab.jsx:155" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 102, + "method": "GET", + "pattern": "/api/system/go2rtc/override-status", + "handler": "handle_get_system_go2rtc_override_status", + "registered_at": "src/web/libuv_api_handlers.c:290", + "handler_defined_at": "src/web/api_handlers_system_go2rtc.c:371", + "ui_consumers": [ + "web/js/components/preact/settings/Go2rtcTab.jsx:156" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 103, + "method": "GET", + "pattern": "/api/detection/results/#", + "handler": "handle_get_detection_results", + "registered_at": "src/web/libuv_api_handlers.c:294", + "handler_defined_at": "src/web/api_handlers_detection.c:43", + "ui_consumers": [ + "web/js/components/preact/UI.jsx:320", + "web/js/components/preact/recordings/recordingsAPI.jsx:630", + "web/js/components/preact/recordings/recordingsAPI.jsx:661", + "web/js/components/preact/timeline/TimelinePlayer.jsx:629", + "web/js/utils/detection-polling.js:25" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/detection-overlay-requests.ui.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 104, + "method": "GET", + "pattern": "/api/detection/models", + "handler": "handle_get_detection_models", + "registered_at": "src/web/libuv_api_handlers.c:295", + "handler_defined_at": "src/web/api_handlers_detection_models.c:39", + "ui_consumers": [ + "web/js/components/preact/StreamsView.jsx:221" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/stream-snapshot-requests.ui.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 105, + "method": "POST", + "pattern": "/api/lpr/search", + "handler": "handle_post_lpr_search", + "registered_at": "src/web/libuv_api_handlers.c:296", + "handler_defined_at": "src/web/api_handlers_lpr.c:302", + "ui_consumers": [ + "web/js/components/preact/lpr/lprSearch.js:172" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 106, + "method": "POST", + "pattern": "/api/lpr/export", + "handler": "handle_post_lpr_export", + "registered_at": "src/web/libuv_api_handlers.c:297", + "handler_defined_at": "src/web/api_handlers_lpr.c:306", + "ui_consumers": [ + "web/js/components/preact/lpr/lprSearch.js:180" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 107, + "method": "DELETE", + "pattern": "/api/lpr/reads/#", + "handler": "handle_delete_lpr_read", + "registered_at": "src/web/libuv_api_handlers.c:298", + "handler_defined_at": "src/web/api_handlers_lpr.c:310", + "ui_consumers": [ + "web/js/components/preact/lpr/lprSearch.js:187" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 108, + "method": "GET", + "pattern": "/api/snapshots/#/#", + "handler": "handle_get_detection_snapshot", + "registered_at": "src/web/libuv_api_handlers.c:300", + "handler_defined_at": "src/web/api_handlers_detection_results.c:159", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 109, + "method": "GET", + "pattern": "/api/storage/health", + "handler": "handle_get_storage_health", + "registered_at": "src/web/libuv_api_handlers.c:303", + "handler_defined_at": "src/web/api_handlers_storage.c:36", + "ui_consumers": [ + "web/js/components/preact/system/StorageHealth.jsx:60" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 110, + "method": "POST", + "pattern": "/api/storage/cleanup", + "handler": "handle_post_storage_cleanup", + "registered_at": "src/web/libuv_api_handlers.c:304", + "handler_defined_at": "src/web/api_handlers_storage.c:131", + "ui_consumers": [ + "web/js/components/preact/system/StorageHealth.jsx:67" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 111, + "method": "GET", + "pattern": "/api/auth/login/config", + "handler": "handle_auth_login_config", + "registered_at": "src/web/libuv_api_handlers.c:307", + "handler_defined_at": "src/web/api_handlers_auth_backend_agnostic.c:657", + "ui_consumers": [ + "web/js/components/preact/LoginView.jsx:80" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 112, + "method": "POST", + "pattern": "/api/auth/login", + "handler": "handle_auth_login", + "registered_at": "src/web/libuv_api_handlers.c:308", + "handler_defined_at": "src/web/api_handlers_auth_backend_agnostic.c:223", + "ui_consumers": [ + "web/js/components/preact/LoginView.jsx:178" + ], + "integration_tests_referencing_path": [ + "tests/integration/fixtures/test-fixtures.ts", + "tests/integration/specs/auth.api.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 113, + "method": "POST", + "pattern": "/api/auth/logout", + "handler": "handle_auth_logout", + "registered_at": "src/web/libuv_api_handlers.c:309", + "handler_defined_at": "src/web/api_handlers_auth_backend_agnostic.c:534", + "ui_consumers": [ + "web/js/components/preact/LoginView.jsx:71" + ], + "integration_tests_referencing_path": [ + "tests/integration/fixtures/test-fixtures.ts", + "tests/integration/specs/auth.api.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 114, + "method": "GET", + "pattern": "/api/auth/verify", + "handler": "handle_auth_verify", + "registered_at": "src/web/libuv_api_handlers.c:310", + "handler_defined_at": "src/web/api_handlers_auth_backend_agnostic.c:575", + "ui_consumers": [ + "web/js/utils/auth-utils.js:48" + ], + "integration_tests_referencing_path": [ + "tests/integration/fixtures/test-fixtures.ts", + "tests/integration/specs/auth.api.spec.ts", + "tests/integration/specs/camera-favorites.ui.spec.ts", + "tests/integration/specs/detection-overlay-requests.ui.spec.ts", + "tests/integration/specs/health-monitoring-state.ui.spec.ts", + "tests/integration/specs/live-inventory-refresh.ui.spec.ts", + "tests/integration/specs/stream-snapshot-requests.ui.spec.ts", + "tests/integration/specs/system-health.ui.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 115, + "method": "GET", + "pattern": "/api/auth/sessions", + "handler": "handle_auth_sessions_list", + "registered_at": "src/web/libuv_api_handlers.c:311", + "handler_defined_at": "src/web/api_handlers_auth_backend_agnostic.c:673", + "ui_consumers": [ + "web/js/components/preact/SettingsView.jsx:267" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 116, + "method": "DELETE", + "pattern": "/api/auth/sessions/#", + "handler": "handle_auth_sessions_delete", + "registered_at": "src/web/libuv_api_handlers.c:312", + "handler_defined_at": "src/web/api_handlers_auth_backend_agnostic.c:711", + "ui_consumers": [ + "web/js/components/preact/SettingsView.jsx:287" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 117, + "method": "GET", + "pattern": "/api/auth/trusted-devices", + "handler": "handle_auth_trusted_devices_list", + "registered_at": "src/web/libuv_api_handlers.c:313", + "handler_defined_at": "src/web/api_handlers_auth_backend_agnostic.c:749", + "ui_consumers": [ + "web/js/components/preact/SettingsView.jsx:279" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 118, + "method": "DELETE", + "pattern": "/api/auth/trusted-devices/#", + "handler": "handle_auth_trusted_devices_delete", + "registered_at": "src/web/libuv_api_handlers.c:314", + "handler_defined_at": "src/web/api_handlers_auth_backend_agnostic.c:789", + "ui_consumers": [ + "web/js/components/preact/SettingsView.jsx:299" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 119, + "method": "GET", + "pattern": "/logout", + "handler": "handle_auth_logout", + "registered_at": "src/web/libuv_api_handlers.c:315", + "handler_defined_at": "src/web/api_handlers_auth_backend_agnostic.c:534", + "ui_consumers": [ + "web/js/components/preact/Header.jsx:306" + ], + "integration_tests_referencing_path": [ + "tests/integration/fixtures/test-fixtures.ts", + "tests/integration/pages/BasePage.ts" + ], + "has_ui_consumer": true + }, + { + "order": 120, + "method": "GET", + "pattern": "/api/auth/users", + "handler": "handle_users_list", + "registered_at": "src/web/libuv_api_handlers.c:318", + "handler_defined_at": "src/web/api_handlers_users_backend_agnostic.c:238", + "ui_consumers": [ + "web/js/components/preact/UsersView.jsx:64" + ], + "integration_tests_referencing_path": [ + "tests/integration/fixtures/test-fixtures.ts", + "tests/integration/specs/api-tokens.ui.spec.ts", + "tests/integration/specs/auth.api.spec.ts", + "tests/integration/specs/roles.ui.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 121, + "method": "POST", + "pattern": "/api/auth/users", + "handler": "handle_users_create", + "registered_at": "src/web/libuv_api_handlers.c:319", + "handler_defined_at": "src/web/api_handlers_users_backend_agnostic.c:340", + "ui_consumers": [ + "web/js/components/preact/UsersView.jsx:115" + ], + "integration_tests_referencing_path": [ + "tests/integration/fixtures/test-fixtures.ts", + "tests/integration/specs/api-tokens.ui.spec.ts", + "tests/integration/specs/auth.api.spec.ts", + "tests/integration/specs/roles.ui.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 122, + "method": "GET", + "pattern": "/api/auth/users/#", + "handler": "handle_users_get", + "registered_at": "src/web/libuv_api_handlers.c:320", + "handler_defined_at": "src/web/api_handlers_users_backend_agnostic.c:291", + "ui_consumers": [], + "integration_tests_referencing_path": [ + "tests/integration/specs/auth.api.spec.ts" + ], + "has_ui_consumer": false + }, + { + "order": 123, + "method": "PUT", + "pattern": "/api/auth/users/#", + "handler": "handle_users_update", + "registered_at": "src/web/libuv_api_handlers.c:321", + "handler_defined_at": "src/web/api_handlers_users_backend_agnostic.c:498", + "ui_consumers": [ + "web/js/components/preact/Header.jsx:177", + "web/js/components/preact/UsersView.jsx:144" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/auth.api.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 124, + "method": "DELETE", + "pattern": "/api/auth/users/#", + "handler": "handle_users_delete", + "registered_at": "src/web/libuv_api_handlers.c:322", + "handler_defined_at": "src/web/api_handlers_users_backend_agnostic.c:708", + "ui_consumers": [ + "web/js/components/preact/UsersView.jsx:173" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/auth.api.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 125, + "method": "POST", + "pattern": "/api/auth/users/#/api-key", + "handler": "handle_users_generate_api_key", + "registered_at": "src/web/libuv_api_handlers.c:323", + "handler_defined_at": "src/web/api_handlers_users_backend_agnostic.c:798", + "ui_consumers": [ + "web/js/components/preact/users/ApiKeyModal.jsx:242" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/auth.api.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 126, + "method": "PUT", + "pattern": "/api/auth/users/#/password", + "handler": "handle_users_change_password", + "registered_at": "src/web/libuv_api_handlers.c:324", + "handler_defined_at": "src/web/api_handlers_users_backend_agnostic.c:858", + "ui_consumers": [ + "web/js/components/preact/AuthGate.jsx:38" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 127, + "method": "PUT", + "pattern": "/api/auth/users/#/password-lock", + "handler": "handle_users_password_lock", + "registered_at": "src/web/libuv_api_handlers.c:325", + "handler_defined_at": "src/web/api_handlers_users_backend_agnostic.c:994", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 128, + "method": "POST", + "pattern": "/api/auth/users/#/login-lockout/clear", + "handler": "handle_users_clear_login_lockout", + "registered_at": "src/web/libuv_api_handlers.c:326", + "handler_defined_at": "src/web/api_handlers_users_backend_agnostic.c:1072", + "ui_consumers": [ + "web/js/components/preact/UsersView.jsx:197" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/auth.api.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 129, + "method": "GET", + "pattern": "/api/authorization/actions", + "handler": "handle_get_authorization_actions", + "registered_at": "src/web/libuv_api_handlers.c:329", + "handler_defined_at": "src/web/api_handlers_authorization.c:79", + "ui_consumers": [ + "web/js/components/preact/users/AccessPolicyModal.jsx:182", + "web/js/components/preact/users/ApiKeyModal.jsx:146", + "web/js/components/preact/users/RoleManagerModal.jsx:41" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/api-tokens.ui.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 130, + "method": "POST", + "pattern": "/api/authorization/simulate", + "handler": "handle_post_authorization_simulate", + "registered_at": "src/web/libuv_api_handlers.c:331", + "handler_defined_at": "src/web/api_handlers_authorization.c:125", + "ui_consumers": [ + "web/js/components/preact/users/AccessPolicyModal.jsx:110" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 131, + "method": "GET", + "pattern": "/api/authorization/roles", + "handler": "handle_get_authorization_roles", + "registered_at": "src/web/libuv_api_handlers.c:333", + "handler_defined_at": "src/web/api_handlers_authorization.c:519", + "ui_consumers": [ + "web/js/components/preact/users/AccessPolicyModal.jsx:183", + "web/js/components/preact/users/RoleManagerModal.jsx:42" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 132, + "method": "POST", + "pattern": "/api/authorization/roles", + "handler": "handle_post_authorization_role", + "registered_at": "src/web/libuv_api_handlers.c:335", + "handler_defined_at": "src/web/api_handlers_authorization.c:655", + "ui_consumers": [ + "web/js/components/preact/users/RoleManagerModal.jsx:101" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 133, + "method": "PUT", + "pattern": "/api/authorization/roles/#", + "handler": "handle_put_authorization_role", + "registered_at": "src/web/libuv_api_handlers.c:337", + "handler_defined_at": "src/web/api_handlers_authorization.c:690", + "ui_consumers": [ + "web/js/components/preact/users/RoleManagerModal.jsx:101" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 134, + "method": "DELETE", + "pattern": "/api/authorization/roles/#", + "handler": "handle_delete_authorization_role", + "registered_at": "src/web/libuv_api_handlers.c:339", + "handler_defined_at": "src/web/api_handlers_authorization.c:739", + "ui_consumers": [ + "web/js/components/preact/users/RoleManagerModal.jsx:129" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 135, + "method": "GET", + "pattern": "/api/authorization/users/#/tokens", + "handler": "handle_get_user_api_tokens", + "registered_at": "src/web/libuv_api_handlers.c:341", + "handler_defined_at": "src/web/api_handlers_authorization.c:1423", + "ui_consumers": [ + "web/js/components/preact/users/ApiKeyModal.jsx:147" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/api-tokens.ui.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 136, + "method": "POST", + "pattern": "/api/authorization/users/#/tokens", + "handler": "handle_post_user_api_token", + "registered_at": "src/web/libuv_api_handlers.c:344", + "handler_defined_at": "src/web/api_handlers_authorization.c:1599", + "ui_consumers": [ + "web/js/components/preact/users/ApiKeyModal.jsx:196" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/api-tokens.ui.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 137, + "method": "DELETE", + "pattern": "/api/authorization/users/#/tokens/#", + "handler": "handle_delete_user_api_token", + "registered_at": "src/web/libuv_api_handlers.c:347", + "handler_defined_at": "src/web/api_handlers_authorization.c:1745", + "ui_consumers": [ + "web/js/components/preact/users/ApiKeyModal.jsx:223" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 138, + "method": "GET", + "pattern": "/api/authorization/users/#", + "handler": "handle_get_user_authorization", + "registered_at": "src/web/libuv_api_handlers.c:350", + "handler_defined_at": "src/web/api_handlers_authorization.c:857", + "ui_consumers": [ + "web/js/components/preact/users/AccessPolicyModal.jsx:184" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 139, + "method": "PUT", + "pattern": "/api/authorization/users/#", + "handler": "handle_put_user_authorization", + "registered_at": "src/web/libuv_api_handlers.c:352", + "handler_defined_at": "src/web/api_handlers_authorization.c:1132", + "ui_consumers": [ + "web/js/components/preact/users/AccessPolicyModal.jsx:246" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 140, + "method": "GET", + "pattern": "/api/audit/events/export", + "handler": "handle_get_audit_export", + "registered_at": "src/web/libuv_api_handlers.c:356", + "handler_defined_at": "src/web/api_handlers_audit.c:216", + "ui_consumers": [ + "web/js/components/preact/users/AuditHistoryModal.jsx:198" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 141, + "method": "GET", + "pattern": "/api/audit/events", + "handler": "handle_get_audit_events", + "registered_at": "src/web/libuv_api_handlers.c:358", + "handler_defined_at": "src/web/api_handlers_audit.c:182", + "ui_consumers": [ + "web/js/components/preact/users/AuditHistoryModal.jsx:103" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 142, + "method": "GET", + "pattern": "/api/audit/settings", + "handler": "handle_get_audit_settings", + "registered_at": "src/web/libuv_api_handlers.c:360", + "handler_defined_at": "src/web/api_handlers_audit.c:323", + "ui_consumers": [ + "web/js/components/preact/users/AuditHistoryModal.jsx:121" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 143, + "method": "PUT", + "pattern": "/api/audit/settings", + "handler": "handle_put_audit_settings", + "registered_at": "src/web/libuv_api_handlers.c:362", + "handler_defined_at": "src/web/api_handlers_audit.c:335", + "ui_consumers": [ + "web/js/components/preact/users/AuditDecisionModes.jsx:31", + "web/js/components/preact/users/AuditHistoryModal.jsx:176" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 144, + "method": "GET", + "pattern": "/api/events/catalog", + "handler": "handle_get_event_catalog", + "registered_at": "src/web/libuv_api_handlers.c:366", + "handler_defined_at": "src/web/api_handlers_event_routes.c:478", + "ui_consumers": [ + "web/js/components/preact/EventRoutingView.jsx:123" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 145, + "method": "GET", + "pattern": "/api/event-destinations", + "handler": "handle_get_event_destinations", + "registered_at": "src/web/libuv_api_handlers.c:368", + "handler_defined_at": "src/web/api_handlers_event_destinations.c:416", + "ui_consumers": [ + "web/js/components/preact/EventRoutingView.jsx:122" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/system-health-mqtt.api.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 146, + "method": "POST", + "pattern": "/api/event-destinations", + "handler": "handle_post_event_destination", + "registered_at": "src/web/libuv_api_handlers.c:370", + "handler_defined_at": "src/web/api_handlers_event_destinations.c:474", + "ui_consumers": [ + "web/js/components/preact/EventRoutingView.jsx:182" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/system-health-mqtt.api.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 147, + "method": "GET", + "pattern": "/api/event-destinations/#", + "handler": "handle_get_event_destination", + "registered_at": "src/web/libuv_api_handlers.c:372", + "handler_defined_at": "src/web/api_handlers_event_destinations.c:515", + "ui_consumers": [], + "integration_tests_referencing_path": [ + "tests/integration/specs/system-health-mqtt.api.spec.ts" + ], + "has_ui_consumer": false + }, + { + "order": 148, + "method": "PUT", + "pattern": "/api/event-destinations/#", + "handler": "handle_put_event_destination", + "registered_at": "src/web/libuv_api_handlers.c:374", + "handler_defined_at": "src/web/api_handlers_event_destinations.c:531", + "ui_consumers": [ + "web/js/components/preact/EventRoutingView.jsx:182", + "web/js/components/preact/EventRoutingView.jsx:190" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/system-health-mqtt.api.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 149, + "method": "DELETE", + "pattern": "/api/event-destinations/#", + "handler": "handle_delete_event_destination", + "registered_at": "src/web/libuv_api_handlers.c:376", + "handler_defined_at": "src/web/api_handlers_event_destinations.c:596", + "ui_consumers": [ + "web/js/components/preact/EventRoutingView.jsx:194" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/system-health-mqtt.api.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 150, + "method": "GET", + "pattern": "/api/storage-archive", + "handler": "handle_get_storage_archive", + "registered_at": "src/web/libuv_api_handlers.c:379", + "handler_defined_at": "src/web/api_handlers_storage_migrations.c:318", + "ui_consumers": [ + "web/js/components/preact/settings/StorageTab.jsx:407" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 151, + "method": "POST", + "pattern": "/api/storage-archive/retry", + "handler": "handle_post_storage_archive_retry", + "registered_at": "src/web/libuv_api_handlers.c:380", + "handler_defined_at": "src/web/api_handlers_storage_migrations.c:367", + "ui_consumers": [ + "web/js/components/preact/settings/StorageTab.jsx:414" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 152, + "method": "POST", + "pattern": "/api/storage-policies/#/apply", + "handler": "handle_post_storage_policy_apply", + "registered_at": "src/web/libuv_api_handlers.c:381", + "handler_defined_at": "src/web/api_handlers_storage_policies.c:820", + "ui_consumers": [ + "web/js/components/preact/settings/StorageTab.jsx:569" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 153, + "method": "GET", + "pattern": "/api/storage-targets", + "handler": "handle_get_storage_targets", + "registered_at": "src/web/libuv_api_handlers.c:384", + "handler_defined_at": "src/web/api_handlers_storage_targets.c:382", + "ui_consumers": [ + "web/js/components/preact/settings/StorageTab.jsx:191", + "web/js/components/preact/settings/StorageTab.jsx:358", + "web/js/components/preact/settings/StorageTab.jsx:558" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 154, + "method": "POST", + "pattern": "/api/storage-targets", + "handler": "handle_post_storage_target", + "registered_at": "src/web/libuv_api_handlers.c:386", + "handler_defined_at": "src/web/api_handlers_storage_targets.c:439", + "ui_consumers": [ + "web/js/components/preact/settings/StorageTab.jsx:237" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 155, + "method": "POST", + "pattern": "/api/storage-targets/#/probe", + "handler": "handle_post_storage_target_probe", + "registered_at": "src/web/libuv_api_handlers.c:388", + "handler_defined_at": "src/web/api_handlers_storage_targets.c:562", + "ui_consumers": [ + "web/js/components/preact/settings/StorageTab.jsx:257" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 156, + "method": "GET", + "pattern": "/api/storage-targets/#", + "handler": "handle_get_storage_target", + "registered_at": "src/web/libuv_api_handlers.c:390", + "handler_defined_at": "src/web/api_handlers_storage_targets.c:472", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 157, + "method": "PUT", + "pattern": "/api/storage-targets/#", + "handler": "handle_put_storage_target", + "registered_at": "src/web/libuv_api_handlers.c:392", + "handler_defined_at": "src/web/api_handlers_storage_targets.c:487", + "ui_consumers": [ + "web/js/components/preact/settings/StorageTab.jsx:237" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 158, + "method": "DELETE", + "pattern": "/api/storage-targets/#", + "handler": "handle_delete_storage_target", + "registered_at": "src/web/libuv_api_handlers.c:394", + "handler_defined_at": "src/web/api_handlers_storage_targets.c:541", + "ui_consumers": [ + "web/js/components/preact/settings/StorageTab.jsx:277" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 159, + "method": "GET", + "pattern": "/api/storage-migrations", + "handler": "handle_get_storage_migrations", + "registered_at": "src/web/libuv_api_handlers.c:396", + "handler_defined_at": "src/web/api_handlers_storage_migrations.c:158", + "ui_consumers": [ + "web/js/components/preact/settings/StorageTab.jsx:444" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 160, + "method": "POST", + "pattern": "/api/storage-migrations", + "handler": "handle_post_storage_migration", + "registered_at": "src/web/libuv_api_handlers.c:398", + "handler_defined_at": "src/web/api_handlers_storage_migrations.c:196", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 161, + "method": "POST", + "pattern": "/api/storage-migrations/#/cancel", + "handler": "handle_post_storage_migration_cancel", + "registered_at": "src/web/libuv_api_handlers.c:400", + "handler_defined_at": "src/web/api_handlers_storage_migrations.c:308", + "ui_consumers": [ + "web/js/components/preact/settings/StorageTab.jsx:453" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 162, + "method": "POST", + "pattern": "/api/storage-migrations/#/retry", + "handler": "handle_post_storage_migration_retry", + "registered_at": "src/web/libuv_api_handlers.c:402", + "handler_defined_at": "src/web/api_handlers_storage_migrations.c:313", + "ui_consumers": [ + "web/js/components/preact/settings/StorageTab.jsx:453" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 163, + "method": "GET", + "pattern": "/api/storage-migrations/#", + "handler": "handle_get_storage_migration", + "registered_at": "src/web/libuv_api_handlers.c:404", + "handler_defined_at": "src/web/api_handlers_storage_migrations.c:265", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 164, + "method": "GET", + "pattern": "/api/storage-pools", + "handler": "handle_get_storage_pools", + "registered_at": "src/web/libuv_api_handlers.c:406", + "handler_defined_at": "src/web/api_handlers_storage_pools.c:224", + "ui_consumers": [ + "web/js/components/preact/settings/StorageTab.jsx:196", + "web/js/components/preact/settings/StorageTab.jsx:357", + "web/js/components/preact/settings/StorageTab.jsx:559" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 165, + "method": "POST", + "pattern": "/api/storage-pools", + "handler": "handle_post_storage_pool", + "registered_at": "src/web/libuv_api_handlers.c:408", + "handler_defined_at": "src/web/api_handlers_storage_pools.c:258", + "ui_consumers": [ + "web/js/components/preact/settings/StorageTab.jsx:373" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 166, + "method": "GET", + "pattern": "/api/storage-pools/#", + "handler": "handle_get_storage_pool", + "registered_at": "src/web/libuv_api_handlers.c:410", + "handler_defined_at": "src/web/api_handlers_storage_pools.c:284", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 167, + "method": "PUT", + "pattern": "/api/storage-pools/#", + "handler": "handle_put_storage_pool", + "registered_at": "src/web/libuv_api_handlers.c:412", + "handler_defined_at": "src/web/api_handlers_storage_pools.c:297", + "ui_consumers": [ + "web/js/components/preact/settings/StorageTab.jsx:373" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 168, + "method": "DELETE", + "pattern": "/api/storage-pools/#", + "handler": "handle_delete_storage_pool", + "registered_at": "src/web/libuv_api_handlers.c:414", + "handler_defined_at": "src/web/api_handlers_storage_pools.c:326", + "ui_consumers": [ + "web/js/components/preact/settings/StorageTab.jsx:382" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 169, + "method": "GET", + "pattern": "/api/storage-compliance", + "handler": "handle_get_storage_compliance", + "registered_at": "src/web/libuv_api_handlers.c:416", + "handler_defined_at": "src/web/api_handlers_storage_compliance.c:290", + "ui_consumers": [ + "web/js/components/preact/settings/StorageTab.jsx:672" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 170, + "method": "GET", + "pattern": "/api/storage-policies", + "handler": "handle_get_storage_policies", + "registered_at": "src/web/libuv_api_handlers.c:418", + "handler_defined_at": "src/web/api_handlers_storage_policies.c:660", + "ui_consumers": [ + "web/js/components/preact/settings/StorageTab.jsx:195", + "web/js/components/preact/settings/StorageTab.jsx:557" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 171, + "method": "POST", + "pattern": "/api/storage-policies", + "handler": "handle_post_storage_policy", + "registered_at": "src/web/libuv_api_handlers.c:420", + "handler_defined_at": "src/web/api_handlers_storage_policies.c:701", + "ui_consumers": [ + "web/js/components/preact/settings/StorageTab.jsx:630" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 172, + "method": "POST", + "pattern": "/api/storage-policies/preview", + "handler": "handle_post_storage_policy_preview", + "registered_at": "src/web/libuv_api_handlers.c:422", + "handler_defined_at": "src/web/api_handlers_storage_policies.c:422", + "ui_consumers": [ + "web/js/components/preact/settings/StorageTab.jsx:617" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 173, + "method": "GET", + "pattern": "/api/storage-policies/#", + "handler": "handle_get_storage_policy", + "registered_at": "src/web/libuv_api_handlers.c:424", + "handler_defined_at": "src/web/api_handlers_storage_policies.c:734", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 174, + "method": "PUT", + "pattern": "/api/storage-policies/#", + "handler": "handle_put_storage_policy", + "registered_at": "src/web/libuv_api_handlers.c:426", + "handler_defined_at": "src/web/api_handlers_storage_policies.c:749", + "ui_consumers": [ + "web/js/components/preact/settings/StorageTab.jsx:630" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 175, + "method": "DELETE", + "pattern": "/api/storage-policies/#", + "handler": "handle_delete_storage_policy", + "registered_at": "src/web/libuv_api_handlers.c:428", + "handler_defined_at": "src/web/api_handlers_storage_policies.c:801", + "ui_consumers": [ + "web/js/components/preact/settings/StorageTab.jsx:642" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 176, + "method": "POST", + "pattern": "/api/event-routes/preview", + "handler": "handle_post_event_route_preview", + "registered_at": "src/web/libuv_api_handlers.c:430", + "handler_defined_at": "src/web/api_handlers_event_routes.c:706", + "ui_consumers": [ + "web/js/components/preact/EventRoutingView.jsx:170" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/system-health-mqtt.api.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 177, + "method": "GET", + "pattern": "/api/event-routes", + "handler": "handle_get_event_routes", + "registered_at": "src/web/libuv_api_handlers.c:432", + "handler_defined_at": "src/web/api_handlers_event_routes.c:537", + "ui_consumers": [ + "web/js/components/preact/EventRoutingView.jsx:121" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/system-health-mqtt.api.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 178, + "method": "POST", + "pattern": "/api/event-routes", + "handler": "handle_post_event_route", + "registered_at": "src/web/libuv_api_handlers.c:434", + "handler_defined_at": "src/web/api_handlers_event_routes.c:584", + "ui_consumers": [ + "web/js/components/preact/EventRoutingView.jsx:164" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/system-health-mqtt.api.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 179, + "method": "GET", + "pattern": "/api/event-routes/#", + "handler": "handle_get_event_route", + "registered_at": "src/web/libuv_api_handlers.c:436", + "handler_defined_at": "src/web/api_handlers_event_routes.c:612", + "ui_consumers": [], + "integration_tests_referencing_path": [ + "tests/integration/specs/system-health-mqtt.api.spec.ts" + ], + "has_ui_consumer": false + }, + { + "order": 180, + "method": "PUT", + "pattern": "/api/event-routes/#", + "handler": "handle_put_event_route", + "registered_at": "src/web/libuv_api_handlers.c:438", + "handler_defined_at": "src/web/api_handlers_event_routes.c:627", + "ui_consumers": [ + "web/js/components/preact/EventRoutingView.jsx:164", + "web/js/components/preact/EventRoutingView.jsx:173" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/system-health-mqtt.api.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 181, + "method": "DELETE", + "pattern": "/api/event-routes/#", + "handler": "handle_delete_event_route", + "registered_at": "src/web/libuv_api_handlers.c:440", + "handler_defined_at": "src/web/api_handlers_event_routes.c:683", + "ui_consumers": [ + "web/js/components/preact/EventRoutingView.jsx:177" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/system-health-mqtt.api.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 182, + "method": "POST", + "pattern": "/api/auth/users/#/totp/setup", + "handler": "handle_totp_setup", + "registered_at": "src/web/libuv_api_handlers.c:444", + "handler_defined_at": "src/web/api_handlers_totp.c:280", + "ui_consumers": [ + "web/js/components/preact/users/TotpSetupModal.jsx:70" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 183, + "method": "POST", + "pattern": "/api/auth/users/#/totp/verify", + "handler": "handle_totp_verify", + "registered_at": "src/web/libuv_api_handlers.c:445", + "handler_defined_at": "src/web/api_handlers_totp.c:340", + "ui_consumers": [ + "web/js/components/preact/users/TotpSetupModal.jsx:96" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 184, + "method": "POST", + "pattern": "/api/auth/users/#/totp/disable", + "handler": "handle_totp_disable", + "registered_at": "src/web/libuv_api_handlers.c:446", + "handler_defined_at": "src/web/api_handlers_totp.c:408", + "ui_consumers": [ + "web/js/components/preact/users/TotpSetupModal.jsx:117" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 185, + "method": "GET", + "pattern": "/api/auth/users/#/totp/status", + "handler": "handle_totp_status", + "registered_at": "src/web/libuv_api_handlers.c:447", + "handler_defined_at": "src/web/api_handlers_totp.c:449", + "ui_consumers": [ + "web/js/components/preact/users/TotpSetupModal.jsx:33" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 186, + "method": "POST", + "pattern": "/api/auth/login/totp", + "handler": "handle_auth_login_totp", + "registered_at": "src/web/libuv_api_handlers.c:448", + "handler_defined_at": "src/web/api_handlers_totp.c:485", + "ui_consumers": [ + "web/js/components/preact/LoginView.jsx:246" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 187, + "method": "GET", + "pattern": "/api/onvif/discovery/status", + "handler": "handle_get_onvif_discovery_status", + "registered_at": "src/web/libuv_api_handlers.c:451", + "handler_defined_at": "src/web/api_handlers_onvif_backend_agnostic.c:60", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 188, + "method": "GET", + "pattern": "/api/onvif/devices", + "handler": "handle_get_discovered_onvif_devices", + "registered_at": "src/web/libuv_api_handlers.c:452", + "handler_defined_at": "src/web/api_handlers_onvif_backend_agnostic.c:99", + "ui_consumers": [ + "web/js/components/preact/StreamsView.jsx:992" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 189, + "method": "POST", + "pattern": "/api/onvif/discovery/discover", + "handler": "handle_post_discover_onvif_devices", + "registered_at": "src/web/libuv_api_handlers.c:453", + "handler_defined_at": "src/web/api_handlers_onvif_backend_agnostic.c:180", + "ui_consumers": [ + "web/js/components/preact/StreamsView.jsx:1085" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 190, + "method": "GET", + "pattern": "/api/onvif/device/profiles", + "handler": "handle_get_onvif_device_profiles", + "registered_at": "src/web/libuv_api_handlers.c:454", + "handler_defined_at": "src/web/api_handlers_onvif_backend_agnostic.c:290", + "ui_consumers": [ + "web/js/components/preact/StreamsView.jsx:1163" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 191, + "method": "POST", + "pattern": "/api/onvif/device/add", + "handler": "handle_post_add_onvif_device_as_stream", + "registered_at": "src/web/libuv_api_handlers.c:455", + "handler_defined_at": "src/web/api_handlers_onvif_backend_agnostic.c:409", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 192, + "method": "POST", + "pattern": "/api/onvif/device/claim", + "handler": "handle_post_claim_onvif_device", + "registered_at": "src/web/libuv_api_handlers.c:456", + "handler_defined_at": "src/web/api_handlers_onvif_backend_agnostic.c:524", + "ui_consumers": [ + "web/js/components/preact/StreamsView.jsx:1286" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 193, + "method": "POST", + "pattern": "/api/onvif/device/test", + "handler": "handle_post_test_onvif_connection", + "registered_at": "src/web/libuv_api_handlers.c:457", + "handler_defined_at": "src/web/api_handlers_onvif_backend_agnostic.c:564", + "ui_consumers": [ + "web/js/components/preact/StreamsView.jsx:1216" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 194, + "method": "GET", + "pattern": "/api/recordings/thumbnail/#/#", + "handler": "handle_recordings_thumbnail", + "registered_at": "src/web/libuv_api_handlers.c:461", + "handler_defined_at": "src/web/api_handlers_recordings_thumbnail.c:306", + "ui_consumers": [ + "web/js/components/preact/recordings/RecordingsGrid.jsx:131", + "web/js/components/preact/recordings/RecordingsGrid.jsx:144", + "web/js/components/preact/recordings/RecordingsGrid.jsx:185", + "web/js/components/preact/recordings/RecordingsGrid.jsx:222", + "web/js/components/preact/timeline/TimelineCursor.jsx:444", + "web/js/components/preact/timeline/TimelineCursor.jsx:73", + "web/js/components/preact/timeline/TimelineSegments.jsx:214", + "web/js/components/preact/timeline/TimelineSegments.jsx:352" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 195, + "method": "GET", + "pattern": "/api/recordings/play/#", + "handler": "handle_recordings_playback", + "registered_at": "src/web/libuv_api_handlers.c:462", + "handler_defined_at": "src/web/api_handlers_recordings_playback.c:36", + "ui_consumers": [ + "web/js/components/preact/RecordingsView.jsx:958", + "web/js/components/preact/investigation/InvestigationView.jsx:238", + "web/js/components/preact/recordings/recordingsAPI.jsx:690", + "web/js/components/preact/timeline/TimelinePlayer.jsx:291" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/recordings.ui.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 196, + "method": "GET", + "pattern": "/api/recordings/download/#", + "handler": "handle_recordings_download", + "registered_at": "src/web/libuv_api_handlers.c:463", + "handler_defined_at": "src/web/api_handlers_recordings_download.c:60", + "ui_consumers": [ + "web/js/components/preact/BatchDownloadModal.jsx:16", + "web/js/components/preact/RecordingsView.jsx:960", + "web/js/components/preact/recordings/recordingsAPI.jsx:692", + "web/js/components/preact/recordings/recordingsAPI.jsx:822", + "web/js/components/preact/timeline/TimelinePlayer.jsx:1075" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 197, + "method": "GET", + "pattern": "/api/recordings/files/check", + "handler": "handle_check_recording_file", + "registered_at": "src/web/libuv_api_handlers.c:464", + "handler_defined_at": "src/web/api_handlers_recordings_files_backend_agnostic.c:60", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 198, + "method": "DELETE", + "pattern": "/api/recordings/files", + "handler": "handle_delete_recording_file", + "registered_at": "src/web/libuv_api_handlers.c:465", + "handler_defined_at": "src/web/api_handlers_recordings_files_backend_agnostic.c:134", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 199, + "method": "GET", + "pattern": "/api/recordings/batch-delete/progress/#", + "handler": "handle_batch_delete_progress", + "registered_at": "src/web/libuv_api_handlers.c:466", + "handler_defined_at": "src/web/api_handlers_recordings_backend_agnostic.c:947", + "ui_consumers": [ + "web/js/components/preact/BatchDeleteModal.jsx:169", + "web/js/components/preact/recordings/recordingsAPI.jsx:472" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 200, + "method": "POST", + "pattern": "/api/recordings/batch-delete", + "handler": "handle_batch_delete_recordings", + "registered_at": "src/web/libuv_api_handlers.c:467", + "handler_defined_at": "src/web/api_handlers_recordings_backend_agnostic.c:802", + "ui_consumers": [ + "web/js/components/preact/BatchDeleteModal.jsx:134", + "web/js/components/preact/recordings/recordingsAPI.jsx:256", + "web/js/components/preact/recordings/recordingsAPI.jsx:435", + "web/js/components/preact/recordings/recordingsAPI.jsx:591" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 201, + "method": "GET", + "pattern": "/api/recordings/batch-download/status/#", + "handler": "handle_batch_download_status", + "registered_at": "src/web/libuv_api_handlers.c:468", + "handler_defined_at": "src/web/api_handlers_recordings_batch_download.c:644", + "ui_consumers": [ + "web/js/components/preact/BatchDownloadModal.jsx:50", + "web/js/components/preact/investigation/InvestigationActions.jsx:179" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 202, + "method": "GET", + "pattern": "/api/recordings/batch-download/result/#", + "handler": "handle_batch_download_result", + "registered_at": "src/web/libuv_api_handlers.c:469", + "handler_defined_at": "src/web/api_handlers_recordings_batch_download.c:683", + "ui_consumers": [ + "web/js/components/preact/BatchDownloadModal.jsx:60", + "web/js/components/preact/investigation/InvestigationActions.jsx:26" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 203, + "method": "POST", + "pattern": "/api/recordings/batch-download", + "handler": "handle_batch_download_recordings", + "registered_at": "src/web/libuv_api_handlers.c:470", + "handler_defined_at": "src/web/api_handlers_recordings_batch_download.c:487", + "ui_consumers": [ + "web/js/components/preact/BatchDownloadModal.jsx:39", + "web/js/components/preact/investigation/InvestigationActions.jsx:164" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 204, + "method": "GET", + "pattern": "/api/recordings/protected", + "handler": "handle_get_protected_recordings", + "registered_at": "src/web/libuv_api_handlers.c:471", + "handler_defined_at": "src/web/api_handlers_retention.c:397", + "ui_consumers": [], + "integration_tests_referencing_path": [ + "tests/integration/specs/comprehensive.api.spec.ts" + ], + "has_ui_consumer": false + }, + { + "order": 205, + "method": "POST", + "pattern": "/api/recordings/batch-protect", + "handler": "handle_batch_protect_recordings", + "registered_at": "src/web/libuv_api_handlers.c:472", + "handler_defined_at": "src/web/api_handlers_retention.c:460", + "ui_consumers": [ + "web/js/components/preact/investigation/InvestigationActions.jsx:129" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 206, + "method": "POST", + "pattern": "/api/recordings/sync", + "handler": "handle_post_recordings_sync", + "registered_at": "src/web/libuv_api_handlers.c:473", + "handler_defined_at": "src/web/api_handlers_recordings_sync.c:32", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 207, + "method": "GET", + "pattern": "/api/recordings/tags", + "handler": "handle_get_recording_tags", + "registered_at": "src/web/libuv_api_handlers.c:474", + "handler_defined_at": "src/web/api_handlers_recording_tags.c:82", + "ui_consumers": [ + "web/js/components/preact/recordings/recordingsAPI.jsx:715" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 208, + "method": "GET", + "pattern": "/api/recordings/detection-labels", + "handler": "handle_get_recording_detection_labels", + "registered_at": "src/web/libuv_api_handlers.c:475", + "handler_defined_at": "src/web/api_handlers_recording_tags.c:116", + "ui_consumers": [ + "web/js/components/preact/recordings/recordingsAPI.jsx:737" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 209, + "method": "POST", + "pattern": "/api/recordings/batch-tags", + "handler": "handle_batch_recording_tags", + "registered_at": "src/web/libuv_api_handlers.c:476", + "handler_defined_at": "src/web/api_handlers_recording_tags.c:307", + "ui_consumers": [ + "web/js/components/preact/recordings/recordingsAPI.jsx:801" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 210, + "method": "GET", + "pattern": "/api/recordings/#/tags", + "handler": "handle_get_recording_tags_by_id", + "registered_at": "src/web/libuv_api_handlers.c:477", + "handler_defined_at": "src/web/api_handlers_recording_tags.c:150", + "ui_consumers": [ + "web/js/components/preact/recordings/recordingsAPI.jsx:756", + "web/js/components/preact/timeline/TimelinePlayer.jsx:612" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 211, + "method": "PUT", + "pattern": "/api/recordings/#/tags", + "handler": "handle_put_recording_tags", + "registered_at": "src/web/libuv_api_handlers.c:478", + "handler_defined_at": "src/web/api_handlers_recording_tags.c:200", + "ui_consumers": [ + "web/js/components/preact/recordings/recordingsAPI.jsx:776" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 212, + "method": "PUT", + "pattern": "/api/recordings/#/protect", + "handler": "handle_put_recording_protect", + "registered_at": "src/web/libuv_api_handlers.c:479", + "handler_defined_at": "src/web/api_handlers_retention.c:227", + "ui_consumers": [ + "web/js/components/preact/RecordingsView.jsx:908", + "web/js/components/preact/UI.jsx:367", + "web/js/components/preact/timeline/TimelineControls.jsx:245" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 213, + "method": "PUT", + "pattern": "/api/recordings/#/retention", + "handler": "handle_put_recording_retention", + "registered_at": "src/web/libuv_api_handlers.c:480", + "handler_defined_at": "src/web/api_handlers_retention.c:309", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 214, + "method": "GET", + "pattern": "/api/recordings/#", + "handler": "handle_get_recording", + "registered_at": "src/web/libuv_api_handlers.c:481", + "handler_defined_at": "src/web/api_handlers_recordings_backend_agnostic.c:69", + "ui_consumers": [ + "web/js/components/preact/UI.jsx:292", + "web/js/components/preact/recordings/recordingsAPI.jsx:166", + "web/js/components/preact/timeline/TimelinePlayer.jsx:575" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/comprehensive.api.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 215, + "method": "DELETE", + "pattern": "/api/recordings/#", + "handler": "handle_delete_recording", + "registered_at": "src/web/libuv_api_handlers.c:482", + "handler_defined_at": "src/web/api_handlers_recordings_backend_agnostic.c:257", + "ui_consumers": [ + "web/js/components/preact/UI.jsx:393", + "web/js/components/preact/recordings/recordingsAPI.jsx:227", + "web/js/components/preact/recordings/recordingsAPI.jsx:382", + "web/js/components/preact/timeline/TimelinePlayer.jsx:847" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/comprehensive.api.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 216, + "method": "GET", + "pattern": "/api/recordings", + "handler": "handle_get_recordings", + "registered_at": "src/web/libuv_api_handlers.c:483", + "handler_defined_at": "src/web/api_handlers_recordings_list.c:312", + "ui_consumers": [ + "web/js/components/preact/recordings/recordingsAPI.jsx:204", + "web/js/components/preact/recordings/recordingsAPI.jsx:347", + "web/js/components/preact/recordings/recordingsAPI.jsx:546" + ], + "integration_tests_referencing_path": [ + "tests/integration/fixtures/test-fixtures.ts", + "tests/integration/lightnvr.api.spec.ts", + "tests/integration/specs/comprehensive.api.spec.ts" + ], + "has_ui_consumer": true + }, + { + "order": 217, + "method": "GET", + "pattern": "/api/timeline/segments-by-ids", + "handler": "handle_get_timeline_segments_by_ids", + "registered_at": "src/web/libuv_api_handlers.c:486", + "handler_defined_at": "src/web/api_handlers_timeline.c:1021", + "ui_consumers": [ + "web/js/components/preact/timeline/TimelinePage.jsx:1094" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 218, + "method": "GET", + "pattern": "/api/timeline/segments", + "handler": "handle_get_timeline_segments", + "registered_at": "src/web/libuv_api_handlers.c:487", + "handler_defined_at": "src/web/api_handlers_timeline.c:459", + "ui_consumers": [ + "web/js/components/preact/timeline/timelineUtils.js:22" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 219, + "method": "GET", + "pattern": "/api/timeline/manifest", + "handler": "handle_timeline_manifest", + "registered_at": "src/web/libuv_api_handlers.c:488", + "handler_defined_at": "src/web/api_handlers_timeline.c:723", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 220, + "method": "GET", + "pattern": "/api/timeline/play", + "handler": "handle_timeline_playback", + "registered_at": "src/web/libuv_api_handlers.c:489", + "handler_defined_at": "src/web/api_handlers_timeline.c:811", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 221, + "method": "POST", + "pattern": "/api/investigations/timeline", + "handler": "handle_post_investigation_timeline", + "registered_at": "src/web/libuv_api_handlers.c:490", + "handler_defined_at": "src/web/api_handlers_investigations.c:251", + "ui_consumers": [ + "web/js/components/preact/investigation/InvestigationView.jsx:987" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 222, + "method": "POST", + "pattern": "/api/investigations/segment-at", + "handler": "handle_post_investigation_segment_at", + "registered_at": "src/web/libuv_api_handlers.c:491", + "handler_defined_at": "src/web/api_handlers_investigations.c:426", + "ui_consumers": [ + "web/js/components/preact/investigation/InvestigationView.jsx:150" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 223, + "method": "POST", + "pattern": "/api/investigations/search", + "handler": "handle_post_investigation_search", + "registered_at": "src/web/libuv_api_handlers.c:492", + "handler_defined_at": "src/web/api_handlers_investigations.c:1121", + "ui_consumers": [ + "web/js/components/preact/investigation/InvestigationView.jsx:878", + "web/js/components/preact/investigation/InvestigationView.jsx:897", + "web/js/components/preact/live/LiveOperatorNavigator.jsx:149" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 224, + "method": "POST", + "pattern": "/api/investigations/recordings/preview", + "handler": "handle_post_investigation_recording_preview", + "registered_at": "src/web/libuv_api_handlers.c:493", + "handler_defined_at": "src/web/api_handlers_investigations.c:488", + "ui_consumers": [ + "web/js/components/preact/investigation/InvestigationActions.jsx:66" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 225, + "method": "POST", + "pattern": "/api/investigations/thumbnail-samples", + "handler": "handle_post_investigation_thumbnail_samples", + "registered_at": "src/web/libuv_api_handlers.c:494", + "handler_defined_at": "src/web/api_handlers_investigations.c:675", + "ui_consumers": [ + "web/js/components/preact/investigation/InvestigationView.jsx:1262" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 226, + "method": "GET", + "pattern": "/api/investigations/thumbnail/#/#", + "handler": "handle_investigation_thumbnail", + "registered_at": "src/web/libuv_api_handlers.c:495", + "handler_defined_at": "src/web/api_handlers_recordings_thumbnail.c:401", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 227, + "method": "GET", + "pattern": "/api/investigation-bookmarks/#", + "handler": "handle_get_investigation_bookmark", + "registered_at": "src/web/libuv_api_handlers.c:496", + "handler_defined_at": "src/web/api_handlers_investigation_bookmarks.c:578", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 228, + "method": "PUT", + "pattern": "/api/investigation-bookmarks/#", + "handler": "handle_put_investigation_bookmark", + "registered_at": "src/web/libuv_api_handlers.c:497", + "handler_defined_at": "src/web/api_handlers_investigation_bookmarks.c:602", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 229, + "method": "DELETE", + "pattern": "/api/investigation-bookmarks/#", + "handler": "handle_delete_investigation_bookmark", + "registered_at": "src/web/libuv_api_handlers.c:498", + "handler_defined_at": "src/web/api_handlers_investigation_bookmarks.c:648", + "ui_consumers": [ + "web/js/components/preact/investigation/InvestigationBookmarks.jsx:103" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 230, + "method": "GET", + "pattern": "/api/investigation-bookmarks", + "handler": "handle_get_investigation_bookmarks", + "registered_at": "src/web/libuv_api_handlers.c:499", + "handler_defined_at": "src/web/api_handlers_investigation_bookmarks.c:465", + "ui_consumers": [ + "web/js/components/preact/investigation/InvestigationBookmarks.jsx:50" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 231, + "method": "POST", + "pattern": "/api/investigation-bookmarks", + "handler": "handle_post_investigation_bookmark", + "registered_at": "src/web/libuv_api_handlers.c:500", + "handler_defined_at": "src/web/api_handlers_investigation_bookmarks.c:525", + "ui_consumers": [ + "web/js/components/preact/investigation/InvestigationBookmarks.jsx:80" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 232, + "method": "GET", + "pattern": "/hls/#/#", + "handler": "handle_direct_hls_request", + "registered_at": "src/web/libuv_api_handlers.c:504", + "handler_defined_at": "src/web/api_handlers_streaming.c:28", + "ui_consumers": [ + "web/js/components/preact/HLSVideoCell.jsx:206", + "web/js/components/preact/HLSVideoCell.jsx:260", + "web/js/components/preact/HLSVideoCell.jsx:266" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 233, + "method": "GET", + "pattern": "/go2rtc/api/ws", + "handler": "handle_go2rtc_proxy", + "registered_at": "src/web/libuv_api_handlers.c:508", + "handler_defined_at": "src/web/api_handlers_go2rtc_proxy.c:504", + "ui_consumers": [ + "web/js/components/preact/MSEVideoCell.jsx:220" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 234, + "method": "POST", + "pattern": "/go2rtc/api/webrtc", + "handler": "handle_go2rtc_proxy", + "registered_at": "src/web/libuv_api_handlers.c:509", + "handler_defined_at": "src/web/api_handlers_go2rtc_proxy.c:504", + "ui_consumers": [ + "web/js/components/preact/WebRTCVideoCell.jsx:852" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 235, + "method": "GET", + "pattern": "/go2rtc/api/streams", + "handler": "handle_go2rtc_proxy", + "registered_at": "src/web/libuv_api_handlers.c:511", + "handler_defined_at": "src/web/api_handlers_go2rtc_proxy.c:504", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 236, + "method": "POST", + "pattern": "/go2rtc/api/reload", + "handler": "handle_go2rtc_proxy", + "registered_at": "src/web/libuv_api_handlers.c:513", + "handler_defined_at": "src/web/api_handlers_go2rtc_proxy.c:504", + "ui_consumers": [], + "integration_tests_referencing_path": [], + "has_ui_consumer": false + }, + { + "order": 237, + "method": "GET", + "pattern": "/go2rtc/api/stream.m3u8", + "handler": "handle_go2rtc_proxy", + "registered_at": "src/web/libuv_api_handlers.c:515", + "handler_defined_at": "src/web/api_handlers_go2rtc_proxy.c:504", + "ui_consumers": [ + "web/js/components/preact/HLSVideoCell.jsx:245" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 238, + "method": "GET", + "pattern": "/go2rtc/api/hls/*", + "handler": "handle_go2rtc_proxy", + "registered_at": "src/web/libuv_api_handlers.c:517", + "handler_defined_at": "src/web/api_handlers_go2rtc_proxy.c:504", + "ui_consumers": [ + "web/js/components/preact/HLSVideoCell.jsx:245" + ], + "integration_tests_referencing_path": [], + "has_ui_consumer": true + }, + { + "order": 239, + "method": "GET", + "pattern": "/go2rtc/api/frame.jpeg", + "handler": "handle_go2rtc_proxy", + "registered_at": "src/web/libuv_api_handlers.c:519", + "handler_defined_at": "src/web/api_handlers_go2rtc_proxy.c:504", + "ui_consumers": [ + "web/js/components/preact/StreamCard.jsx:140", + "web/js/components/preact/ZoneEditor.jsx:82", + "web/js/components/preact/ZoneEditor.jsx:88", + "web/js/components/preact/live/LiveBuildingPlan.jsx:90" + ], + "integration_tests_referencing_path": [ + "tests/integration/specs/stream-snapshot-requests.ui.spec.ts" + ], + "has_ui_consumer": true + } + ], + "ui_operations": [ + { + "file": "web/js/components/preact/AuthGate.jsx", + "line": 38, + "url_literal": "/api/auth/users/${session.id}/password", + "normalized": "/api/auth/users/{}/password", + "method": "PUT", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "PUT /api/auth/users/#/password", + "matched_handler": "handle_users_change_password", + "domain": "shared-auth", + "status": "mapped", + "id": "UI-001" + }, + { + "file": "web/js/components/preact/BatchDeleteModal.jsx", + "line": 134, + "url_literal": "/api/recordings/batch-delete", + "normalized": "/api/recordings/batch-delete", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/recordings/batch-delete", + "matched_handler": "handle_batch_delete_recordings", + "domain": "recordings", + "status": "mapped", + "id": "UI-002" + }, + { + "file": "web/js/components/preact/BatchDeleteModal.jsx", + "line": 169, + "url_literal": "/api/recordings/batch-delete/progress/${jobId}", + "normalized": "/api/recordings/batch-delete/progress/{}", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/recordings/batch-delete/progress/#", + "matched_handler": "handle_batch_delete_progress", + "domain": "recordings", + "status": "mapped", + "id": "UI-003" + }, + { + "file": "web/js/components/preact/BatchDownloadModal.jsx", + "line": 16, + "url_literal": "/api/recordings/download/${r.id}", + "normalized": "/api/recordings/download/{}", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "media-or-binary", + "matched_route": "GET /api/recordings/download/#", + "matched_handler": "handle_recordings_download", + "domain": "recordings", + "status": "mapped", + "id": "UI-004" + }, + { + "file": "web/js/components/preact/BatchDownloadModal.jsx", + "line": 39, + "url_literal": "/api/recordings/batch-download", + "normalized": "/api/recordings/batch-download", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/recordings/batch-download", + "matched_handler": "handle_batch_download_recordings", + "domain": "recordings", + "status": "mapped", + "id": "UI-005" + }, + { + "file": "web/js/components/preact/BatchDownloadModal.jsx", + "line": 50, + "url_literal": "/api/recordings/batch-download/status/${token}", + "normalized": "/api/recordings/batch-download/status/{}", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/recordings/batch-download/status/#", + "matched_handler": "handle_batch_download_status", + "domain": "recordings", + "status": "mapped", + "id": "UI-006" + }, + { + "file": "web/js/components/preact/BatchDownloadModal.jsx", + "line": 60, + "url_literal": "/api/recordings/batch-download/result/${token}", + "normalized": "/api/recordings/batch-download/result/{}", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/recordings/batch-download/result/#", + "matched_handler": "handle_batch_download_result", + "domain": "recordings", + "status": "mapped", + "id": "UI-007" + }, + { + "file": "web/js/components/preact/DayNightControl.jsx", + "line": 69, + "url_literal": "/api/streams/${encodeURIComponent(stream.name)}/daynight", + "normalized": "/api/streams/{}/daynight", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/streams/#/daynight", + "matched_handler": "handle_daynight_get", + "domain": "live", + "status": "mapped", + "id": "UI-008" + }, + { + "file": "web/js/components/preact/DayNightControl.jsx", + "line": 95, + "url_literal": "/api/streams/${encodeURIComponent(stream.name)}/daynight", + "normalized": "/api/streams/{}/daynight", + "method": "PUT", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "PUT /api/streams/#/daynight", + "matched_handler": "handle_daynight_put", + "domain": "live", + "status": "mapped", + "id": "UI-009" + }, + { + "file": "web/js/components/preact/DetectionOverlay.jsx", + "line": 43, + "url_literal": "/api/streams/${encodeURIComponent(streamName)}/zones", + "normalized": "/api/streams/{}/zones", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/streams/#/zones", + "matched_handler": "handle_get_zones", + "domain": "live", + "status": "mapped", + "id": "UI-010" + }, + { + "file": "web/js/components/preact/EventRoutingView.jsx", + "line": 121, + "url_literal": "/api/event-routes", + "normalized": "/api/event-routes", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/event-routes", + "matched_handler": "handle_get_event_routes", + "domain": "events", + "status": "mapped", + "id": "UI-011" + }, + { + "file": "web/js/components/preact/EventRoutingView.jsx", + "line": 122, + "url_literal": "/api/event-destinations", + "normalized": "/api/event-destinations", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/event-destinations", + "matched_handler": "handle_get_event_destinations", + "domain": "events", + "status": "mapped", + "id": "UI-012" + }, + { + "file": "web/js/components/preact/EventRoutingView.jsx", + "line": 123, + "url_literal": "/api/events/catalog", + "normalized": "/api/events/catalog", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/events/catalog", + "matched_handler": "handle_get_event_catalog", + "domain": "events", + "status": "mapped", + "id": "UI-013" + }, + { + "file": "web/js/components/preact/EventRoutingView.jsx", + "line": 124, + "url_literal": "/api/settings", + "normalized": "/api/settings", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/settings", + "matched_handler": "handle_get_settings", + "domain": "events", + "status": "mapped", + "id": "UI-014" + }, + { + "file": "web/js/components/preact/EventRoutingView.jsx", + "line": 125, + "url_literal": "/api/locations", + "normalized": "/api/locations", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/locations", + "matched_handler": "handle_get_locations", + "domain": "events", + "status": "mapped", + "id": "UI-015" + }, + { + "file": "web/js/components/preact/EventRoutingView.jsx", + "line": 126, + "url_literal": "/api/camera-tags", + "normalized": "/api/camera-tags", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/camera-tags", + "matched_handler": "handle_get_camera_tags", + "domain": "events", + "status": "mapped", + "id": "UI-016" + }, + { + "file": "web/js/components/preact/EventRoutingView.jsx", + "line": 164, + "url_literal": "/api/event-routes/${encodeURIComponent(routeEditor.uuid)}", + "normalized": "/api/event-routes/{}", + "method": "PUT", + "method_evidence": "hand-reviewed ternary: method method: editing ? 'PUT' : 'POST' (URL #1 on line)", + "transport": "json", + "matched_route": "PUT /api/event-routes/#", + "matched_handler": "handle_put_event_route", + "domain": "events", + "status": "mapped", + "id": "UI-017" + }, + { + "file": "web/js/components/preact/EventRoutingView.jsx", + "line": 164, + "url_literal": "/api/event-routes", + "normalized": "/api/event-routes", + "method": "POST", + "method_evidence": "hand-reviewed ternary: method method: editing ? 'PUT' : 'POST' (URL #2 on line)", + "transport": "json", + "matched_route": "POST /api/event-routes", + "matched_handler": "handle_post_event_route", + "domain": "events", + "status": "mapped", + "id": "UI-018" + }, + { + "file": "web/js/components/preact/EventRoutingView.jsx", + "line": 170, + "url_literal": "/api/event-routes/preview", + "normalized": "/api/event-routes/preview", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/event-routes/preview", + "matched_handler": "handle_post_event_route_preview", + "domain": "events", + "status": "mapped", + "id": "UI-019" + }, + { + "file": "web/js/components/preact/EventRoutingView.jsx", + "line": 173, + "url_literal": "/api/event-routes/${encodeURIComponent(route.uuid)}", + "normalized": "/api/event-routes/{}", + "method": "PUT", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "PUT /api/event-routes/#", + "matched_handler": "handle_put_event_route", + "domain": "events", + "status": "mapped", + "id": "UI-020" + }, + { + "file": "web/js/components/preact/EventRoutingView.jsx", + "line": 177, + "url_literal": "/api/event-routes/${encodeURIComponent(route.uuid)}?revision=${encodeURIComponent(route.revision)}", + "normalized": "/api/event-routes/{}", + "method": "DELETE", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "DELETE /api/event-routes/#", + "matched_handler": "handle_delete_event_route", + "domain": "events", + "status": "mapped", + "id": "UI-021" + }, + { + "file": "web/js/components/preact/EventRoutingView.jsx", + "line": 182, + "url_literal": "/api/event-destinations/${encodeURIComponent(destinationEditor.uuid)}", + "normalized": "/api/event-destinations/{}", + "method": "PUT", + "method_evidence": "hand-reviewed ternary: method method: editing ? 'PUT' : 'POST' (URL #1 on line)", + "transport": "json", + "matched_route": "PUT /api/event-destinations/#", + "matched_handler": "handle_put_event_destination", + "domain": "events", + "status": "mapped", + "id": "UI-022" + }, + { + "file": "web/js/components/preact/EventRoutingView.jsx", + "line": 182, + "url_literal": "/api/event-destinations", + "normalized": "/api/event-destinations", + "method": "POST", + "method_evidence": "hand-reviewed ternary: method method: editing ? 'PUT' : 'POST' (URL #2 on line)", + "transport": "json", + "matched_route": "POST /api/event-destinations", + "matched_handler": "handle_post_event_destination", + "domain": "events", + "status": "mapped", + "id": "UI-023" + }, + { + "file": "web/js/components/preact/EventRoutingView.jsx", + "line": 190, + "url_literal": "/api/event-destinations/${encodeURIComponent(destination.uuid)}", + "normalized": "/api/event-destinations/{}", + "method": "PUT", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "PUT /api/event-destinations/#", + "matched_handler": "handle_put_event_destination", + "domain": "events", + "status": "mapped", + "id": "UI-024" + }, + { + "file": "web/js/components/preact/EventRoutingView.jsx", + "line": 194, + "url_literal": "/api/event-destinations/${encodeURIComponent(destination.uuid)}?revision=${encodeURIComponent(destination.revision)}", + "normalized": "/api/event-destinations/{}", + "method": "DELETE", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "DELETE /api/event-destinations/#", + "matched_handler": "handle_delete_event_destination", + "domain": "events", + "status": "mapped", + "id": "UI-025" + }, + { + "file": "web/js/components/preact/FleetView.jsx", + "line": 134, + "url_literal": "/api/fleet/cameras/query", + "normalized": "/api/fleet/cameras/query", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/fleet/cameras/query", + "matched_handler": "handle_post_fleet_camera_query", + "domain": "fleet", + "status": "mapped", + "id": "UI-026" + }, + { + "file": "web/js/components/preact/FleetView.jsx", + "line": 151, + "url_literal": "/api/locations", + "normalized": "/api/locations", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/locations", + "matched_handler": "handle_get_locations", + "domain": "fleet", + "status": "mapped", + "id": "UI-027" + }, + { + "file": "web/js/components/preact/FleetView.jsx", + "line": 159, + "url_literal": "/api/camera-tags", + "normalized": "/api/camera-tags", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/camera-tags", + "matched_handler": "handle_get_camera_tags", + "domain": "fleet", + "status": "mapped", + "id": "UI-028" + }, + { + "file": "web/js/components/preact/FleetView.jsx", + "line": 167, + "url_literal": "/api/camera-collections", + "normalized": "/api/camera-collections", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/camera-collections", + "matched_handler": "handle_get_camera_collections", + "domain": "fleet", + "status": "mapped", + "id": "UI-029" + }, + { + "file": "web/js/components/preact/FleetView.jsx", + "line": 173, + "url_literal": "/api/fleet/views", + "normalized": "/api/fleet/views", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/fleet/views", + "matched_handler": "handle_get_fleet_saved_views", + "domain": "fleet", + "status": "mapped", + "id": "UI-030" + }, + { + "file": "web/js/components/preact/HLSVideoCell.jsx", + "line": 153, + "url_literal": "/api/streams/${encodeURIComponent(stream.name)}/refresh", + "normalized": "/api/streams/{}/refresh", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/streams/#/refresh", + "matched_handler": "handle_post_stream_refresh", + "domain": "live", + "status": "mapped", + "id": "UI-031" + }, + { + "file": "web/js/components/preact/HLSVideoCell.jsx", + "line": 206, + "url_literal": "/hls/${encodeURIComponent(stream.name)}/index.m3u8", + "normalized": "/hls/{}/index.m3u8", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "native-hls-media", + "matched_route": "GET /hls/#/#", + "matched_handler": "handle_direct_hls_request", + "domain": "live", + "status": "mapped", + "id": "UI-032" + }, + { + "file": "web/js/components/preact/HLSVideoCell.jsx", + "line": 245, + "url_literal": "${go2rtcBaseUrl}/api/stream.m3u8?src=${encodeURIComponent(effectiveName)}&mp4=flac${audioDisabled ? '&video' : ''}", + "normalized": "/go2rtc/api/stream.m3u8", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "go2rtc-proxy", + "matched_route": "GET /go2rtc/api/stream.m3u8", + "matched_handler": "handle_go2rtc_proxy", + "domain": "live", + "status": "mapped", + "id": "UI-033" + }, + { + "file": "web/js/components/preact/HLSVideoCell.jsx", + "line": 260, + "url_literal": "/hls/${encodeURIComponent(stream.name)}/index.m3u8", + "normalized": "/hls/{}/index.m3u8", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "native-hls-media", + "matched_route": "GET /hls/#/#", + "matched_handler": "handle_direct_hls_request", + "domain": "live", + "status": "mapped", + "id": "UI-034" + }, + { + "file": "web/js/components/preact/HLSVideoCell.jsx", + "line": 266, + "url_literal": "/hls/${encodeURIComponent(stream.name)}/index.m3u8", + "normalized": "/hls/{}/index.m3u8", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "native-hls-media", + "matched_route": "GET /hls/#/#", + "matched_handler": "handle_direct_hls_request", + "domain": "live", + "status": "mapped", + "id": "UI-035" + }, + { + "file": "web/js/components/preact/HLSVideoCell.jsx", + "line": 665, + "url_literal": "/api/streams/${encodeURIComponent(stream.name)}", + "normalized": "/api/streams/{}", + "method": "PUT", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "PUT /api/streams/#", + "matched_handler": "handle_put_stream", + "domain": "live", + "status": "mapped", + "id": "UI-036" + }, + { + "file": "web/js/components/preact/HLSVideoCell.jsx", + "line": 688, + "url_literal": "/api/streams/${encodeURIComponent(stream.name)}", + "normalized": "/api/streams/{}", + "method": "PUT", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "PUT /api/streams/#", + "matched_handler": "handle_put_stream", + "domain": "live", + "status": "mapped", + "id": "UI-037" + }, + { + "file": "web/js/components/preact/Header.jsx", + "line": 177, + "url_literal": "/api/auth/users/${currentUser.id}", + "normalized": "/api/auth/users/{}", + "method": "PUT", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "PUT /api/auth/users/#", + "matched_handler": "handle_users_update", + "domain": "shared-shell", + "status": "mapped", + "id": "UI-038" + }, + { + "file": "web/js/components/preact/Header.jsx", + "line": 306, + "url_literal": "/logout", + "normalized": "/logout", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "navigation", + "matched_route": "GET /logout", + "matched_handler": "handle_auth_logout", + "domain": "shared-shell", + "status": "mapped", + "id": "UI-039" + }, + { + "file": "web/js/components/preact/HealthView.jsx", + "line": 156, + "url_literal": "/api/health", + "normalized": "/api/health", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/health", + "matched_handler": "handle_get_health", + "domain": "system-health", + "status": "mapped", + "id": "UI-040" + }, + { + "file": "web/js/components/preact/HealthView.jsx", + "line": 162, + "url_literal": "/api/health?sparklines=true&history_only=true", + "normalized": "/api/health", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/health", + "matched_handler": "handle_get_health", + "domain": "system-health", + "status": "mapped", + "id": "UI-041" + }, + { + "file": "web/js/components/preact/LoginView.jsx", + "line": 71, + "url_literal": "/api/auth/logout", + "normalized": "/api/auth/logout", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/auth/logout", + "matched_handler": "handle_auth_logout", + "domain": "shared-auth", + "status": "mapped", + "id": "UI-042" + }, + { + "file": "web/js/components/preact/LoginView.jsx", + "line": 80, + "url_literal": "/api/auth/login/config", + "normalized": "/api/auth/login/config", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/auth/login/config", + "matched_handler": "handle_auth_login_config", + "domain": "shared-auth", + "status": "mapped", + "id": "UI-043" + }, + { + "file": "web/js/components/preact/LoginView.jsx", + "line": 178, + "url_literal": "/api/auth/login", + "normalized": "/api/auth/login", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/auth/login", + "matched_handler": "handle_auth_login", + "domain": "shared-auth", + "status": "mapped", + "id": "UI-044" + }, + { + "file": "web/js/components/preact/LoginView.jsx", + "line": 246, + "url_literal": "/api/auth/login/totp", + "normalized": "/api/auth/login/totp", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/auth/login/totp", + "matched_handler": "handle_auth_login_totp", + "domain": "shared-auth", + "status": "mapped", + "id": "UI-045" + }, + { + "file": "web/js/components/preact/MSEVideoCell.jsx", + "line": 220, + "url_literal": "${go2rtcWsUrl}/api/ws?src=${encodeURIComponent(effectiveName)}", + "normalized": "/go2rtc/api/ws", + "method": "GET", + "method_evidence": "websocket-upgrade", + "transport": "go2rtc-proxy-websocket", + "matched_route": "GET /go2rtc/api/ws", + "matched_handler": "handle_go2rtc_proxy", + "domain": "live", + "status": "mapped", + "id": "UI-046" + }, + { + "file": "web/js/components/preact/MSEVideoCell.jsx", + "line": 553, + "url_literal": "/api/streams/${encodeURIComponent(stream.name)}", + "normalized": "/api/streams/{}", + "method": "PUT", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "PUT /api/streams/#", + "matched_handler": "handle_put_stream", + "domain": "live", + "status": "mapped", + "id": "UI-047" + }, + { + "file": "web/js/components/preact/MSEVideoCell.jsx", + "line": 576, + "url_literal": "/api/streams/${encodeURIComponent(stream.name)}", + "normalized": "/api/streams/{}", + "method": "PUT", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "PUT /api/streams/#", + "matched_handler": "handle_put_stream", + "domain": "live", + "status": "mapped", + "id": "UI-048" + }, + { + "file": "web/js/components/preact/ManualRecordingButton.jsx", + "line": 10, + "url_literal": "/api/streams/${encodeURIComponent(streamName)}/recording", + "normalized": "/api/streams/{}/recording", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/streams/#/recording", + "matched_handler": "handle_get_stream_recording", + "domain": "live", + "status": "mapped", + "id": "UI-049" + }, + { + "file": "web/js/components/preact/PTZControls.jsx", + "line": 17, + "url_literal": "/api/streams/${encodeURIComponent(streamName)}/ptz/move", + "normalized": "/api/streams/{}/ptz/move", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/streams/#/ptz/move", + "matched_handler": "handle_ptz_move", + "domain": "live", + "status": "mapped", + "id": "UI-050" + }, + { + "file": "web/js/components/preact/PTZControls.jsx", + "line": 26, + "url_literal": "/api/streams/${encodeURIComponent(streamName)}/ptz/stop", + "normalized": "/api/streams/{}/ptz/stop", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/streams/#/ptz/stop", + "matched_handler": "handle_ptz_stop", + "domain": "live", + "status": "mapped", + "id": "UI-051" + }, + { + "file": "web/js/components/preact/PTZControls.jsx", + "line": 33, + "url_literal": "/api/streams/${encodeURIComponent(streamName)}/ptz/home", + "normalized": "/api/streams/{}/ptz/home", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/streams/#/ptz/home", + "matched_handler": "handle_ptz_home", + "domain": "live", + "status": "mapped", + "id": "UI-052" + }, + { + "file": "web/js/components/preact/PTZControls.jsx", + "line": 40, + "url_literal": "/api/streams/${encodeURIComponent(streamName)}/ptz/goto-preset", + "normalized": "/api/streams/{}/ptz/goto-preset", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/streams/#/ptz/goto-preset", + "matched_handler": "handle_ptz_goto_preset", + "domain": "live", + "status": "mapped", + "id": "UI-053" + }, + { + "file": "web/js/components/preact/RecordingsView.jsx", + "line": 82, + "url_literal": "/api/camera-collections", + "normalized": "/api/camera-collections", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/camera-collections", + "matched_handler": "handle_get_camera_collections", + "domain": "recordings", + "status": "mapped", + "id": "UI-054" + }, + { + "file": "web/js/components/preact/RecordingsView.jsx", + "line": 184, + "url_literal": "/api/client-config", + "normalized": "/api/client-config", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/client-config", + "matched_handler": "handle_get_client_config", + "domain": "recordings", + "status": "mapped", + "id": "UI-055" + }, + { + "file": "web/js/components/preact/RecordingsView.jsx", + "line": 908, + "url_literal": "/api/recordings/${recording.id}/protect", + "normalized": "/api/recordings/{}/protect", + "method": "PUT", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "PUT /api/recordings/#/protect", + "matched_handler": "handle_put_recording_protect", + "domain": "recordings", + "status": "mapped", + "id": "UI-056" + }, + { + "file": "web/js/components/preact/RecordingsView.jsx", + "line": 958, + "url_literal": "/api/recordings/play/${recording.id}${recording.external_source ? \"?archive=1\" : \"\"}", + "normalized": "/api/recordings/play/{}", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "media-or-binary", + "matched_route": "GET /api/recordings/play/#", + "matched_handler": "handle_recordings_playback", + "domain": "recordings", + "status": "mapped", + "id": "UI-057" + }, + { + "file": "web/js/components/preact/RecordingsView.jsx", + "line": 960, + "url_literal": "/api/recordings/download/${recording.id}", + "normalized": "/api/recordings/download/{}", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "media-or-binary", + "matched_route": "GET /api/recordings/download/#", + "matched_handler": "handle_recordings_download", + "domain": "recordings", + "status": "mapped", + "id": "UI-058" + }, + { + "file": "web/js/components/preact/SettingsView.jsx", + "line": 221, + "url_literal": "/api/settings", + "normalized": "/api/settings", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/settings", + "matched_handler": "handle_get_settings", + "domain": "settings", + "status": "mapped", + "id": "UI-059" + }, + { + "file": "web/js/components/preact/SettingsView.jsx", + "line": 233, + "url_literal": "/api/settings", + "normalized": "/api/settings", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/settings", + "matched_handler": "handle_post_settings", + "domain": "settings", + "status": "mapped", + "id": "UI-060" + }, + { + "file": "web/js/components/preact/SettingsView.jsx", + "line": 267, + "url_literal": "/api/auth/sessions", + "normalized": "/api/auth/sessions", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/auth/sessions", + "matched_handler": "handle_auth_sessions_list", + "domain": "settings", + "status": "mapped", + "id": "UI-061" + }, + { + "file": "web/js/components/preact/SettingsView.jsx", + "line": 279, + "url_literal": "/api/auth/trusted-devices", + "normalized": "/api/auth/trusted-devices", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/auth/trusted-devices", + "matched_handler": "handle_auth_trusted_devices_list", + "domain": "settings", + "status": "mapped", + "id": "UI-062" + }, + { + "file": "web/js/components/preact/SettingsView.jsx", + "line": 287, + "url_literal": "/api/auth/sessions/${sessionId}", + "normalized": "/api/auth/sessions/{}", + "method": "DELETE", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "DELETE /api/auth/sessions/#", + "matched_handler": "handle_auth_sessions_delete", + "domain": "settings", + "status": "mapped", + "id": "UI-063" + }, + { + "file": "web/js/components/preact/SettingsView.jsx", + "line": 299, + "url_literal": "/api/auth/trusted-devices/${deviceId}", + "normalized": "/api/auth/trusted-devices/{}", + "method": "DELETE", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "DELETE /api/auth/trusted-devices/#", + "matched_handler": "handle_auth_trusted_devices_delete", + "domain": "settings", + "status": "mapped", + "id": "UI-064" + }, + { + "file": "web/js/components/preact/SetupWizard.jsx", + "line": 216, + "url_literal": "/api/settings", + "normalized": "/api/settings", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/settings", + "matched_handler": "handle_get_settings", + "domain": "shared-shell", + "status": "mapped", + "id": "UI-065" + }, + { + "file": "web/js/components/preact/SetupWizard.jsx", + "line": 234, + "url_literal": "/api/system/info", + "normalized": "/api/system/info", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/system/info", + "matched_handler": "handle_get_system_info", + "domain": "shared-shell", + "status": "mapped", + "id": "UI-066" + }, + { + "file": "web/js/components/preact/SetupWizard.jsx", + "line": 259, + "url_literal": "/api/settings", + "normalized": "/api/settings", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/settings", + "matched_handler": "handle_post_settings", + "domain": "shared-shell", + "status": "mapped", + "id": "UI-067" + }, + { + "file": "web/js/components/preact/SetupWizard.jsx", + "line": 281, + "url_literal": "/api/setup/status", + "normalized": "/api/setup/status", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/setup/status", + "matched_handler": "handle_post_setup_complete", + "domain": "shared-shell", + "status": "mapped", + "id": "UI-068" + }, + { + "file": "web/js/components/preact/SetupWizard.jsx", + "line": 330, + "url_literal": "/api/setup/status", + "normalized": "/api/setup/status", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/setup/status", + "matched_handler": "handle_post_setup_complete", + "domain": "shared-shell", + "status": "mapped", + "id": "UI-069" + }, + { + "file": "web/js/components/preact/StreamCard.jsx", + "line": 140, + "url_literal": "${window.location.origin}/go2rtc/api/frame.jpeg?src=${encodeURIComponent(streamName)}&cache=5s&t=${ts}", + "normalized": "/go2rtc/api/frame.jpeg", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "go2rtc-proxy", + "matched_route": "GET /go2rtc/api/frame.jpeg", + "matched_handler": "handle_go2rtc_proxy", + "domain": "streams", + "status": "mapped", + "id": "UI-070" + }, + { + "file": "web/js/components/preact/StreamConfigModal.jsx", + "line": 336, + "url_literal": "/api/streams/${encodeURIComponent(currentStream.name)}/zones", + "normalized": "/api/streams/{}/zones", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/streams/#/zones", + "matched_handler": "handle_get_zones", + "domain": "streams", + "status": "mapped", + "id": "UI-071" + }, + { + "file": "web/js/components/preact/StreamsView.jsx", + "line": 199, + "url_literal": "/api/streams?${streamQueryParams.toString()}", + "normalized": "/api/streams", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/streams", + "matched_handler": "handle_get_streams", + "domain": "streams", + "status": "mapped", + "id": "UI-072" + }, + { + "file": "web/js/components/preact/StreamsView.jsx", + "line": 221, + "url_literal": "/api/detection/models", + "normalized": "/api/detection/models", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/detection/models", + "matched_handler": "handle_get_detection_models", + "domain": "streams", + "status": "mapped", + "id": "UI-073" + }, + { + "file": "web/js/components/preact/StreamsView.jsx", + "line": 229, + "url_literal": "/api/client-config", + "normalized": "/api/client-config", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/client-config", + "matched_handler": "handle_get_client_config", + "domain": "streams", + "status": "mapped", + "id": "UI-074" + }, + { + "file": "web/js/components/preact/StreamsView.jsx", + "line": 343, + "url_literal": "/api/streams/${encodeURIComponent(streamData.name)}", + "normalized": "/api/streams/{}", + "method": "PUT", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "PUT /api/streams/#", + "matched_handler": "handle_put_stream", + "domain": "streams", + "status": "mapped", + "id": "UI-075" + }, + { + "file": "web/js/components/preact/StreamsView.jsx", + "line": 358, + "url_literal": "/api/streams", + "normalized": "/api/streams", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/streams", + "matched_handler": "handle_post_stream", + "domain": "streams", + "status": "mapped", + "id": "UI-076" + }, + { + "file": "web/js/components/preact/StreamsView.jsx", + "line": 406, + "url_literal": "/api/streams/test", + "normalized": "/api/streams/test", + "method": "POST", + "method_evidence": "hand-reviewed: usePostMutation (previous line)", + "transport": "json", + "matched_route": "POST /api/streams/test", + "matched_handler": "handle_test_stream", + "domain": "streams", + "status": "mapped", + "id": "UI-077" + }, + { + "file": "web/js/components/preact/StreamsView.jsx", + "line": 433, + "url_literal": "/api/streams/${encodeURIComponent(streamId)}?permanent=true", + "normalized": "/api/streams/{}", + "method": "DELETE", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "DELETE /api/streams/#", + "matched_handler": "handle_delete_stream", + "domain": "streams", + "status": "mapped", + "id": "UI-078" + }, + { + "file": "web/js/components/preact/StreamsView.jsx", + "line": 459, + "url_literal": "/api/streams/${encodeURIComponent(streamId)}", + "normalized": "/api/streams/{}", + "method": "DELETE", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "DELETE /api/streams/#", + "matched_handler": "handle_delete_stream", + "domain": "streams", + "status": "mapped", + "id": "UI-079" + }, + { + "file": "web/js/components/preact/StreamsView.jsx", + "line": 484, + "url_literal": "/api/streams/${encodeURIComponent(streamId)}", + "normalized": "/api/streams/{}", + "method": "PUT", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "PUT /api/streams/#", + "matched_handler": "handle_put_stream", + "domain": "streams", + "status": "mapped", + "id": "UI-080" + }, + { + "file": "web/js/components/preact/StreamsView.jsx", + "line": 532, + "url_literal": "/api/streams/${encodeURIComponent(name)}", + "normalized": "/api/streams/{}", + "method": "PUT", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "PUT /api/streams/#", + "matched_handler": "handle_put_stream", + "domain": "streams", + "status": "mapped", + "id": "UI-081" + }, + { + "file": "web/js/components/preact/StreamsView.jsx", + "line": 562, + "url_literal": "/api/streams/${encodeURIComponent(name)}", + "normalized": "/api/streams/{}", + "method": "DELETE", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "DELETE /api/streams/#", + "matched_handler": "handle_delete_stream", + "domain": "streams", + "status": "mapped", + "id": "UI-082" + }, + { + "file": "web/js/components/preact/StreamsView.jsx", + "line": 583, + "url_literal": "/api/streams/${encodeURIComponent(name)}?permanent=true", + "normalized": "/api/streams/{}", + "method": "DELETE", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "DELETE /api/streams/#", + "matched_handler": "handle_delete_stream", + "domain": "streams", + "status": "mapped", + "id": "UI-083" + }, + { + "file": "web/js/components/preact/StreamsView.jsx", + "line": 808, + "url_literal": "/api/streams/${encodeURIComponent(streamId)}/full", + "normalized": "/api/streams/{}/full", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/streams/#/full", + "matched_handler": "handle_get_stream_full", + "domain": "streams", + "status": "mapped", + "id": "UI-084" + }, + { + "file": "web/js/components/preact/StreamsView.jsx", + "line": 900, + "url_literal": "/api/streams/${encodeURIComponent(streamId)}/full", + "normalized": "/api/streams/{}/full", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/streams/#/full", + "matched_handler": "handle_get_stream_full", + "domain": "streams", + "status": "mapped", + "id": "UI-085" + }, + { + "file": "web/js/components/preact/StreamsView.jsx", + "line": 992, + "url_literal": "/api/onvif/devices", + "normalized": "/api/onvif/devices", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/onvif/devices", + "matched_handler": "handle_get_discovered_onvif_devices", + "domain": "streams", + "status": "mapped", + "id": "UI-086" + }, + { + "file": "web/js/components/preact/StreamsView.jsx", + "line": 999, + "url_literal": "/api/settings", + "normalized": "/api/settings", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/settings", + "matched_handler": "handle_get_settings", + "domain": "streams", + "status": "mapped", + "id": "UI-087" + }, + { + "file": "web/js/components/preact/StreamsView.jsx", + "line": 1085, + "url_literal": "/api/onvif/discovery/discover", + "normalized": "/api/onvif/discovery/discover", + "method": "POST", + "method_evidence": "hand-reviewed: usePostMutation (previous line)", + "transport": "json", + "matched_route": "POST /api/onvif/discovery/discover", + "matched_handler": "handle_post_discover_onvif_devices", + "domain": "streams", + "status": "mapped", + "id": "UI-088" + }, + { + "file": "web/js/components/preact/StreamsView.jsx", + "line": 1163, + "url_literal": "/api/onvif/device/profiles", + "normalized": "/api/onvif/device/profiles", + "method": "GET", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "GET /api/onvif/device/profiles", + "matched_handler": "handle_get_onvif_device_profiles", + "domain": "streams", + "status": "mapped", + "id": "UI-089" + }, + { + "file": "web/js/components/preact/StreamsView.jsx", + "line": 1216, + "url_literal": "/api/onvif/device/test", + "normalized": "/api/onvif/device/test", + "method": "POST", + "method_evidence": "hand-reviewed: usePostMutation (previous line)", + "transport": "json", + "matched_route": "POST /api/onvif/device/test", + "matched_handler": "handle_post_test_onvif_connection", + "domain": "streams", + "status": "mapped", + "id": "UI-090" + }, + { + "file": "web/js/components/preact/StreamsView.jsx", + "line": 1286, + "url_literal": "/api/onvif/device/claim", + "normalized": "/api/onvif/device/claim", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/onvif/device/claim", + "matched_handler": "handle_post_claim_onvif_device", + "domain": "streams", + "status": "mapped", + "id": "UI-091" + }, + { + "file": "web/js/components/preact/SystemView.jsx", + "line": 139, + "url_literal": "/api/system/info", + "normalized": "/api/system/info", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/system/info", + "matched_handler": "handle_get_system_info", + "domain": "system-health", + "status": "mapped", + "id": "UI-092" + }, + { + "file": "web/js/components/preact/SystemView.jsx", + "line": 151, + "url_literal": "/api/system/logs/clear", + "normalized": "/api/system/logs/clear", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/system/logs/clear", + "matched_handler": "handle_post_system_logs_clear", + "domain": "system-health", + "status": "mapped", + "id": "UI-093" + }, + { + "file": "web/js/components/preact/SystemView.jsx", + "line": 199, + "url_literal": "/api/system/restart", + "normalized": "/api/system/restart", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/system/restart", + "matched_handler": "handle_post_system_restart", + "domain": "system-health", + "status": "mapped", + "id": "UI-094" + }, + { + "file": "web/js/components/preact/UI.jsx", + "line": 292, + "url_literal": "/api/recordings/${recordingId}", + "normalized": "/api/recordings/{}", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/recordings/#", + "matched_handler": "handle_get_recording", + "domain": "shared-ui-primitives", + "status": "mapped", + "id": "UI-095" + }, + { + "file": "web/js/components/preact/UI.jsx", + "line": 320, + "url_literal": "/api/detection/results/${data.stream}?start=${startTime}&end=${endTime}", + "normalized": "/api/detection/results/{}", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/detection/results/#", + "matched_handler": "handle_get_detection_results", + "domain": "shared-ui-primitives", + "status": "mapped", + "id": "UI-096" + }, + { + "file": "web/js/components/preact/UI.jsx", + "line": 367, + "url_literal": "/api/recordings/${recordingId}/protect", + "normalized": "/api/recordings/{}/protect", + "method": "PUT", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "PUT /api/recordings/#/protect", + "matched_handler": "handle_put_recording_protect", + "domain": "shared-ui-primitives", + "status": "mapped", + "id": "UI-097" + }, + { + "file": "web/js/components/preact/UI.jsx", + "line": 393, + "url_literal": "/api/recordings/${recordingId}", + "normalized": "/api/recordings/{}", + "method": "DELETE", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "DELETE /api/recordings/#", + "matched_handler": "handle_delete_recording", + "domain": "shared-ui-primitives", + "status": "mapped", + "id": "UI-098" + }, + { + "file": "web/js/components/preact/UsersView.jsx", + "line": 64, + "url_literal": "/api/auth/users", + "normalized": "/api/auth/users", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/auth/users", + "matched_handler": "handle_users_list", + "domain": "users-access", + "status": "mapped", + "id": "UI-099" + }, + { + "file": "web/js/components/preact/UsersView.jsx", + "line": 115, + "url_literal": "/api/auth/users", + "normalized": "/api/auth/users", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/auth/users", + "matched_handler": "handle_users_create", + "domain": "users-access", + "status": "mapped", + "id": "UI-100" + }, + { + "file": "web/js/components/preact/UsersView.jsx", + "line": 144, + "url_literal": "/api/auth/users/${userId}", + "normalized": "/api/auth/users/{}", + "method": "PUT", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "PUT /api/auth/users/#", + "matched_handler": "handle_users_update", + "domain": "users-access", + "status": "mapped", + "id": "UI-101" + }, + { + "file": "web/js/components/preact/UsersView.jsx", + "line": 173, + "url_literal": "/api/auth/users/${userId}", + "normalized": "/api/auth/users/{}", + "method": "DELETE", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "DELETE /api/auth/users/#", + "matched_handler": "handle_users_delete", + "domain": "users-access", + "status": "mapped", + "id": "UI-102" + }, + { + "file": "web/js/components/preact/UsersView.jsx", + "line": 197, + "url_literal": "/api/auth/users/${userId}/login-lockout/clear", + "normalized": "/api/auth/users/{}/login-lockout/clear", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/auth/users/#/login-lockout/clear", + "matched_handler": "handle_users_clear_login_lockout", + "domain": "users-access", + "status": "mapped", + "id": "UI-103" + }, + { + "file": "web/js/components/preact/WebRTCVideoCell.jsx", + "line": 347, + "url_literal": "/api/ice-servers", + "normalized": "/api/ice-servers", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/ice-servers", + "matched_handler": "handle_get_ice_servers", + "domain": "live", + "status": "mapped", + "id": "UI-104" + }, + { + "file": "web/js/components/preact/WebRTCVideoCell.jsx", + "line": 852, + "url_literal": "${go2rtcBaseUrl}/api/webrtc?src=${encodeURIComponent(effectiveName)}", + "normalized": "/go2rtc/api/webrtc", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "go2rtc-proxy", + "matched_route": "POST /go2rtc/api/webrtc", + "matched_handler": "handle_go2rtc_proxy", + "domain": "live", + "status": "mapped", + "id": "UI-105" + }, + { + "file": "web/js/components/preact/WebRTCVideoCell.jsx", + "line": 1123, + "url_literal": "/api/streams/${encodeURIComponent(stream.name)}/refresh", + "normalized": "/api/streams/{}/refresh", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/streams/#/refresh", + "matched_handler": "handle_post_stream_refresh", + "domain": "live", + "status": "mapped", + "id": "UI-106" + }, + { + "file": "web/js/components/preact/WebRTCVideoCell.jsx", + "line": 1201, + "url_literal": "/api/streams/${encodeURIComponent(stream.name)}", + "normalized": "/api/streams/{}", + "method": "PUT", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "PUT /api/streams/#", + "matched_handler": "handle_put_stream", + "domain": "live", + "status": "mapped", + "id": "UI-107" + }, + { + "file": "web/js/components/preact/WebRTCVideoCell.jsx", + "line": 1224, + "url_literal": "/api/streams/${encodeURIComponent(stream.name)}", + "normalized": "/api/streams/{}", + "method": "PUT", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "PUT /api/streams/#", + "matched_handler": "handle_put_stream", + "domain": "live", + "status": "mapped", + "id": "UI-108" + }, + { + "file": "web/js/components/preact/ZoneEditor.jsx", + "line": 53, + "url_literal": "/api/streams/${encodeURIComponent(streamName)}/zones", + "normalized": "/api/streams/{}/zones", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/streams/#/zones", + "matched_handler": "handle_get_zones", + "domain": "streams", + "status": "mapped", + "id": "UI-109" + }, + { + "file": "web/js/components/preact/ZoneEditor.jsx", + "line": 82, + "url_literal": "${go2rtcBaseUrl}/api/frame.jpeg?src=${encodeURIComponent(streamName)}&t=${timestamp}", + "normalized": "/go2rtc/api/frame.jpeg", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "go2rtc-proxy", + "matched_route": "GET /go2rtc/api/frame.jpeg", + "matched_handler": "handle_go2rtc_proxy", + "domain": "streams", + "status": "mapped", + "id": "UI-110" + }, + { + "file": "web/js/components/preact/ZoneEditor.jsx", + "line": 88, + "url_literal": "${window.location.origin}/go2rtc/api/frame.jpeg?src=${encodeURIComponent(streamName)}&t=${timestamp}", + "normalized": "/go2rtc/api/frame.jpeg", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "go2rtc-proxy", + "matched_route": "GET /go2rtc/api/frame.jpeg", + "matched_handler": "handle_go2rtc_proxy", + "domain": "streams", + "status": "mapped", + "id": "UI-111" + }, + { + "file": "web/js/components/preact/ZoneEditor.jsx", + "line": 481, + "url_literal": "/api/streams/${encodeURIComponent(streamName)}/zones", + "normalized": "/api/streams/{}/zones", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/streams/#/zones", + "matched_handler": "handle_post_zones", + "domain": "streams", + "status": "mapped", + "id": "UI-112" + }, + { + "file": "web/js/components/preact/fleet/CollectionManager.jsx", + "line": 40, + "url_literal": "/api/camera-collections/${collection.uuid}", + "normalized": "/api/camera-collections/{}", + "method": "PUT", + "method_evidence": "hand-reviewed ternary: method method: collection ? 'PUT' : 'POST' (URL #1 on line)", + "transport": "json", + "matched_route": "PUT /api/camera-collections/#", + "matched_handler": "handle_put_camera_collection", + "domain": "fleet", + "status": "mapped", + "id": "UI-113" + }, + { + "file": "web/js/components/preact/fleet/CollectionManager.jsx", + "line": 40, + "url_literal": "/api/camera-collections", + "normalized": "/api/camera-collections", + "method": "POST", + "method_evidence": "hand-reviewed ternary: method method: collection ? 'PUT' : 'POST' (URL #2 on line)", + "transport": "json", + "matched_route": "POST /api/camera-collections", + "matched_handler": "handle_post_camera_collection", + "domain": "fleet", + "status": "mapped", + "id": "UI-114" + }, + { + "file": "web/js/components/preact/fleet/CollectionManager.jsx", + "line": 48, + "url_literal": "/api/camera-collections/${saved.uuid}/members", + "normalized": "/api/camera-collections/{}/members", + "method": "PUT", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "PUT /api/camera-collections/#/members", + "matched_handler": "handle_put_camera_collection_members", + "domain": "fleet", + "status": "mapped", + "id": "UI-115" + }, + { + "file": "web/js/components/preact/fleet/CollectionManager.jsx", + "line": 177, + "url_literal": "/api/camera-collections/${collection.uuid}/preview", + "normalized": "/api/camera-collections/{}/preview", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/camera-collections/#/preview", + "matched_handler": "handle_post_camera_collection_preview", + "domain": "fleet", + "status": "mapped", + "id": "UI-116" + }, + { + "file": "web/js/components/preact/fleet/CollectionManager.jsx", + "line": 193, + "url_literal": "/api/camera-collections/${collection.uuid}/members", + "normalized": "/api/camera-collections/{}/members", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/camera-collections/#/members", + "matched_handler": "handle_get_camera_collection_members", + "domain": "fleet", + "status": "mapped", + "id": "UI-117" + }, + { + "file": "web/js/components/preact/fleet/CollectionManager.jsx", + "line": 206, + "url_literal": "/api/camera-collections/${collection.uuid}", + "normalized": "/api/camera-collections/{}", + "method": "DELETE", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "DELETE /api/camera-collections/#", + "matched_handler": "handle_delete_camera_collection", + "domain": "fleet", + "status": "mapped", + "id": "UI-118" + }, + { + "file": "web/js/components/preact/fleet/CollectionSelectorBuilder.jsx", + "line": 52, + "url_literal": "/api/fleet/cameras/query", + "normalized": "/api/fleet/cameras/query", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/fleet/cameras/query", + "matched_handler": "handle_post_fleet_camera_query", + "domain": "fleet", + "status": "mapped", + "id": "UI-119" + }, + { + "file": "web/js/components/preact/fleet/CollectionSelectorBuilder.jsx", + "line": 88, + "url_literal": "/api/fleet/cameras/query", + "normalized": "/api/fleet/cameras/query", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/fleet/cameras/query", + "matched_handler": "handle_post_fleet_camera_query", + "domain": "fleet", + "status": "mapped", + "id": "UI-120" + }, + { + "file": "web/js/components/preact/fleet/CollectionSelectorBuilder.jsx", + "line": 306, + "url_literal": "/api/fleet/selectors/preview", + "normalized": "/api/fleet/selectors/preview", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/fleet/selectors/preview", + "matched_handler": "handle_post_fleet_selector_preview", + "domain": "fleet", + "status": "mapped", + "id": "UI-121" + }, + { + "file": "web/js/components/preact/fleet/OrganizationManager.jsx", + "line": 25, + "url_literal": "/api/locations/${item.uuid}", + "normalized": "/api/locations/{}", + "method": "PUT", + "method_evidence": "hand-reviewed ternary: method method: item ? 'PUT' : 'POST' (URL #1 on line)", + "transport": "json", + "matched_route": "PUT /api/locations/#", + "matched_handler": "handle_put_location", + "domain": "fleet", + "status": "mapped", + "id": "UI-122" + }, + { + "file": "web/js/components/preact/fleet/OrganizationManager.jsx", + "line": 25, + "url_literal": "/api/locations", + "normalized": "/api/locations", + "method": "POST", + "method_evidence": "hand-reviewed ternary: method method: item ? 'PUT' : 'POST' (URL #2 on line)", + "transport": "json", + "matched_route": "POST /api/locations", + "matched_handler": "handle_post_location", + "domain": "fleet", + "status": "mapped", + "id": "UI-123" + }, + { + "file": "web/js/components/preact/fleet/OrganizationManager.jsx", + "line": 89, + "url_literal": "/api/locations/${location.uuid}", + "normalized": "/api/locations/{}", + "method": "DELETE", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "DELETE /api/locations/#", + "matched_handler": "handle_delete_location", + "domain": "fleet", + "status": "mapped", + "id": "UI-124" + }, + { + "file": "web/js/components/preact/fleet/OrganizationManager.jsx", + "line": 172, + "url_literal": "/api/camera-tags/${item.uuid}/merge", + "normalized": "/api/camera-tags/{}/merge", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/camera-tags/#/merge", + "matched_handler": "handle_post_camera_tag_merge", + "domain": "fleet", + "status": "mapped", + "id": "UI-125" + }, + { + "file": "web/js/components/preact/fleet/OrganizationManager.jsx", + "line": 177, + "url_literal": "/api/camera-tags/${item.uuid}", + "normalized": "/api/camera-tags/{}", + "method": "PUT", + "method_evidence": "hand-reviewed ternary: method method: item ? 'PUT' : 'POST' (URL #1 on line)", + "transport": "json", + "matched_route": "PUT /api/camera-tags/#", + "matched_handler": "handle_put_camera_tag", + "domain": "fleet", + "status": "mapped", + "id": "UI-126" + }, + { + "file": "web/js/components/preact/fleet/OrganizationManager.jsx", + "line": 177, + "url_literal": "/api/camera-tags", + "normalized": "/api/camera-tags", + "method": "POST", + "method_evidence": "hand-reviewed ternary: method method: item ? 'PUT' : 'POST' (URL #2 on line)", + "transport": "json", + "matched_route": "POST /api/camera-tags", + "matched_handler": "handle_post_camera_tag", + "domain": "fleet", + "status": "mapped", + "id": "UI-127" + }, + { + "file": "web/js/components/preact/fleet/OrganizationManager.jsx", + "line": 237, + "url_literal": "/api/camera-tags/${tag.uuid}", + "normalized": "/api/camera-tags/{}", + "method": "DELETE", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "DELETE /api/camera-tags/#", + "matched_handler": "handle_delete_camera_tag", + "domain": "fleet", + "status": "mapped", + "id": "UI-128" + }, + { + "file": "web/js/components/preact/fleet/SavedViewsBar.jsx", + "line": 33, + "url_literal": "/api/fleet/views", + "normalized": "/api/fleet/views", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/fleet/views", + "matched_handler": "handle_post_fleet_saved_view", + "domain": "fleet", + "status": "mapped", + "id": "UI-129" + }, + { + "file": "web/js/components/preact/fleet/SavedViewsBar.jsx", + "line": 54, + "url_literal": "/api/fleet/views/${encodeURIComponent(view.uuid)}", + "normalized": "/api/fleet/views/{}", + "method": "DELETE", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "DELETE /api/fleet/views/#", + "matched_handler": "handle_delete_fleet_saved_view", + "domain": "fleet", + "status": "mapped", + "id": "UI-130" + }, + { + "file": "web/js/components/preact/fleet/StaticCollectionMembers.jsx", + "line": 29, + "url_literal": "/api/fleet/cameras/query", + "normalized": "/api/fleet/cameras/query", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/fleet/cameras/query", + "matched_handler": "handle_post_fleet_camera_query", + "domain": "fleet", + "status": "mapped", + "id": "UI-131" + }, + { + "file": "web/js/components/preact/fleet/collectionMembership.js", + "line": 14, + "url_literal": "/api/fleet/cameras/query", + "normalized": "/api/fleet/cameras/query", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/fleet/cameras/query", + "matched_handler": "handle_post_fleet_camera_query", + "domain": "fleet", + "status": "mapped", + "id": "UI-132" + }, + { + "file": "web/js/components/preact/fleet/collectionMembership.js", + "line": 42, + "url_literal": "/api/camera-collections", + "normalized": "/api/camera-collections", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/camera-collections", + "matched_handler": "handle_get_camera_collections", + "domain": "fleet", + "status": "mapped", + "id": "UI-133" + }, + { + "file": "web/js/components/preact/fleet/fleetOrganization.js", + "line": 100, + "url_literal": "/api/cameras/${encodeURIComponent(camera.camera_uuid)}/location", + "normalized": "/api/cameras/{}/location", + "method": "PUT", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "PUT /api/cameras/#/location", + "matched_handler": "handle_put_camera_location", + "domain": "fleet", + "status": "mapped", + "id": "UI-134" + }, + { + "file": "web/js/components/preact/fleet/fleetOrganization.js", + "line": 110, + "url_literal": "/api/cameras/${encodeURIComponent(camera.camera_uuid)}/tags", + "normalized": "/api/cameras/{}/tags", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/cameras/#/tags", + "matched_handler": "handle_get_camera_tag_assignments", + "domain": "fleet", + "status": "mapped", + "id": "UI-135" + }, + { + "file": "web/js/components/preact/fleet/fleetOrganization.js", + "line": 122, + "url_literal": "/api/cameras/${encodeURIComponent(camera.camera_uuid)}/tags", + "normalized": "/api/cameras/{}/tags", + "method": "PUT", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "PUT /api/cameras/#/tags", + "matched_handler": "handle_put_camera_tag_assignments", + "domain": "fleet", + "status": "mapped", + "id": "UI-136" + }, + { + "file": "web/js/components/preact/investigation/InvestigationActions.jsx", + "line": 26, + "url_literal": "/api/recordings/batch-download/result/${encodeURIComponent(token)}", + "normalized": "/api/recordings/batch-download/result/{}", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/recordings/batch-download/result/#", + "matched_handler": "handle_batch_download_result", + "domain": "investigation", + "status": "mapped", + "id": "UI-137" + }, + { + "file": "web/js/components/preact/investigation/InvestigationActions.jsx", + "line": 66, + "url_literal": "/api/investigations/recordings/preview", + "normalized": "/api/investigations/recordings/preview", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/investigations/recordings/preview", + "matched_handler": "handle_post_investigation_recording_preview", + "domain": "investigation", + "status": "mapped", + "id": "UI-138" + }, + { + "file": "web/js/components/preact/investigation/InvestigationActions.jsx", + "line": 129, + "url_literal": "/api/recordings/batch-protect", + "normalized": "/api/recordings/batch-protect", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/recordings/batch-protect", + "matched_handler": "handle_batch_protect_recordings", + "domain": "investigation", + "status": "mapped", + "id": "UI-139" + }, + { + "file": "web/js/components/preact/investigation/InvestigationActions.jsx", + "line": 164, + "url_literal": "/api/recordings/batch-download", + "normalized": "/api/recordings/batch-download", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/recordings/batch-download", + "matched_handler": "handle_batch_download_recordings", + "domain": "investigation", + "status": "mapped", + "id": "UI-140" + }, + { + "file": "web/js/components/preact/investigation/InvestigationActions.jsx", + "line": 179, + "url_literal": "/api/recordings/batch-download/status/${encodeURIComponent(job.token)}", + "normalized": "/api/recordings/batch-download/status/{}", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/recordings/batch-download/status/#", + "matched_handler": "handle_batch_download_status", + "domain": "investigation", + "status": "mapped", + "id": "UI-141" + }, + { + "file": "web/js/components/preact/investigation/InvestigationBookmarks.jsx", + "line": 50, + "url_literal": "/api/investigation-bookmarks", + "normalized": "/api/investigation-bookmarks", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/investigation-bookmarks", + "matched_handler": "handle_get_investigation_bookmarks", + "domain": "investigation", + "status": "mapped", + "id": "UI-142" + }, + { + "file": "web/js/components/preact/investigation/InvestigationBookmarks.jsx", + "line": 80, + "url_literal": "/api/investigation-bookmarks", + "normalized": "/api/investigation-bookmarks", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/investigation-bookmarks", + "matched_handler": "handle_post_investigation_bookmark", + "domain": "investigation", + "status": "mapped", + "id": "UI-143" + }, + { + "file": "web/js/components/preact/investigation/InvestigationBookmarks.jsx", + "line": 103, + "url_literal": "/api/investigation-bookmarks/${bookmark.uuid}", + "normalized": "/api/investigation-bookmarks/{}", + "method": "DELETE", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "DELETE /api/investigation-bookmarks/#", + "matched_handler": "handle_delete_investigation_bookmark", + "domain": "investigation", + "status": "mapped", + "id": "UI-144" + }, + { + "file": "web/js/components/preact/investigation/InvestigationView.jsx", + "line": 150, + "url_literal": "/api/investigations/segment-at", + "normalized": "/api/investigations/segment-at", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/investigations/segment-at", + "matched_handler": "handle_post_investigation_segment_at", + "domain": "investigation", + "status": "mapped", + "id": "UI-145" + }, + { + "file": "web/js/components/preact/investigation/InvestigationView.jsx", + "line": 238, + "url_literal": "/api/recordings/play/${segment.id}", + "normalized": "/api/recordings/play/{}", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "media-or-binary", + "matched_route": "GET /api/recordings/play/#", + "matched_handler": "handle_recordings_playback", + "domain": "investigation", + "status": "mapped", + "id": "UI-146" + }, + { + "file": "web/js/components/preact/investigation/InvestigationView.jsx", + "line": 878, + "url_literal": "/api/investigations/search", + "normalized": "/api/investigations/search", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/investigations/search", + "matched_handler": "handle_post_investigation_search", + "domain": "investigation", + "status": "mapped", + "id": "UI-147" + }, + { + "file": "web/js/components/preact/investigation/InvestigationView.jsx", + "line": 897, + "url_literal": "/api/investigations/search", + "normalized": "/api/investigations/search", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/investigations/search", + "matched_handler": "handle_post_investigation_search", + "domain": "investigation", + "status": "mapped", + "id": "UI-148" + }, + { + "file": "web/js/components/preact/investigation/InvestigationView.jsx", + "line": 987, + "url_literal": "/api/investigations/timeline", + "normalized": "/api/investigations/timeline", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/investigations/timeline", + "matched_handler": "handle_post_investigation_timeline", + "domain": "investigation", + "status": "mapped", + "id": "UI-149" + }, + { + "file": "web/js/components/preact/investigation/InvestigationView.jsx", + "line": 1262, + "url_literal": "/api/investigations/thumbnail-samples", + "normalized": "/api/investigations/thumbnail-samples", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "media-or-binary", + "matched_route": "POST /api/investigations/thumbnail-samples", + "matched_handler": "handle_post_investigation_thumbnail_samples", + "domain": "investigation", + "status": "mapped", + "id": "UI-150" + }, + { + "file": "web/js/components/preact/live/LiveBuildingPlan.jsx", + "line": 67, + "url_literal": "/api/live/plans/${plan.uuid}/background?v=${version}", + "normalized": "/api/live/plans/{}/background", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "media-or-binary", + "matched_route": "GET /api/live/plans/#/background", + "matched_handler": "handle_get_operator_floor_plan_background", + "domain": "live", + "status": "mapped", + "id": "UI-151" + }, + { + "file": "web/js/components/preact/live/LiveBuildingPlan.jsx", + "line": 90, + "url_literal": "/go2rtc/api/frame.jpeg?src=${encodeURIComponent(stream.name)}&cache=5s&t=${Date.now()}", + "normalized": "/go2rtc/api/frame.jpeg", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "go2rtc-proxy", + "matched_route": "GET /go2rtc/api/frame.jpeg", + "matched_handler": "handle_go2rtc_proxy", + "domain": "live", + "status": "mapped", + "id": "UI-152" + }, + { + "file": "web/js/components/preact/live/LiveBuildingPlan.jsx", + "line": 207, + "url_literal": "/api/live/plans", + "normalized": "/api/live/plans", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/live/plans", + "matched_handler": "handle_get_operator_floor_plans", + "domain": "live", + "status": "mapped", + "id": "UI-153" + }, + { + "file": "web/js/components/preact/live/LiveBuildingPlan.jsx", + "line": 318, + "url_literal": "/api/live/plans", + "normalized": "/api/live/plans", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/live/plans", + "matched_handler": "handle_post_operator_floor_plan", + "domain": "live", + "status": "mapped", + "id": "UI-154" + }, + { + "file": "web/js/components/preact/live/LiveBuildingPlan.jsx", + "line": 350, + "url_literal": "/api/live/plans/${plan.uuid}", + "normalized": "/api/live/plans/{}", + "method": "PUT", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "PUT /api/live/plans/#", + "matched_handler": "handle_put_operator_floor_plan", + "domain": "live", + "status": "mapped", + "id": "UI-155" + }, + { + "file": "web/js/components/preact/live/LiveBuildingPlan.jsx", + "line": 371, + "url_literal": "/api/live/plans/${plan.uuid}", + "normalized": "/api/live/plans/{}", + "method": "DELETE", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "DELETE /api/live/plans/#", + "matched_handler": "handle_delete_operator_floor_plan", + "domain": "live", + "status": "mapped", + "id": "UI-156" + }, + { + "file": "web/js/components/preact/live/LiveBuildingPlan.jsx", + "line": 408, + "url_literal": "/api/live/plans/${plan.uuid}/background", + "normalized": "/api/live/plans/{}/background", + "method": "PUT", + "method_evidence": "explicit method option", + "transport": "media-or-binary", + "matched_route": "PUT /api/live/plans/#/background", + "matched_handler": "handle_put_operator_floor_plan_background", + "domain": "live", + "status": "mapped", + "id": "UI-157" + }, + { + "file": "web/js/components/preact/live/LiveBuildingPlan.jsx", + "line": 433, + "url_literal": "/api/live/plans/${plan.uuid}", + "normalized": "/api/live/plans/{}", + "method": "PUT", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "PUT /api/live/plans/#", + "matched_handler": "handle_put_operator_floor_plan", + "domain": "live", + "status": "mapped", + "id": "UI-158" + }, + { + "file": "web/js/components/preact/live/LiveBuildingPlan.jsx", + "line": 460, + "url_literal": "/api/live/plans/${plan.uuid}/background", + "normalized": "/api/live/plans/{}/background", + "method": "DELETE", + "method_evidence": "explicit method option", + "transport": "media-or-binary", + "matched_route": "DELETE /api/live/plans/#/background", + "matched_handler": "handle_delete_operator_floor_plan_background", + "domain": "live", + "status": "mapped", + "id": "UI-159" + }, + { + "file": "web/js/components/preact/live/LiveBuildingPlan.jsx", + "line": 660, + "url_literal": "/api/live/plans/${plan.uuid}", + "normalized": "/api/live/plans/{}", + "method": "PUT", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "PUT /api/live/plans/#", + "matched_handler": "handle_put_operator_floor_plan", + "domain": "live", + "status": "mapped", + "id": "UI-160" + }, + { + "file": "web/js/components/preact/live/LiveOperatorNavigator.jsx", + "line": 92, + "url_literal": "/api/ui/workspaces", + "normalized": "/api/ui/workspaces", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/ui/workspaces", + "matched_handler": "handle_get_ui_workspaces", + "domain": "live", + "status": "mapped", + "id": "UI-161" + }, + { + "file": "web/js/components/preact/live/LiveOperatorNavigator.jsx", + "line": 97, + "url_literal": "/api/locations", + "normalized": "/api/locations", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/locations", + "matched_handler": "handle_get_locations", + "domain": "live", + "status": "mapped", + "id": "UI-162" + }, + { + "file": "web/js/components/preact/live/LiveOperatorNavigator.jsx", + "line": 102, + "url_literal": "/api/live/layouts", + "normalized": "/api/live/layouts", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/live/layouts", + "matched_handler": "handle_get_live_layouts", + "domain": "live", + "status": "mapped", + "id": "UI-163" + }, + { + "file": "web/js/components/preact/live/LiveOperatorNavigator.jsx", + "line": 107, + "url_literal": "/api/live/plans", + "normalized": "/api/live/plans", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/live/plans", + "matched_handler": "handle_get_operator_floor_plans", + "domain": "live", + "status": "mapped", + "id": "UI-164" + }, + { + "file": "web/js/components/preact/live/LiveOperatorNavigator.jsx", + "line": 149, + "url_literal": "/api/investigations/search", + "normalized": "/api/investigations/search", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/investigations/search", + "matched_handler": "handle_post_investigation_search", + "domain": "live", + "status": "mapped", + "id": "UI-165" + }, + { + "file": "web/js/components/preact/live/LiveOperatorNavigator.jsx", + "line": 235, + "url_literal": "/api/live/layouts", + "normalized": "/api/live/layouts", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/live/layouts", + "matched_handler": "handle_post_live_layout", + "domain": "live", + "status": "mapped", + "id": "UI-166" + }, + { + "file": "web/js/components/preact/live/LiveOperatorNavigator.jsx", + "line": 265, + "url_literal": "/api/live/layouts/${layout.uuid}", + "normalized": "/api/live/layouts/{}", + "method": "DELETE", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "DELETE /api/live/layouts/#", + "matched_handler": "handle_delete_live_layout", + "domain": "live", + "status": "mapped", + "id": "UI-167" + }, + { + "file": "web/js/components/preact/live/cameraFavorites.js", + "line": 41, + "url_literal": "/api/camera-favorites/${encodeURIComponent(cameraUuid)}", + "normalized": "/api/camera-favorites/{}", + "method": "PUT", + "method_evidence": "hand-reviewed: method: favorite ? 'PUT' : 'DELETE'", + "transport": "json", + "matched_route": "PUT /api/camera-favorites/#", + "matched_handler": "handle_put_camera_favorite", + "domain": "live", + "status": "mapped", + "id": "UI-168" + }, + { + "file": "web/js/components/preact/live/cameraFavorites.js", + "line": 41, + "url_literal": "/api/camera-favorites/${encodeURIComponent(cameraUuid)}", + "normalized": "/api/camera-favorites/{}", + "method": "DELETE", + "method_evidence": "hand-reviewed: method: favorite ? 'PUT' : 'DELETE'", + "transport": "json", + "matched_route": "DELETE /api/camera-favorites/#", + "matched_handler": "handle_delete_camera_favorite", + "domain": "live", + "status": "mapped", + "id": "UI-169" + }, + { + "file": "web/js/components/preact/live/cameraFavorites.js", + "line": 47, + "url_literal": "/api/camera-favorites", + "normalized": "/api/camera-favorites", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/camera-favorites", + "matched_handler": "handle_get_camera_favorites", + "domain": "live", + "status": "mapped", + "id": "UI-170" + }, + { + "file": "web/js/components/preact/lpr/lprSearch.js", + "line": 172, + "url_literal": "/api/lpr/search", + "normalized": "/api/lpr/search", + "method": "POST", + "method_evidence": "hand-reviewed: postJson helper", + "transport": "json", + "matched_route": "POST /api/lpr/search", + "matched_handler": "handle_post_lpr_search", + "domain": "lpr", + "status": "mapped", + "id": "UI-171" + }, + { + "file": "web/js/components/preact/lpr/lprSearch.js", + "line": 180, + "url_literal": "/api/lpr/export", + "normalized": "/api/lpr/export", + "method": "POST", + "method_evidence": "hand-reviewed: postJson helper", + "transport": "json", + "matched_route": "POST /api/lpr/export", + "matched_handler": "handle_post_lpr_export", + "domain": "lpr", + "status": "mapped", + "id": "UI-172" + }, + { + "file": "web/js/components/preact/lpr/lprSearch.js", + "line": 187, + "url_literal": "/api/lpr/reads/${encodeURIComponent(readId)}", + "normalized": "/api/lpr/reads/{}", + "method": "DELETE", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "DELETE /api/lpr/reads/#", + "matched_handler": "handle_delete_lpr_read", + "domain": "lpr", + "status": "mapped", + "id": "UI-173" + }, + { + "file": "web/js/components/preact/ptzActions.js", + "line": 2, + "url_literal": "/api/streams/${encodeURIComponent(streamName)}/ptz/${action}", + "normalized": "/api/streams/{}/ptz/capabilities", + "method": "GET", + "method_evidence": "hand-reviewed: ptzRequest(name,'capabilities')", + "transport": "json", + "matched_route": "GET /api/streams/#/ptz/capabilities", + "matched_handler": "handle_ptz_capabilities", + "domain": "live", + "status": "mapped", + "id": "UI-174" + }, + { + "file": "web/js/components/preact/ptzActions.js", + "line": 2, + "url_literal": "/api/streams/${encodeURIComponent(streamName)}/ptz/${action}", + "normalized": "/api/streams/{}/ptz/presets", + "method": "GET", + "method_evidence": "hand-reviewed: ptzRequest(name,'presets')", + "transport": "json", + "matched_route": "GET /api/streams/#/ptz/presets", + "matched_handler": "handle_ptz_get_presets", + "domain": "live", + "status": "mapped", + "id": "UI-175" + }, + { + "file": "web/js/components/preact/ptzActions.js", + "line": 2, + "url_literal": "/api/streams/${encodeURIComponent(streamName)}/ptz/${action}", + "normalized": "/api/streams/{}/ptz/preset", + "method": "PUT", + "method_evidence": "hand-reviewed: ptzRequest(name,'preset',{method:'PUT'})", + "transport": "json", + "matched_route": "PUT /api/streams/#/ptz/preset", + "matched_handler": "handle_ptz_set_preset", + "domain": "live", + "status": "mapped", + "id": "UI-176" + }, + { + "file": "web/js/components/preact/ptzActions.js", + "line": 2, + "url_literal": "/api/streams/${encodeURIComponent(streamName)}/ptz/${action}", + "normalized": "/api/streams/{}/ptz/set-home", + "method": "POST", + "method_evidence": "hand-reviewed: ptzRequest(name,'set-home',{method:'POST'})", + "transport": "json", + "matched_route": "POST /api/streams/#/ptz/set-home", + "matched_handler": "handle_ptz_set_home", + "domain": "live", + "status": "mapped", + "id": "UI-177" + }, + { + "file": "web/js/components/preact/recordings/RecordingsGrid.jsx", + "line": 131, + "url_literal": "/api/recordings/thumbnail/${recording.id}/0", + "normalized": "/api/recordings/thumbnail/{}/0", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "media-or-binary", + "matched_route": "GET /api/recordings/thumbnail/#/#", + "matched_handler": "handle_recordings_thumbnail", + "domain": "recordings", + "status": "mapped", + "id": "UI-178" + }, + { + "file": "web/js/components/preact/recordings/RecordingsGrid.jsx", + "line": 144, + "url_literal": "/api/recordings/thumbnail/${recording.id}/${currentFrame}", + "normalized": "/api/recordings/thumbnail/{}/{}", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "media-or-binary", + "matched_route": "GET /api/recordings/thumbnail/#/#", + "matched_handler": "handle_recordings_thumbnail", + "domain": "recordings", + "status": "mapped", + "id": "UI-179" + }, + { + "file": "web/js/components/preact/recordings/RecordingsGrid.jsx", + "line": 185, + "url_literal": "/api/recordings/thumbnail/${recording.id}/${i}", + "normalized": "/api/recordings/thumbnail/{}/{}", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "media-or-binary", + "matched_route": "GET /api/recordings/thumbnail/#/#", + "matched_handler": "handle_recordings_thumbnail", + "domain": "recordings", + "status": "mapped", + "id": "UI-180" + }, + { + "file": "web/js/components/preact/recordings/RecordingsGrid.jsx", + "line": 222, + "url_literal": "/api/recordings/thumbnail/${recording.id}/${currentFrame}", + "normalized": "/api/recordings/thumbnail/{}/{}", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "media-or-binary", + "matched_route": "GET /api/recordings/thumbnail/#/#", + "matched_handler": "handle_recordings_thumbnail", + "domain": "recordings", + "status": "mapped", + "id": "UI-181" + }, + { + "file": "web/js/components/preact/recordings/recordingsAPI.jsx", + "line": 166, + "url_literal": "/api/recordings/${recordingId}", + "normalized": "/api/recordings/{}", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/recordings/#", + "matched_handler": "handle_get_recording", + "domain": "recordings", + "status": "mapped", + "id": "UI-182" + }, + { + "file": "web/js/components/preact/recordings/recordingsAPI.jsx", + "line": 204, + "url_literal": "/api/recordings?${params.toString()}", + "normalized": "/api/recordings", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/recordings", + "matched_handler": "handle_get_recordings", + "domain": "recordings", + "status": "mapped", + "id": "UI-183" + }, + { + "file": "web/js/components/preact/recordings/recordingsAPI.jsx", + "line": 227, + "url_literal": "/api/recordings/${recordingId}", + "normalized": "/api/recordings/{}", + "method": "DELETE", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "DELETE /api/recordings/#", + "matched_handler": "handle_delete_recording", + "domain": "recordings", + "status": "mapped", + "id": "UI-184" + }, + { + "file": "web/js/components/preact/recordings/recordingsAPI.jsx", + "line": 256, + "url_literal": "/api/recordings/batch-delete", + "normalized": "/api/recordings/batch-delete", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/recordings/batch-delete", + "matched_handler": "handle_batch_delete_recordings", + "domain": "recordings", + "status": "mapped", + "id": "UI-185" + }, + { + "file": "web/js/components/preact/recordings/recordingsAPI.jsx", + "line": 347, + "url_literal": "/api/recordings?${params.toString()}", + "normalized": "/api/recordings", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/recordings", + "matched_handler": "handle_get_recordings", + "domain": "recordings", + "status": "mapped", + "id": "UI-186" + }, + { + "file": "web/js/components/preact/recordings/recordingsAPI.jsx", + "line": 382, + "url_literal": "/api/recordings/${recording.id}", + "normalized": "/api/recordings/{}", + "method": "DELETE", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "DELETE /api/recordings/#", + "matched_handler": "handle_delete_recording", + "domain": "recordings", + "status": "mapped", + "id": "UI-187" + }, + { + "file": "web/js/components/preact/recordings/recordingsAPI.jsx", + "line": 435, + "url_literal": "/api/recordings/batch-delete", + "normalized": "/api/recordings/batch-delete", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/recordings/batch-delete", + "matched_handler": "handle_batch_delete_recordings", + "domain": "recordings", + "status": "mapped", + "id": "UI-188" + }, + { + "file": "web/js/components/preact/recordings/recordingsAPI.jsx", + "line": 472, + "url_literal": "/api/recordings/batch-delete/progress/${jobId}", + "normalized": "/api/recordings/batch-delete/progress/{}", + "method": "GET", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "GET /api/recordings/batch-delete/progress/#", + "matched_handler": "handle_batch_delete_progress", + "domain": "recordings", + "status": "mapped", + "id": "UI-189" + }, + { + "file": "web/js/components/preact/recordings/recordingsAPI.jsx", + "line": 546, + "url_literal": "/api/recordings?", + "normalized": "/api/recordings", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/recordings", + "matched_handler": "handle_get_recordings", + "domain": "recordings", + "status": "mapped", + "id": "UI-190" + }, + { + "file": "web/js/components/preact/recordings/recordingsAPI.jsx", + "line": 591, + "url_literal": "/api/recordings/batch-delete", + "normalized": "/api/recordings/batch-delete", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/recordings/batch-delete", + "matched_handler": "handle_batch_delete_recordings", + "domain": "recordings", + "status": "mapped", + "id": "UI-191" + }, + { + "file": "web/js/components/preact/recordings/recordingsAPI.jsx", + "line": 630, + "url_literal": "/api/detection/results/${recording.stream}?${params.toString()}", + "normalized": "/api/detection/results/{}", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/detection/results/#", + "matched_handler": "handle_get_detection_results", + "domain": "recordings", + "status": "mapped", + "id": "UI-192" + }, + { + "file": "web/js/components/preact/recordings/recordingsAPI.jsx", + "line": 661, + "url_literal": "/api/detection/results/${recording.stream}?${params.toString()}", + "normalized": "/api/detection/results/{}", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/detection/results/#", + "matched_handler": "handle_get_detection_results", + "domain": "recordings", + "status": "mapped", + "id": "UI-193" + }, + { + "file": "web/js/components/preact/recordings/recordingsAPI.jsx", + "line": 690, + "url_literal": "/api/recordings/play/${recording.id}${recording.external_source ? \"?archive=1\" : \"\"}", + "normalized": "/api/recordings/play/{}", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "media-or-binary", + "matched_route": "GET /api/recordings/play/#", + "matched_handler": "handle_recordings_playback", + "domain": "recordings", + "status": "mapped", + "id": "UI-194" + }, + { + "file": "web/js/components/preact/recordings/recordingsAPI.jsx", + "line": 692, + "url_literal": "/api/recordings/download/${recording.id}", + "normalized": "/api/recordings/download/{}", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "media-or-binary", + "matched_route": "GET /api/recordings/download/#", + "matched_handler": "handle_recordings_download", + "domain": "recordings", + "status": "mapped", + "id": "UI-195" + }, + { + "file": "web/js/components/preact/recordings/recordingsAPI.jsx", + "line": 715, + "url_literal": "/api/recordings/tags", + "normalized": "/api/recordings/tags", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/recordings/tags", + "matched_handler": "handle_get_recording_tags", + "domain": "recordings", + "status": "mapped", + "id": "UI-196" + }, + { + "file": "web/js/components/preact/recordings/recordingsAPI.jsx", + "line": 737, + "url_literal": "/api/recordings/detection-labels", + "normalized": "/api/recordings/detection-labels", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/recordings/detection-labels", + "matched_handler": "handle_get_recording_detection_labels", + "domain": "recordings", + "status": "mapped", + "id": "UI-197" + }, + { + "file": "web/js/components/preact/recordings/recordingsAPI.jsx", + "line": 756, + "url_literal": "/api/recordings/${recordingId}/tags", + "normalized": "/api/recordings/{}/tags", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/recordings/#/tags", + "matched_handler": "handle_get_recording_tags_by_id", + "domain": "recordings", + "status": "mapped", + "id": "UI-198" + }, + { + "file": "web/js/components/preact/recordings/recordingsAPI.jsx", + "line": 776, + "url_literal": "/api/recordings/${recordingId}/tags", + "normalized": "/api/recordings/{}/tags", + "method": "PUT", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "PUT /api/recordings/#/tags", + "matched_handler": "handle_put_recording_tags", + "domain": "recordings", + "status": "mapped", + "id": "UI-199" + }, + { + "file": "web/js/components/preact/recordings/recordingsAPI.jsx", + "line": 801, + "url_literal": "/api/recordings/batch-tags", + "normalized": "/api/recordings/batch-tags", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/recordings/batch-tags", + "matched_handler": "handle_batch_recording_tags", + "domain": "recordings", + "status": "mapped", + "id": "UI-200" + }, + { + "file": "web/js/components/preact/recordings/recordingsAPI.jsx", + "line": 822, + "url_literal": "/api/recordings/download/${recording.id}", + "normalized": "/api/recordings/download/{}", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "media-or-binary", + "matched_route": "GET /api/recordings/download/#", + "matched_handler": "handle_recordings_download", + "domain": "recordings", + "status": "mapped", + "id": "UI-201" + }, + { + "file": "web/js/components/preact/settings/GeneralTab.jsx", + "line": 190, + "url_literal": "/api/setup/status", + "normalized": "/api/setup/status", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/setup/status", + "matched_handler": "handle_post_setup_complete", + "domain": "settings", + "status": "mapped", + "id": "UI-202" + }, + { + "file": "web/js/components/preact/settings/Go2rtcTab.jsx", + "line": 112, + "url_literal": "/api/settings/go2rtc/validate", + "normalized": "/api/settings/go2rtc/validate", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/settings/go2rtc/validate", + "matched_handler": "handle_post_settings_go2rtc_validate", + "domain": "settings", + "status": "mapped", + "id": "UI-203" + }, + { + "file": "web/js/components/preact/settings/Go2rtcTab.jsx", + "line": 155, + "url_literal": "/api/system/go2rtc/effective-config", + "normalized": "/api/system/go2rtc/effective-config", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/system/go2rtc/effective-config", + "matched_handler": "handle_get_system_go2rtc_effective_config", + "domain": "settings", + "status": "mapped", + "id": "UI-204" + }, + { + "file": "web/js/components/preact/settings/Go2rtcTab.jsx", + "line": 156, + "url_literal": "/api/system/go2rtc/override-status", + "normalized": "/api/system/go2rtc/override-status", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/system/go2rtc/override-status", + "matched_handler": "handle_get_system_go2rtc_override_status", + "domain": "settings", + "status": "mapped", + "id": "UI-205" + }, + { + "file": "web/js/components/preact/settings/StorageTab.jsx", + "line": 191, + "url_literal": "/api/storage-targets", + "normalized": "/api/storage-targets", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/storage-targets", + "matched_handler": "handle_get_storage_targets", + "domain": "settings", + "status": "mapped", + "id": "UI-206" + }, + { + "file": "web/js/components/preact/settings/StorageTab.jsx", + "line": 195, + "url_literal": "/api/storage-policies", + "normalized": "/api/storage-policies", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/storage-policies", + "matched_handler": "handle_get_storage_policies", + "domain": "settings", + "status": "mapped", + "id": "UI-207" + }, + { + "file": "web/js/components/preact/settings/StorageTab.jsx", + "line": 196, + "url_literal": "/api/storage-pools", + "normalized": "/api/storage-pools", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/storage-pools", + "matched_handler": "handle_get_storage_pools", + "domain": "settings", + "status": "mapped", + "id": "UI-208" + }, + { + "file": "web/js/components/preact/settings/StorageTab.jsx", + "line": 237, + "url_literal": "/api/storage-targets/${encodeURIComponent(editor.uuid)}", + "normalized": "/api/storage-targets/{}", + "method": "PUT", + "method_evidence": "hand-reviewed ternary: method method: editor.uuid ? 'PUT' : 'POST' (URL #1 on line)", + "transport": "json", + "matched_route": "PUT /api/storage-targets/#", + "matched_handler": "handle_put_storage_target", + "domain": "settings", + "status": "mapped", + "id": "UI-209" + }, + { + "file": "web/js/components/preact/settings/StorageTab.jsx", + "line": 237, + "url_literal": "/api/storage-targets", + "normalized": "/api/storage-targets", + "method": "POST", + "method_evidence": "hand-reviewed ternary: method method: editor.uuid ? 'PUT' : 'POST' (URL #2 on line)", + "transport": "json", + "matched_route": "POST /api/storage-targets", + "matched_handler": "handle_post_storage_target", + "domain": "settings", + "status": "mapped", + "id": "UI-210" + }, + { + "file": "web/js/components/preact/settings/StorageTab.jsx", + "line": 257, + "url_literal": "/api/storage-targets/${encodeURIComponent(target.uuid)}/probe", + "normalized": "/api/storage-targets/{}/probe", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/storage-targets/#/probe", + "matched_handler": "handle_post_storage_target_probe", + "domain": "settings", + "status": "mapped", + "id": "UI-211" + }, + { + "file": "web/js/components/preact/settings/StorageTab.jsx", + "line": 277, + "url_literal": "/api/storage-targets/${encodeURIComponent(target.uuid)}?revision=${encodeURIComponent(target.revision)}", + "normalized": "/api/storage-targets/{}", + "method": "DELETE", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "DELETE /api/storage-targets/#", + "matched_handler": "handle_delete_storage_target", + "domain": "settings", + "status": "mapped", + "id": "UI-212" + }, + { + "file": "web/js/components/preact/settings/StorageTab.jsx", + "line": 357, + "url_literal": "/api/storage-pools", + "normalized": "/api/storage-pools", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/storage-pools", + "matched_handler": "handle_get_storage_pools", + "domain": "settings", + "status": "mapped", + "id": "UI-213" + }, + { + "file": "web/js/components/preact/settings/StorageTab.jsx", + "line": 358, + "url_literal": "/api/storage-targets", + "normalized": "/api/storage-targets", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/storage-targets", + "matched_handler": "handle_get_storage_targets", + "domain": "settings", + "status": "mapped", + "id": "UI-214" + }, + { + "file": "web/js/components/preact/settings/StorageTab.jsx", + "line": 373, + "url_literal": "/api/storage-pools/${encodeURIComponent(editor.uuid)}", + "normalized": "/api/storage-pools/{}", + "method": "PUT", + "method_evidence": "hand-reviewed ternary: method method: editor.uuid ? 'PUT' : 'POST' (URL #1 on line)", + "transport": "json", + "matched_route": "PUT /api/storage-pools/#", + "matched_handler": "handle_put_storage_pool", + "domain": "settings", + "status": "mapped", + "id": "UI-215" + }, + { + "file": "web/js/components/preact/settings/StorageTab.jsx", + "line": 373, + "url_literal": "/api/storage-pools", + "normalized": "/api/storage-pools", + "method": "POST", + "method_evidence": "hand-reviewed ternary: method method: editor.uuid ? 'PUT' : 'POST' (URL #2 on line)", + "transport": "json", + "matched_route": "POST /api/storage-pools", + "matched_handler": "handle_post_storage_pool", + "domain": "settings", + "status": "mapped", + "id": "UI-216" + }, + { + "file": "web/js/components/preact/settings/StorageTab.jsx", + "line": 382, + "url_literal": "/api/storage-pools/${encodeURIComponent(pool.uuid)}?revision=${encodeURIComponent(pool.revision)}", + "normalized": "/api/storage-pools/{}", + "method": "DELETE", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "DELETE /api/storage-pools/#", + "matched_handler": "handle_delete_storage_pool", + "domain": "settings", + "status": "mapped", + "id": "UI-217" + }, + { + "file": "web/js/components/preact/settings/StorageTab.jsx", + "line": 407, + "url_literal": "/api/storage-archive", + "normalized": "/api/storage-archive", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/storage-archive", + "matched_handler": "handle_get_storage_archive", + "domain": "settings", + "status": "mapped", + "id": "UI-218" + }, + { + "file": "web/js/components/preact/settings/StorageTab.jsx", + "line": 414, + "url_literal": "/api/storage-archive/retry", + "normalized": "/api/storage-archive/retry", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/storage-archive/retry", + "matched_handler": "handle_post_storage_archive_retry", + "domain": "settings", + "status": "mapped", + "id": "UI-219" + }, + { + "file": "web/js/components/preact/settings/StorageTab.jsx", + "line": 444, + "url_literal": "/api/storage-migrations", + "normalized": "/api/storage-migrations", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/storage-migrations", + "matched_handler": "handle_get_storage_migrations", + "domain": "settings", + "status": "mapped", + "id": "UI-220" + }, + { + "file": "web/js/components/preact/settings/StorageTab.jsx", + "line": 453, + "url_literal": "/api/storage-migrations/${encodeURIComponent(job.uuid)}/${action}", + "normalized": "/api/storage-migrations/{}/cancel", + "method": "POST", + "method_evidence": "hand-reviewed: actOnJob(job,'cancel')", + "transport": "json", + "matched_route": "POST /api/storage-migrations/#/cancel", + "matched_handler": "handle_post_storage_migration_cancel", + "domain": "settings", + "status": "mapped", + "id": "UI-221" + }, + { + "file": "web/js/components/preact/settings/StorageTab.jsx", + "line": 453, + "url_literal": "/api/storage-migrations/${encodeURIComponent(job.uuid)}/${action}", + "normalized": "/api/storage-migrations/{}/retry", + "method": "POST", + "method_evidence": "hand-reviewed: actOnJob(job,'retry')", + "transport": "json", + "matched_route": "POST /api/storage-migrations/#/retry", + "matched_handler": "handle_post_storage_migration_retry", + "domain": "settings", + "status": "mapped", + "id": "UI-222" + }, + { + "file": "web/js/components/preact/settings/StorageTab.jsx", + "line": 557, + "url_literal": "/api/storage-policies", + "normalized": "/api/storage-policies", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/storage-policies", + "matched_handler": "handle_get_storage_policies", + "domain": "settings", + "status": "mapped", + "id": "UI-223" + }, + { + "file": "web/js/components/preact/settings/StorageTab.jsx", + "line": 558, + "url_literal": "/api/storage-targets", + "normalized": "/api/storage-targets", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/storage-targets", + "matched_handler": "handle_get_storage_targets", + "domain": "settings", + "status": "mapped", + "id": "UI-224" + }, + { + "file": "web/js/components/preact/settings/StorageTab.jsx", + "line": 559, + "url_literal": "/api/storage-pools", + "normalized": "/api/storage-pools", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/storage-pools", + "matched_handler": "handle_get_storage_pools", + "domain": "settings", + "status": "mapped", + "id": "UI-225" + }, + { + "file": "web/js/components/preact/settings/StorageTab.jsx", + "line": 560, + "url_literal": "/api/locations", + "normalized": "/api/locations", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/locations", + "matched_handler": "handle_get_locations", + "domain": "settings", + "status": "mapped", + "id": "UI-226" + }, + { + "file": "web/js/components/preact/settings/StorageTab.jsx", + "line": 561, + "url_literal": "/api/camera-tags", + "normalized": "/api/camera-tags", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/camera-tags", + "matched_handler": "handle_get_camera_tags", + "domain": "settings", + "status": "mapped", + "id": "UI-227" + }, + { + "file": "web/js/components/preact/settings/StorageTab.jsx", + "line": 569, + "url_literal": "/api/storage-policies/${policy.uuid}/apply", + "normalized": "/api/storage-policies/{}/apply", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/storage-policies/#/apply", + "matched_handler": "handle_post_storage_policy_apply", + "domain": "settings", + "status": "mapped", + "id": "UI-228" + }, + { + "file": "web/js/components/preact/settings/StorageTab.jsx", + "line": 617, + "url_literal": "/api/storage-policies/preview", + "normalized": "/api/storage-policies/preview", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/storage-policies/preview", + "matched_handler": "handle_post_storage_policy_preview", + "domain": "settings", + "status": "mapped", + "id": "UI-229" + }, + { + "file": "web/js/components/preact/settings/StorageTab.jsx", + "line": 630, + "url_literal": "/api/storage-policies/${encodeURIComponent(editor.uuid)}", + "normalized": "/api/storage-policies/{}", + "method": "PUT", + "method_evidence": "hand-reviewed ternary: method method: editor.uuid ? 'PUT' : 'POST' (URL #1 on line)", + "transport": "json", + "matched_route": "PUT /api/storage-policies/#", + "matched_handler": "handle_put_storage_policy", + "domain": "settings", + "status": "mapped", + "id": "UI-230" + }, + { + "file": "web/js/components/preact/settings/StorageTab.jsx", + "line": 630, + "url_literal": "/api/storage-policies", + "normalized": "/api/storage-policies", + "method": "POST", + "method_evidence": "hand-reviewed ternary: method method: editor.uuid ? 'PUT' : 'POST' (URL #2 on line)", + "transport": "json", + "matched_route": "POST /api/storage-policies", + "matched_handler": "handle_post_storage_policy", + "domain": "settings", + "status": "mapped", + "id": "UI-231" + }, + { + "file": "web/js/components/preact/settings/StorageTab.jsx", + "line": 642, + "url_literal": "/api/storage-policies/${encodeURIComponent(policy.uuid)}?revision=${encodeURIComponent(policy.revision)}", + "normalized": "/api/storage-policies/{}", + "method": "DELETE", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "DELETE /api/storage-policies/#", + "matched_handler": "handle_delete_storage_policy", + "domain": "settings", + "status": "mapped", + "id": "UI-232" + }, + { + "file": "web/js/components/preact/settings/StorageTab.jsx", + "line": 672, + "url_literal": "/api/storage-compliance", + "normalized": "/api/storage-compliance", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/storage-compliance", + "matched_handler": "handle_get_storage_compliance", + "domain": "settings", + "status": "mapped", + "id": "UI-233" + }, + { + "file": "web/js/components/preact/settings/WorkspacesTab.jsx", + "line": 24, + "url_literal": "/api/ui/workspaces", + "normalized": "/api/ui/workspaces", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/ui/workspaces", + "matched_handler": "handle_get_ui_workspaces", + "domain": "settings", + "status": "mapped", + "id": "UI-234" + }, + { + "file": "web/js/components/preact/settings/WorkspacesTab.jsx", + "line": 35, + "url_literal": "/api/ui/workspaces", + "normalized": "/api/ui/workspaces", + "method": "PUT", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "PUT /api/ui/workspaces", + "matched_handler": "handle_put_ui_workspaces", + "domain": "settings", + "status": "mapped", + "id": "UI-235" + }, + { + "file": "web/js/components/preact/system/HealthIncidentHistory.jsx", + "line": 10, + "url_literal": "/api/system/health/incidents?limit=${HISTORY_PAGE_SIZE}&include_closed=true${suffix}", + "normalized": "/api/system/health/incidents", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/system/health/incidents", + "matched_handler": "handle_get_system_health_incidents", + "domain": "system-health", + "status": "mapped", + "id": "UI-236" + }, + { + "file": "web/js/components/preact/system/LogsPoller.jsx", + "line": 57, + "url_literal": "/api/system/logs?level=${encodeURIComponent(normalizedLevel)}&count=${encodeURIComponent(logCount)}", + "normalized": "/api/system/logs", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/system/logs", + "matched_handler": "handle_get_system_logs", + "domain": "system-health", + "status": "mapped", + "id": "UI-237" + }, + { + "file": "web/js/components/preact/system/RestartModal.jsx", + "line": 54, + "url_literal": "/api/system/status", + "normalized": "/api/system/status", + "method": "GET", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "GET /api/system/status", + "matched_handler": "handle_get_system_status", + "domain": "system-health", + "status": "mapped", + "id": "UI-238" + }, + { + "file": "web/js/components/preact/system/RestartModal.jsx", + "line": 90, + "url_literal": "/api/system/status", + "normalized": "/api/system/status", + "method": "GET", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "GET /api/system/status", + "matched_handler": "handle_get_system_status", + "domain": "system-health", + "status": "mapped", + "id": "UI-239" + }, + { + "file": "web/js/components/preact/system/StorageHealth.jsx", + "line": 60, + "url_literal": "/api/storage/health", + "normalized": "/api/storage/health", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/storage/health", + "matched_handler": "handle_get_storage_health", + "domain": "system-health", + "status": "mapped", + "id": "UI-240" + }, + { + "file": "web/js/components/preact/system/StorageHealth.jsx", + "line": 67, + "url_literal": "/api/storage/cleanup", + "normalized": "/api/storage/cleanup", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/storage/cleanup", + "matched_handler": "handle_post_storage_cleanup", + "domain": "system-health", + "status": "mapped", + "id": "UI-241" + }, + { + "file": "web/js/components/preact/system/SystemHealth.jsx", + "line": 184, + "url_literal": "/api/system/health", + "normalized": "/api/system/health", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/system/health", + "matched_handler": "handle_get_system_health", + "domain": "system-health", + "status": "mapped", + "id": "UI-242" + }, + { + "file": "web/js/components/preact/system/WebServiceInfo.jsx", + "line": 34, + "url_literal": "/api/health", + "normalized": "/api/health", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/health", + "matched_handler": "handle_get_health", + "domain": "system-health", + "status": "mapped", + "id": "UI-243" + }, + { + "file": "web/js/components/preact/timeline/TimelineControls.jsx", + "line": 245, + "url_literal": "/api/recordings/${currentRecordingId}/protect", + "normalized": "/api/recordings/{}/protect", + "method": "PUT", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "PUT /api/recordings/#/protect", + "matched_handler": "handle_put_recording_protect", + "domain": "timeline", + "status": "mapped", + "id": "UI-244" + }, + { + "file": "web/js/components/preact/timeline/TimelineCursor.jsx", + "line": 73, + "url_literal": "/api/recordings/thumbnail/${encodeURIComponent(segment.id)}/${frameIndex}", + "normalized": "/api/recordings/thumbnail/{}/{}", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "media-or-binary", + "matched_route": "GET /api/recordings/thumbnail/#/#", + "matched_handler": "handle_recordings_thumbnail", + "domain": "timeline", + "status": "mapped", + "id": "UI-245" + }, + { + "file": "web/js/components/preact/timeline/TimelineCursor.jsx", + "line": 444, + "url_literal": "/api/recordings/thumbnail/${encodeURIComponent(current.recordingId)}/0", + "normalized": "/api/recordings/thumbnail/{}/0", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "media-or-binary", + "matched_route": "GET /api/recordings/thumbnail/#/#", + "matched_handler": "handle_recordings_thumbnail", + "domain": "timeline", + "status": "mapped", + "id": "UI-246" + }, + { + "file": "web/js/components/preact/timeline/TimelinePage.jsx", + "line": 1094, + "url_literal": "/api/timeline/segments-by-ids?ids=${encodeURIComponent(recordingIds)}", + "normalized": "/api/timeline/segments-by-ids", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/timeline/segments-by-ids", + "matched_handler": "handle_get_timeline_segments_by_ids", + "domain": "timeline", + "status": "mapped", + "id": "UI-247" + }, + { + "file": "web/js/components/preact/timeline/TimelinePlayer.jsx", + "line": 291, + "url_literal": "/api/recordings/play/${segment.id}?v=${encodeURIComponent(segmentVersion)}", + "normalized": "/api/recordings/play/{}", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "media-or-binary", + "matched_route": "GET /api/recordings/play/#", + "matched_handler": "handle_recordings_playback", + "domain": "timeline", + "status": "mapped", + "id": "UI-248" + }, + { + "file": "web/js/components/preact/timeline/TimelinePlayer.jsx", + "line": 575, + "url_literal": "/api/recordings/${segment.id}", + "normalized": "/api/recordings/{}", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/recordings/#", + "matched_handler": "handle_get_recording", + "domain": "timeline", + "status": "mapped", + "id": "UI-249" + }, + { + "file": "web/js/components/preact/timeline/TimelinePlayer.jsx", + "line": 612, + "url_literal": "/api/recordings/${segment.id}/tags", + "normalized": "/api/recordings/{}/tags", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/recordings/#/tags", + "matched_handler": "handle_get_recording_tags_by_id", + "domain": "timeline", + "status": "mapped", + "id": "UI-250" + }, + { + "file": "web/js/components/preact/timeline/TimelinePlayer.jsx", + "line": 629, + "url_literal": "/api/detection/results/${encodeURIComponent(data.stream)}?start=${startTime}&end=${endTime}", + "normalized": "/api/detection/results/{}", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/detection/results/#", + "matched_handler": "handle_get_detection_results", + "domain": "timeline", + "status": "mapped", + "id": "UI-251" + }, + { + "file": "web/js/components/preact/timeline/TimelinePlayer.jsx", + "line": 847, + "url_literal": "/api/recordings/${currentSegmentId}", + "normalized": "/api/recordings/{}", + "method": "DELETE", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "DELETE /api/recordings/#", + "matched_handler": "handle_delete_recording", + "domain": "timeline", + "status": "mapped", + "id": "UI-252" + }, + { + "file": "web/js/components/preact/timeline/TimelinePlayer.jsx", + "line": 1075, + "url_literal": "/api/recordings/download/${currentSegmentId}", + "normalized": "/api/recordings/download/{}", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "media-or-binary", + "matched_route": "GET /api/recordings/download/#", + "matched_handler": "handle_recordings_download", + "domain": "timeline", + "status": "mapped", + "id": "UI-253" + }, + { + "file": "web/js/components/preact/timeline/TimelineSegments.jsx", + "line": 214, + "url_literal": "/api/recordings/thumbnail/${encodeURIComponent(segment.id)}/${frameIndex}", + "normalized": "/api/recordings/thumbnail/{}/{}", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "media-or-binary", + "matched_route": "GET /api/recordings/thumbnail/#/#", + "matched_handler": "handle_recordings_thumbnail", + "domain": "timeline", + "status": "mapped", + "id": "UI-254" + }, + { + "file": "web/js/components/preact/timeline/TimelineSegments.jsx", + "line": 352, + "url_literal": "/api/recordings/thumbnail/${encodeURIComponent(current.recordingId)}/0", + "normalized": "/api/recordings/thumbnail/{}/0", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "media-or-binary", + "matched_route": "GET /api/recordings/thumbnail/#/#", + "matched_handler": "handle_recordings_thumbnail", + "domain": "timeline", + "status": "mapped", + "id": "UI-255" + }, + { + "file": "web/js/components/preact/timeline/timelineUtils.js", + "line": 22, + "url_literal": "/api/timeline/segments?${params.toString()}", + "normalized": "/api/timeline/segments", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/timeline/segments", + "matched_handler": "handle_get_timeline_segments", + "domain": "timeline", + "status": "mapped", + "id": "UI-256" + }, + { + "file": "web/js/components/preact/users/AccessPolicyModal.jsx", + "line": 110, + "url_literal": "/api/authorization/simulate", + "normalized": "/api/authorization/simulate", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/authorization/simulate", + "matched_handler": "handle_post_authorization_simulate", + "domain": "users-access", + "status": "mapped", + "id": "UI-257" + }, + { + "file": "web/js/components/preact/users/AccessPolicyModal.jsx", + "line": 182, + "url_literal": "/api/authorization/actions", + "normalized": "/api/authorization/actions", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/authorization/actions", + "matched_handler": "handle_get_authorization_actions", + "domain": "users-access", + "status": "mapped", + "id": "UI-258" + }, + { + "file": "web/js/components/preact/users/AccessPolicyModal.jsx", + "line": 183, + "url_literal": "/api/authorization/roles", + "normalized": "/api/authorization/roles", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/authorization/roles", + "matched_handler": "handle_get_authorization_roles", + "domain": "users-access", + "status": "mapped", + "id": "UI-259" + }, + { + "file": "web/js/components/preact/users/AccessPolicyModal.jsx", + "line": 184, + "url_literal": "/api/authorization/users/${encodeURIComponent(user.id)}", + "normalized": "/api/authorization/users/{}", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/authorization/users/#", + "matched_handler": "handle_get_user_authorization", + "domain": "users-access", + "status": "mapped", + "id": "UI-260" + }, + { + "file": "web/js/components/preact/users/AccessPolicyModal.jsx", + "line": 185, + "url_literal": "/api/camera-collections", + "normalized": "/api/camera-collections", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/camera-collections", + "matched_handler": "handle_get_camera_collections", + "domain": "users-access", + "status": "mapped", + "id": "UI-261" + }, + { + "file": "web/js/components/preact/users/AccessPolicyModal.jsx", + "line": 186, + "url_literal": "/api/locations", + "normalized": "/api/locations", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/locations", + "matched_handler": "handle_get_locations", + "domain": "users-access", + "status": "mapped", + "id": "UI-262" + }, + { + "file": "web/js/components/preact/users/AccessPolicyModal.jsx", + "line": 187, + "url_literal": "/api/camera-tags", + "normalized": "/api/camera-tags", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/camera-tags", + "matched_handler": "handle_get_camera_tags", + "domain": "users-access", + "status": "mapped", + "id": "UI-263" + }, + { + "file": "web/js/components/preact/users/AccessPolicyModal.jsx", + "line": 246, + "url_literal": "/api/authorization/users/${encodeURIComponent(user.id)}", + "normalized": "/api/authorization/users/{}", + "method": "PUT", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "PUT /api/authorization/users/#", + "matched_handler": "handle_put_user_authorization", + "domain": "users-access", + "status": "mapped", + "id": "UI-264" + }, + { + "file": "web/js/components/preact/users/ApiKeyModal.jsx", + "line": 146, + "url_literal": "/api/authorization/actions", + "normalized": "/api/authorization/actions", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/authorization/actions", + "matched_handler": "handle_get_authorization_actions", + "domain": "users-access", + "status": "mapped", + "id": "UI-265" + }, + { + "file": "web/js/components/preact/users/ApiKeyModal.jsx", + "line": 147, + "url_literal": "/api/authorization/users/${encodeURIComponent(currentUser.id)}/tokens", + "normalized": "/api/authorization/users/{}/tokens", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/authorization/users/#/tokens", + "matched_handler": "handle_get_user_api_tokens", + "domain": "users-access", + "status": "mapped", + "id": "UI-266" + }, + { + "file": "web/js/components/preact/users/ApiKeyModal.jsx", + "line": 148, + "url_literal": "/api/camera-collections", + "normalized": "/api/camera-collections", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/camera-collections", + "matched_handler": "handle_get_camera_collections", + "domain": "users-access", + "status": "mapped", + "id": "UI-267" + }, + { + "file": "web/js/components/preact/users/ApiKeyModal.jsx", + "line": 149, + "url_literal": "/api/locations", + "normalized": "/api/locations", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/locations", + "matched_handler": "handle_get_locations", + "domain": "users-access", + "status": "mapped", + "id": "UI-268" + }, + { + "file": "web/js/components/preact/users/ApiKeyModal.jsx", + "line": 150, + "url_literal": "/api/camera-tags", + "normalized": "/api/camera-tags", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/camera-tags", + "matched_handler": "handle_get_camera_tags", + "domain": "users-access", + "status": "mapped", + "id": "UI-269" + }, + { + "file": "web/js/components/preact/users/ApiKeyModal.jsx", + "line": 196, + "url_literal": "/api/authorization/users/${encodeURIComponent(currentUser.id)}/tokens", + "normalized": "/api/authorization/users/{}/tokens", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/authorization/users/#/tokens", + "matched_handler": "handle_post_user_api_token", + "domain": "users-access", + "status": "mapped", + "id": "UI-270" + }, + { + "file": "web/js/components/preact/users/ApiKeyModal.jsx", + "line": 223, + "url_literal": "/api/authorization/users/${encodeURIComponent(currentUser.id)}/tokens/${encodeURIComponent(token.uuid)}", + "normalized": "/api/authorization/users/{}/tokens/{}", + "method": "DELETE", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "DELETE /api/authorization/users/#/tokens/#", + "matched_handler": "handle_delete_user_api_token", + "domain": "users-access", + "status": "mapped", + "id": "UI-271" + }, + { + "file": "web/js/components/preact/users/ApiKeyModal.jsx", + "line": 242, + "url_literal": "/api/auth/users/${encodeURIComponent(currentUser.id)}/api-key", + "normalized": "/api/auth/users/{}/api-key", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/auth/users/#/api-key", + "matched_handler": "handle_users_generate_api_key", + "domain": "users-access", + "status": "mapped", + "id": "UI-272" + }, + { + "file": "web/js/components/preact/users/AuditDecisionModes.jsx", + "line": 31, + "url_literal": "/api/audit/settings", + "normalized": "/api/audit/settings", + "method": "PUT", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "PUT /api/audit/settings", + "matched_handler": "handle_put_audit_settings", + "domain": "users-access", + "status": "mapped", + "id": "UI-273" + }, + { + "file": "web/js/components/preact/users/AuditHistoryModal.jsx", + "line": 103, + "url_literal": "/api/audit/events?${queryString}", + "normalized": "/api/audit/events", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/audit/events", + "matched_handler": "handle_get_audit_events", + "domain": "users-access", + "status": "mapped", + "id": "UI-274" + }, + { + "file": "web/js/components/preact/users/AuditHistoryModal.jsx", + "line": 121, + "url_literal": "/api/audit/settings", + "normalized": "/api/audit/settings", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/audit/settings", + "matched_handler": "handle_get_audit_settings", + "domain": "users-access", + "status": "mapped", + "id": "UI-275" + }, + { + "file": "web/js/components/preact/users/AuditHistoryModal.jsx", + "line": 176, + "url_literal": "/api/audit/settings", + "normalized": "/api/audit/settings", + "method": "PUT", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "PUT /api/audit/settings", + "matched_handler": "handle_put_audit_settings", + "domain": "users-access", + "status": "mapped", + "id": "UI-276" + }, + { + "file": "web/js/components/preact/users/AuditHistoryModal.jsx", + "line": 198, + "url_literal": "/api/audit/events/export?${queryString}", + "normalized": "/api/audit/events/export", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/audit/events/export", + "matched_handler": "handle_get_audit_export", + "domain": "users-access", + "status": "mapped", + "id": "UI-277" + }, + { + "file": "web/js/components/preact/users/RoleManagerModal.jsx", + "line": 41, + "url_literal": "/api/authorization/actions", + "normalized": "/api/authorization/actions", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/authorization/actions", + "matched_handler": "handle_get_authorization_actions", + "domain": "users-access", + "status": "mapped", + "id": "UI-278" + }, + { + "file": "web/js/components/preact/users/RoleManagerModal.jsx", + "line": 42, + "url_literal": "/api/authorization/roles", + "normalized": "/api/authorization/roles", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/authorization/roles", + "matched_handler": "handle_get_authorization_roles", + "domain": "users-access", + "status": "mapped", + "id": "UI-279" + }, + { + "file": "web/js/components/preact/users/RoleManagerModal.jsx", + "line": 101, + "url_literal": "/api/authorization/roles/${encodeURIComponent(draft.uuid)}", + "normalized": "/api/authorization/roles/{}", + "method": "PUT", + "method_evidence": "hand-reviewed ternary: method method: draft.uuid ? 'PUT' : 'POST' (URL #1 on line)", + "transport": "json", + "matched_route": "PUT /api/authorization/roles/#", + "matched_handler": "handle_put_authorization_role", + "domain": "users-access", + "status": "mapped", + "id": "UI-280" + }, + { + "file": "web/js/components/preact/users/RoleManagerModal.jsx", + "line": 101, + "url_literal": "/api/authorization/roles", + "normalized": "/api/authorization/roles", + "method": "POST", + "method_evidence": "hand-reviewed ternary: method method: draft.uuid ? 'PUT' : 'POST' (URL #2 on line)", + "transport": "json", + "matched_route": "POST /api/authorization/roles", + "matched_handler": "handle_post_authorization_role", + "domain": "users-access", + "status": "mapped", + "id": "UI-281" + }, + { + "file": "web/js/components/preact/users/RoleManagerModal.jsx", + "line": 129, + "url_literal": "/api/authorization/roles/${encodeURIComponent(draft.uuid)}", + "normalized": "/api/authorization/roles/{}", + "method": "DELETE", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "DELETE /api/authorization/roles/#", + "matched_handler": "handle_delete_authorization_role", + "domain": "users-access", + "status": "mapped", + "id": "UI-282" + }, + { + "file": "web/js/components/preact/users/TotpSetupModal.jsx", + "line": 33, + "url_literal": "/api/auth/users/${user.id}/totp/status", + "normalized": "/api/auth/users/{}/totp/status", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/auth/users/#/totp/status", + "matched_handler": "handle_totp_status", + "domain": "users-access", + "status": "mapped", + "id": "UI-283" + }, + { + "file": "web/js/components/preact/users/TotpSetupModal.jsx", + "line": 70, + "url_literal": "/api/auth/users/${user.id}/totp/setup", + "normalized": "/api/auth/users/{}/totp/setup", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/auth/users/#/totp/setup", + "matched_handler": "handle_totp_setup", + "domain": "users-access", + "status": "mapped", + "id": "UI-284" + }, + { + "file": "web/js/components/preact/users/TotpSetupModal.jsx", + "line": 96, + "url_literal": "/api/auth/users/${user.id}/totp/verify", + "normalized": "/api/auth/users/{}/totp/verify", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/auth/users/#/totp/verify", + "matched_handler": "handle_totp_verify", + "domain": "users-access", + "status": "mapped", + "id": "UI-285" + }, + { + "file": "web/js/components/preact/users/TotpSetupModal.jsx", + "line": 117, + "url_literal": "/api/auth/users/${user.id}/totp/disable", + "normalized": "/api/auth/users/{}/totp/disable", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/auth/users/#/totp/disable", + "matched_handler": "handle_totp_disable", + "domain": "users-access", + "status": "mapped", + "id": "UI-286" + }, + { + "file": "web/js/pages/hls-page.jsx", + "line": 36, + "url_literal": "/api/client-config", + "normalized": "/api/client-config", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/client-config", + "matched_handler": "handle_get_client_config", + "domain": "live", + "status": "mapped", + "id": "UI-287" + }, + { + "file": "web/js/pages/index-page.jsx", + "line": 40, + "url_literal": "/api/client-config", + "normalized": "/api/client-config", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/client-config", + "matched_handler": "handle_get_client_config", + "domain": "live", + "status": "mapped", + "id": "UI-288" + }, + { + "file": "web/js/pages/index-page.jsx", + "line": 41, + "url_literal": "/api/setup/status", + "normalized": "/api/setup/status", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/setup/status", + "matched_handler": "handle_get_setup_status", + "domain": "live", + "status": "mapped", + "id": "UI-289" + }, + { + "file": "web/js/utils/auth-utils.js", + "line": 48, + "url_literal": "/api/auth/verify", + "normalized": "/api/auth/verify", + "method": "GET", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "GET /api/auth/verify", + "matched_handler": "handle_auth_verify", + "domain": "shared-auth", + "status": "mapped", + "id": "UI-290" + }, + { + "file": "web/js/utils/detection-polling.js", + "line": 25, + "url_literal": "/api/detection/results/${encodeURIComponent(streamName)}", + "normalized": "/api/detection/results/{}", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/detection/results/#", + "matched_handler": "handle_get_detection_results", + "domain": "live", + "status": "mapped", + "id": "UI-291" + }, + { + "file": "web/js/utils/player-telemetry.js", + "line": 37, + "url_literal": "/api/telemetry/player", + "normalized": "/api/telemetry/player", + "method": "POST", + "method_evidence": "hand-reviewed: navigator.sendBeacon (POST)", + "transport": "json", + "matched_route": "POST /api/telemetry/player", + "matched_handler": "handle_post_player_telemetry", + "domain": "live", + "status": "mapped", + "id": "UI-292" + }, + { + "file": "web/js/utils/player-telemetry.js", + "line": 39, + "url_literal": "/api/telemetry/player", + "normalized": "/api/telemetry/player", + "method": "POST", + "method_evidence": "explicit method option", + "transport": "json", + "matched_route": "POST /api/telemetry/player", + "matched_handler": "handle_post_player_telemetry", + "domain": "live", + "status": "mapped", + "id": "UI-293" + }, + { + "file": "web/js/utils/settings-utils.js", + "line": 37, + "url_literal": "/api/client-config", + "normalized": "/api/client-config", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/client-config", + "matched_handler": "handle_get_client_config", + "domain": "shared-shell", + "status": "mapped", + "id": "UI-294" + }, + { + "file": "web/js/utils/stream-summaries.js", + "line": 24, + "url_literal": "/api/streams?${params.toString()}", + "normalized": "/api/streams", + "method": "GET", + "method_evidence": "default (no method option / resource URL)", + "transport": "json", + "matched_route": "GET /api/streams", + "matched_handler": "handle_get_streams", + "domain": "streams", + "status": "mapped", + "id": "UI-295" + }, + { + "file": "web/js/components/preact/HLSVideoCell.jsx", + "line": 245, + "url_literal": "(hls.js follows m3u8 playlist)", + "normalized": "/go2rtc/api/hls/{}", + "method": "GET", + "method_evidence": "hand-reviewed: hls.js fetches segment/playlist URLs referenced by /go2rtc/api/stream.m3u8", + "transport": "go2rtc-proxy", + "matched_route": "GET /go2rtc/api/hls/*", + "matched_handler": "handle_go2rtc_proxy", + "domain": "live", + "status": "mapped", + "derived": true, + "id": "UI-296" + }, + { + "file": "web/js/components/preact/HLSVideoCell.jsx", + "line": 206, + "url_literal": "(hls.js follows /hls/{name}/index.m3u8 segments)", + "normalized": "/hls/{}/{}", + "method": "GET", + "method_evidence": "hand-reviewed: native HLS segment fetches served by handle_direct_hls_request", + "transport": "native-hls-media", + "matched_route": "GET /hls/#/#", + "matched_handler": "handle_direct_hls_request", + "domain": "live", + "status": "mapped", + "derived": true, + "id": "UI-297" + } + ], + "summary": { + "routes": 239, + "routes_with_ui_consumer": 190, + "routes_without_ui_consumer": [ + "GET /api/health/hls", + "GET /api/metrics", + "POST /api/motion/trigger", + "GET /api/locations/#", + "GET /api/live/plans/#", + "GET /api/camera-tags/#", + "GET /api/fleet/views/#", + "PUT /api/fleet/views/#", + "PUT /api/live/layouts/#", + "GET /api/camera-collections/#", + "POST /api/streams/#/recording", + "DELETE /api/streams/#/zones", + "GET /api/streams/#/retention", + "PUT /api/streams/#/retention", + "GET /api/streams/#/detection-engines", + "PUT /api/streams/#/detection-engines", + "POST /api/streams/#/ptz/absolute", + "POST /api/streams/#/ptz/relative", + "GET /api/streams/#/imaging/settings", + "PUT /api/streams/#/imaging/settings", + "GET /api/streams/#/imaging/options", + "GET /api/streams/#", + "GET /api/system", + "POST /api/system/shutdown", + "POST /api/system/backup", + "GET /api/snapshots/#/#", + "GET /api/auth/users/#", + "PUT /api/auth/users/#/password-lock", + "GET /api/event-destinations/#", + "GET /api/storage-targets/#", + "POST /api/storage-migrations", + "GET /api/storage-migrations/#", + "GET /api/storage-pools/#", + "GET /api/storage-policies/#", + "GET /api/event-routes/#", + "GET /api/onvif/discovery/status", + "POST /api/onvif/device/add", + "GET /api/recordings/files/check", + "DELETE /api/recordings/files", + "GET /api/recordings/protected", + "POST /api/recordings/sync", + "PUT /api/recordings/#/retention", + "GET /api/timeline/manifest", + "GET /api/timeline/play", + "GET /api/investigations/thumbnail/#/#", + "GET /api/investigation-bookmarks/#", + "PUT /api/investigation-bookmarks/#", + "GET /go2rtc/api/streams", + "POST /go2rtc/api/reload" + ], + "ui_operations": 297, + "ui_operations_mapped": 297, + "ui_operation_discrepancies": 0, + "distinct_ui_method_routes": 190, + "discrepancies_total": 10 + }, + "discrepancies": [ + { + "id": "D-01", + "kind": "semantic", + "where": "web/js/components/preact/StreamsView.jsx:690", + "detail": "PUT /api/streams/{name} sends is_deleted:false (\"undelete\") but handle_put_stream never reads is_deleted; the field is silently ignored." + }, + { + "id": "D-02", + "kind": "semantic", + "where": "web/js/components/preact/StreamsView.jsx:832", + "detail": "Edit modal reads stream.detection_zones from GET /api/streams/{name}/full but the handler never emits it; zones come only from GET /api/streams/{name}/zones (StreamConfigModal.jsx:336). Comment on handle_get_stream_full (\"also returns motion recording config\") is stale: response is {stream:{...}} only." + }, + { + "id": "D-03", + "kind": "semantic", + "where": "web/js/components/preact/StreamCard.jsx:319", + "detail": "StreamCard reads stream.error_message and the playback transport, but the admin summary (surface=admin) emits neither error_message nor playback_transport (playback_transport only on surface=live). Card tooltip/transport label silently fall back." + }, + { + "id": "D-04", + "kind": "policy", + "where": "web/js/components/preact/StreamsView.jsx:221", + "detail": "StreamsView always queries GET /api/detection/models; handler returns 403 for principals with no camera_configure grant (e.g. viewers). Contract must model 403 for this option dependency; UI tolerates it by showing no models." + }, + { + "id": "D-05", + "kind": "policy", + "where": "web/js/components/preact/StreamsView.jsx:78", + "detail": "Edit/delete gating mixes legacy role names from /api/auth/verify (admin/user/viewer) with per-camera summary can_configure; server authority is AUTHZ_CAMERA_CONFIGURE per camera. Edit-modal credential hiding uses /full can_control_privacy (== configure decision) as proxy." + }, + { + "id": "D-06", + "kind": "client-quirk", + "where": "web/js/pages/index-page.jsx:52", + "detail": "/api/client-config returns snake_case only; index-page reads camelCase first (dead branches)." + }, + { + "id": "D-07", + "kind": "routing", + "where": "src/web/libuv_connection.c:on_message_complete", + "detail": "Router is first-match in registration order with method filter, \"#\" = one possibly-empty run of non-\"/\" characters, \"*\" = rest. Unmatched paths fall to static file resolution (returns 404 JSON for unknown /api/* paths rather than 405 for wrong method). Entire /go2rtc and /go2rtc/* namespace is diverted to the proxy thread regardless of method/registration (only 7 go2rtc patterns are registered; the proxy authorizer enforces its own allow-list)." + }, + { + "id": "D-08", + "kind": "routing", + "where": "src/web/api_handlers_streams_get.c:handle_get_stream_full", + "detail": "Stream names are path segments matched before decoding; names containing \"/\" must be percent-encoded and decoded by http_request_extract_path_param. /full handler trims everything after first \"/\" of decoded id. Contract tests should include encoded names (T11)." + }, + { + "id": "D-09", + "kind": "docs", + "where": "web/js/components/preact/Toast.jsx", + "detail": "Toast.jsx (ToastProvider/useToast) is unreferenced; duplicate toast API with ToastContainer.jsx." + }, + { + "id": "D-10", + "kind": "test-config", + "where": "playwright.config.ts", + "detail": "Project 'go2rtc' testMatch /.*\\.go2rtc\\.spec\\.ts/ matches no file; tests/integration/go2rtc.api.spec.ts runs in the 'api' project (npm run test:go2rtc relies on --grep @go2rtc instead)." + } + ], + "streams_pilot": { + "scope_note": "Pilot = Streams list + edit only (plan assumption). Create/clone/delete/disable/bulk/ONVIF/test are inventoried here as out-of-pilot operations sharing StreamsView.jsx.", + "ui_files": { + "pilot": [ + "web/js/pages/streams-page.jsx", + "web/js/components/preact/StreamsView.jsx", + "web/js/components/preact/StreamCard.jsx", + "web/js/components/preact/StreamConfigModal.jsx", + "web/js/components/preact/ZoneEditor.jsx", + "web/js/utils/stream-availability.js", + "web/js/utils/eptz-config.js" + ], + "pilot_shared_dependencies": [ + "web/js/query-client.js (useQuery/useMutation/useQueryClient/usePostMutation/fetchJSON)", + "web/js/fetch-utils.js (fetchJSON, 401 redirect)", + "web/js/i18n.js (useI18n)", + "web/js/utils/auth-utils.js (validateSession -> role, demo_mode)", + "web/js/components/preact/ToastContainer.jsx (showStatusMessage)", + "web/js/components/preact/AsyncButton.jsx", + "web/js/components/preact/LoadingIndicator.jsx (ContentLoader)", + "web/js/utils/url-utils.js (obfuscateUrlCredentials in StreamConfigModal)", + "web/js/utils/zone-editor-geometry.js", + "web/js/utils/settings-utils.js (getGo2rtcBaseUrl in ZoneEditor)" + ], + "same_file_out_of_pilot": [ + "web/js/components/preact/StreamDeleteModal.jsx", + "web/js/components/preact/StreamBulkActionModal.jsx", + "StreamsView.jsx tabs that embed HealthView.jsx, FleetView.jsx, EventRoutingView.jsx (view=health|inventory|events)", + "StreamsView.jsx ONVIF discovery modal and create/clone/test/delete/disable/enable/bulk mutations" + ] + }, + "variants": { + "summary_list": { + "operation": "GET /api/streams?summary=true", + "handler": "handle_get_streams -> handle_get_stream_summaries (src/web/api_handlers_streams_get.c)", + "auth": "401 unless authenticated (httpd_check_action_access). Rows filtered per camera: surface admin/live require AUTHZ_LIVE_VIEW; surface=lpr requires AUTHZ_LPR_SEARCH and AUTHZ_LPR_READ. can_configure = AUTHZ_CAMERA_CONFIGURE decision per row.", + "query": { + "summary": "true|1 selects this variant; otherwise legacy full list", + "surface": "admin (default) | live | lpr; anything else 400 'surface must be admin, live or lpr'", + "page": "int >=1 (default 1, max 1000000); invalid 400", + "page_size": "int 1..100 (default 50); >100 or <1 => 400 'page and page_size must be positive; page_size max is 100'", + "sort_by": "name|status|resolution|fps|recording (default name); else 400", + "sort_order": "asc|desc (default asc); else 400", + "availability": "all|live|offline|never_connected|disabled (default all); else 400", + "search": "case-insensitive substring, max 255 chars", + "include_admin_url": "true|1 adds admin_url on non-live surfaces (empty string unless can_configure)" + }, + "response": "{streams:[...], total, page, page_size, total_pages}", + "item_fields": { + "lpr": [ + "camera_uuid", + "name" + ], + "admin": [ + "camera_uuid", + "name", + "location_uuid", + "location_name", + "location_path", + "enabled", + "width", + "height", + "fps", + "codec", + "protocol", + "record", + "record_on_schedule", + "detection_based_recording", + "isOnvif", + "tags", + "status", + "availability", + "first_video_at", + "last_frame_ts", + "current_fps", + "recording_active", + "last_recording_at", + "can_configure", + "admin_url (only if include_admin_url)" + ], + "live_additional": [ + "streaming_enabled", + "playback_transport", + "eptz_config", + "detection_model", + "privacy_mode", + "can_control_privacy", + "has_sub_stream", + "ptz_enabled", + "backchannel_enabled", + "go2rtc_hls_available" + ] + }, + "redaction": "Summary never includes url, onvif credentials, sub_stream_url, detection_url, publish_url, go2rtc_source_override. admin_url is opt-in and blanked for rows without configure.", + "ui_consumers": [ + "StreamsView.jsx:199 (surface=admin, include_admin_url=true, paged, sortable, availability, search; queryKey ['streams','summary',page,size,sort,dir,search,availability])", + "utils/stream-summaries.js fetchAllStreamSummaries (pages of 100; surface admin|live|lpr) used by LiveView, PlatesView, recordings/timeline/investigation pickers" + ] + }, + "legacy_full_list": { + "operation": "GET /api/streams (no summary param)", + "handler": "handle_get_streams legacy branch", + "auth": "rows require AUTHZ_LIVE_VIEW; expose_sensitive_config = AUTHZ_CAMERA_CONFIGURE per row", + "note": "Unbounded array of full stream objects (same field set as single GET). No current web/js caller sends /api/streams without summary=true; integration tests and external API clients may. Out of pilot but must not regress." + }, + "single_get": { + "operation": "GET /api/streams/{name}", + "handler": "handle_get_stream", + "auth": "AUTHZ_LIVE_VIEW on stream (httpd_authorize_stream_action_with_context: 401/403/404); expose_sensitive_config = stream_user_can_modify (AUTHZ_CAMERA_CONFIGURE)", + "response": "bare stream object (not wrapped)", + "ui_consumers": "none for GET (PUT/DELETE share the pattern)" + }, + "full_edit_detail": { + "operation": "GET /api/streams/{name}/full", + "handler": "handle_get_stream_full", + "auth": "same as single_get: viewers with live_view receive a redacted full object; 404 'Stream not found' checked before authorization (existence disclosure ordering).", + "response": "{stream:{...}} wrapper", + "fields": [ + "camera_uuid", + "location_uuid", + "name", + "url", + "enabled", + "streaming_enabled", + "playback_transport", + "eptz_config", + "width", + "height", + "fps", + "codec", + "priority", + "record", + "segment_duration", + "detection_based_recording", + "detection_model", + "detection_threshold (int percent = float*100)", + "detection_interval", + "pre_detection_buffer", + "post_detection_buffer", + "detection_object_filter", + "detection_object_filter_list", + "protocol (int)", + "record_audio", + "audio_voice_enhancement", + "isOnvif", + "backchannel_enabled", + "retention_days", + "detection_retention_days", + "max_storage_mb", + "tier_critical_multiplier", + "tier_important_multiplier", + "tier_ephemeral_multiplier", + "storage_priority", + "ptz_enabled", + "ptz_max_x", + "ptz_max_y", + "ptz_max_z", + "ptz_has_home", + "onvif_username", + "onvif_password", + "onvif_profile", + "onvif_port", + "record_on_schedule", + "recording_schedule (168 bools)", + "detection_record_on_schedule", + "detection_recording_schedule (168 bools)", + "tags", + "admin_url", + "privacy_mode", + "can_control_privacy", + "motion_trigger_source", + "go2rtc_source_override", + "sub_stream_url", + "has_sub_stream", + "detection_url", + "publish_url", + "status", + "error_message (only when status==Error and message non-empty)", + "go2rtc_hls_available" + ], + "role_variants": { + "configure_allowed (admin edit model)": "url = raw url unless separate ONVIF credentials are in use (is_onvif or onvif_username/password set) in which case credentials are stripped from url and surfaced via onvif_username/onvif_password (extracted from url if the fields are empty); admin_url, go2rtc_source_override, sub_stream_url, detection_url, publish_url, onvif_username, onvif_password are real values; can_control_privacy=true.", + "live_view_only (viewer redacted model)": "url always credential-stripped (empty string if stripping fails); onvif_username='' and onvif_password=''; admin_url, go2rtc_source_override, sub_stream_url, detection_url, publish_url = ''; has_sub_stream still reveals presence; can_control_privacy=false. Non-sensitive config (schedules, retention, detection settings, tags) remains visible." + }, + "ui_consumers": [ + "StreamsView.jsx:808 openEditStreamModal (queryKey ['stream-full', name], staleTime 0, raw fetch not fetchJSON => no 401 redirect/timeout/retry)", + "StreamsView.jsx:900 openCloneStreamModal (out of pilot)" + ] + }, + "update": { + "operation": "PUT /api/streams/{name}", + "handler": "handle_put_stream (src/web/api_handlers_streams_modify.c)", + "auth": "404 if unknown stream, then AUTHZ_CAMERA_CONFIGURE on stream (401/403) BEFORE body parse; 400 'Invalid JSON in request body'.", + "accepted_keys": [ + "url", + "enabled", + "enable_disabled", + "streaming_enabled", + "playback_transport", + "eptz_config", + "codec", + "priority", + "protocol", + "segment_duration", + "record", + "detection_based_recording", + "detection_model", + "detection_threshold", + "detection_interval", + "pre_detection_buffer", + "post_detection_buffer", + "detection_object_filter", + "detection_object_filter_list", + "record_audio", + "audio_voice_enhancement", + "isOnvif", + "backchannel_enabled", + "onvif_username", + "onvif_password", + "onvif_profile", + "onvif_port", + "retention_days", + "detection_retention_days", + "max_storage_mb", + "tier_critical_multiplier", + "tier_important_multiplier", + "tier_ephemeral_multiplier", + "storage_priority", + "ptz_enabled", + "ptz_max_x", + "ptz_max_y", + "ptz_max_z", + "ptz_has_home", + "record_on_schedule", + "recording_schedule", + "detection_record_on_schedule", + "detection_recording_schedule", + "tags", + "admin_url", + "motion_trigger_source", + "go2rtc_source_override", + "sub_stream_url", + "detection_url", + "publish_url", + "set_privacy_mode" + ], + "not_accepted": [ + "name (rename unsupported; name is the path key and UI strips it from the body)", + "is_deleted (sent by UI, ignored)" + ], + "validation_errors": [ + "400 playback_transport is invalid", + "400 ", + "400 retention_days must be between -1 and 365", + "400 detection_retention_days must be between -1 and 365", + "400 detection_url must use http, https, rtsp, or rtsps", + "413 detection_url exceeds size limit", + "400 publish_url destinations must be rtmp:// or rtmps:// URLs", + "413 publish_url exceeds size limit" + ], + "responses": { + "202": "{success:true, message:'Stream update request accepted and processing', onvif_status?, onvif_message?} - applied asynchronously by a worker task", + "200": "set_privacy_mode short-circuit: {success:true, privacy_mode:bool} (Live cells use this; not the edit form)" + }, + "ui_payload_builder": "StreamsView.jsx handleSubmit (~line 616): maps camelCase form state to snake_case body; always sends onvif_password (possibly '' for redacted forms); detection_threshold as int percent; recording schedules normalized to 168 bools; adds is_deleted:false when editing; mutation retries:1 timeout 15000; invalidates ['stream-full', name] and ['streams'].", + "ui_consumers": [ + "StreamsView.jsx:343 saveStreamMutation (edit)", + "StreamsView.jsx:484/532 enable (out of pilot: {enable_disabled:true, enabled:true})", + "HLSVideoCell/MSEVideoCell/WebRTCVideoCell set_privacy_mode (Live, out of pilot)" + ] + } + }, + "list_edit_option_dependencies": [ + { + "operation": "GET /api/client-config", + "handler": "handle_get_client_config (api_handlers_settings.c)", + "auth": "authenticated only (401)", + "used_fields": [ + "default_playback_transport (new-stream default)", + "audio_disabled (recordAudio default + modal audioDisabled)", + "webrtc_disabled/mse_disabled/hls_disabled (transportOfferings in StreamConfigModal)" + ], + "ui": "StreamsView.jsx:227 useQuery(['client-config'])", + "full_response_fields": [ + "go2rtc_enabled", + "web_auth_enabled", + "demo_mode", + "audio_disabled", + "auto_disabled", + "go2rtc_available", + "go2rtc_api_port", + "go2rtc_base_path", + "webrtc_disabled", + "hls_disabled", + "mse_disabled", + "default_playback_transport", + "go2rtc_force_native_hls", + "webrtc_connection_timeout_ms", + "webrtc_ice_recovery_timeout_ms", + "generate_thumbnails", + "thumbnails_per_recording" + ] + }, + { + "operation": "GET /api/detection/models", + "handler": "handle_get_detection_models (api_handlers_detection_models.c)", + "auth": "401 unauthenticated; 403 unless global AUTHZ_CAMERA_CONFIGURE or configure on >=1 camera", + "response": "{models:[{id,name,path,type,supported,description,unsupported_reason?,size?...}], litert_available, sod_available, count|message}; built-ins motion, api-detection, onvif listed first", + "ui": "StreamsView.jsx:221 useQuery(['detectionModels']); StreamConfigModal filters out id 'api-detection' (rendered as fixed option) and disables supported===false; refresh button invalidates the query" + }, + { + "operation": "GET /api/auth/verify", + "handler": "handle_auth_verify", + "auth": "skipAuthRedirect; demo mode returns demo_mode:true", + "used_fields": [ + "role (admin/user/viewer gating canModifyStreams)", + "demo_mode (shouldHideCredentials)" + ], + "ui": "StreamsView.jsx:58 validateSession()" + }, + { + "operation": "GET /api/streams/{name}/zones", + "handler": "handle_get_zones (api_handlers_zones.c)", + "auth": "AUTHZ_LIVE_VIEW", + "ui": "StreamConfigModal.jsx:336 when editing (raw fetch); ZoneEditor.jsx:53" + }, + { + "operation": "POST /api/streams/{name}/zones", + "handler": "handle_post_zones", + "auth": "AUTHZ_CAMERA_CONFIGURE", + "ui": "ZoneEditor.jsx:481 save (independent of stream PUT)" + }, + { + "operation": "GET /go2rtc/api/frame.jpeg?src={name}", + "handler": "go2rtc proxy thread", + "ui": "StreamCard.jsx:140 snapshot thumbnails (concurrency-limited), ZoneEditor.jsx:82/88 background frame" + } + ], + "out_of_pilot_streams_operations": [ + "POST /api/streams (create/clone, 201)", + "POST /api/streams/test (usePostMutation)", + "DELETE /api/streams/{name} (disable/soft delete, 202 {success, permanent:false, status:'accepted'})", + "DELETE /api/streams/{name}?permanent=true (permanent delete, 202)", + "PUT /api/streams/{name} {enable_disabled:true, enabled:true} (enable/bulk enable)", + "GET /api/onvif/devices, POST /api/onvif/discovery/discover, POST /api/onvif/device/profiles, POST /api/onvif/device/test, POST /api/onvif/device/claim, GET /api/settings (onvif_discovery_network)", + "POST /api/streams/{name}/refresh, GET|POST /api/streams/{name}/recording, PTZ/imaging/daynight/retention/detection-engines sub-resources (Live/other domains)" + ], + "contract_notes_for_T11": [ + "Viewer model must allow empty-string sensitive fields and must not require onvif_password/admin_url/sub_stream_url/detection_url/publish_url/go2rtc_source_override to be non-empty; admin model is distinguished by can_control_privacy=true (per-camera configure), not by role name.", + "detection_threshold is an integer percent on the wire (server stores float 0..1).", + "recording_schedule and detection_recording_schedule are fixed-length 168-element boolean arrays (hour-of-week).", + "retention_days and detection_retention_days range -1..365 (-1 = inherit/global). Tier multipliers are floats; storage_priority 1..10 is clamped client-side only.", + "protocol is numeric (0 TCP, 1 UDP); priority numeric; UI keeps them as strings in form state.", + "PUT returns 202 (async apply) except set_privacy_mode (200). GET /full wraps in {stream}; GET /{name} is unwrapped.", + "Stream name is the path key; must be percent-encoded (UI uses encodeURIComponent). Decoding happens in http_request_extract_path_param after routing.", + "Error envelope is {\"error\": \"\"} (http_response_set_json_error, src/web/request_response.c:282) for all statuses.", + "openEditStreamModal uses raw fetch for /full (no 401 redirect handling, no timeout) while the list uses fetchJSON via useQuery." + ] + } +} diff --git a/quality/application-inventory.json b/quality/application-inventory.json new file mode 100644 index 000000000..9425c8dfb --- /dev/null +++ b/quality/application-inventory.json @@ -0,0 +1,8163 @@ +{ + "schema_version": 1, + "task": "T2", + "generated_at": "2026-10-31", + "revision": "ff6a7d60", + "generator": "scratchpad gen.py (not committed); regex import/URL extraction + hand-reviewed overrides", + "summary": { + "web_js_files": 193, + "by_extension": { + ".js": 63, + ".jsx": 130 + }, + "test_files": 109, + "html_entrypoints": 11, + "domains": { + "shared-i18n": 2, + "shared-auth": 5, + "shared-data-query": 4, + "shared-ui-primitives": 7, + "shared-shell": 14, + "streams": 11, + "live": 49, + "recordings": 16, + "timeline": 10, + "investigation": 5, + "lpr": 3, + "settings": 14, + "system-health": 20, + "users-access": 16, + "fleet": 13, + "events": 4 + }, + "orphans": 4, + "extension_sensitive_tests": 11 + }, + "domains": { + "shared-i18n": "Locale loading, t()/useI18n, language selector. Cross-cutting; migrate first (T25 shared wave).", + "shared-auth": "Session validation, login, auth gate, forced password change, 401 redirect policy.", + "shared-data-query": "fetch wrappers, @preact-signals/query adapter, request queue, async action hook.", + "shared-ui-primitives": "Toast system, modal/dialog primitives, AsyncButton, loaders, image helper.", + "shared-shell": "Header/Footer/navigation, theme, setup wizard, sentry, generic utils and settings cache.", + "streams": "Streams admin list/edit pilot (T11/T19-T22) plus create/delete/bulk/ONVIF flows and ZoneEditor.", + "live": "Unified Live view (PR #691), video transport cells, PTZ/day-night/overlays, operator navigator/plans.", + "recordings": "Recordings list/grid/table, filters, batch delete/download, playback helpers.", + "timeline": "Timeline page, ruler/segments/player/cursor.", + "investigation": "Investigation workspace, bookmarks, export actions.", + "lpr": "License-plate search page.", + "settings": "Settings page and tabs (general, storage, detection, go2rtc, auth, MQTT, health, workspaces...).", + "system-health": "System page, logs, storage/network/system health, health view/incidents.", + "users-access": "Users, roles, access policy, API tokens, TOTP, audit history.", + "fleet": "Fleet inventory, organizations/tags/locations, collections, saved views.", + "events": "Event routing destinations and routes." + }, + "entrypoints": [ + { + "vite_input": "hls", + "html": "web/hls.html", + "module_scripts": [ + "web/js/pages/hls-page.jsx" + ], + "reachable_module_count": 76 + }, + { + "vite_input": "index", + "html": "web/index.html", + "module_scripts": [ + "web/js/pages/index-page.jsx" + ], + "reachable_module_count": 77 + }, + { + "vite_input": "investigation", + "html": "web/investigation.html", + "module_scripts": [ + "web/js/pages/investigation-page.jsx" + ], + "reachable_module_count": 31 + }, + { + "vite_input": "login", + "html": "web/login.html", + "module_scripts": [ + "web/js/pages/login-page.jsx" + ], + "reachable_module_count": 10 + }, + { + "vite_input": "plates", + "html": "web/plates.html", + "module_scripts": [ + "web/js/pages/plates-page.jsx" + ], + "reachable_module_count": 23 + }, + { + "vite_input": "recordings", + "html": "web/recordings.html", + "module_scripts": [ + "web/js/pages/recordings-page.jsx" + ], + "reachable_module_count": 42 + }, + { + "vite_input": "settings", + "html": "web/settings.html", + "module_scripts": [ + "web/js/pages/settings-page.jsx" + ], + "reachable_module_count": 41 + }, + { + "vite_input": "streams", + "html": "web/streams.html", + "module_scripts": [ + "web/js/pages/streams-page.jsx" + ], + "reachable_module_count": 50 + }, + { + "vite_input": "system", + "html": "web/system.html", + "module_scripts": [ + "web/js/pages/system-page.jsx" + ], + "reachable_module_count": 38 + }, + { + "vite_input": "timeline", + "html": "web/timeline.html", + "module_scripts": [ + "web/js/pages/timeline-page.jsx" + ], + "reachable_module_count": 42 + }, + { + "vite_input": "users", + "html": "web/users.html", + "module_scripts": [ + "web/js/pages/users-page.jsx" + ], + "reachable_module_count": 37 + } + ], + "generated_untracked_modules": [ + { + "path": "web/js/version.js", + "note": "gitignored, produced by scripts/extract_version.* ; imported by Header.jsx. Not in rg --files." + } + ], + "shared_dependencies": { + "i18n": { + "modules": [ + "web/js/i18n.js" + ], + "consumers": [ + "web/js/components/preact/AlwaysFullscreenToggle.jsx", + "web/js/components/preact/AsyncButton.jsx", + "web/js/components/preact/AuthGate.jsx", + "web/js/components/preact/BatchDeleteModal.jsx", + "web/js/components/preact/BatchDownloadModal.jsx", + "web/js/components/preact/DayNightControl.jsx", + "web/js/components/preact/DetectionOverlay.jsx", + "web/js/components/preact/EventRoutingView.jsx", + "web/js/components/preact/FisheyeEptzCanvas.jsx", + "web/js/components/preact/FleetView.jsx", + "web/js/components/preact/Footer.jsx", + "web/js/components/preact/GridPicker.jsx", + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/Header.jsx", + "web/js/components/preact/HealthView.jsx", + "web/js/components/preact/LiveDisplayModeToggle.jsx", + "web/js/components/preact/LiveSlideshowControl.jsx", + "web/js/components/preact/LiveTileStatus.jsx", + "web/js/components/preact/LiveView.jsx", + "web/js/components/preact/LoadingIndicator.jsx", + "web/js/components/preact/LoginView.jsx", + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/ManualRecordingButton.jsx", + "web/js/components/preact/MobileTileGestures.jsx", + "web/js/components/preact/PTZControls.jsx", + "web/js/components/preact/PictureInPictureButton.jsx", + "web/js/components/preact/PlaybackTransportCell.jsx", + "web/js/components/preact/RecordingsView.jsx", + "web/js/components/preact/SettingsView.jsx", + "web/js/components/preact/SetupWizard.jsx", + "web/js/components/preact/SnapshotManager.jsx", + "web/js/components/preact/StreamBulkActionModal.jsx", + "web/js/components/preact/StreamConfigModal.jsx", + "web/js/components/preact/StreamDeleteModal.jsx", + "web/js/components/preact/StreamsView.jsx", + "web/js/components/preact/SystemView.jsx", + "web/js/components/preact/ThemeCustomizer.jsx", + "web/js/components/preact/TileAudioButton.jsx", + "web/js/components/preact/UI.jsx", + "web/js/components/preact/UsersView.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx", + "web/js/components/preact/ZoneEditor.jsx", + "web/js/components/preact/common/LanguageSelector.jsx", + "web/js/components/preact/investigation/InvestigationView.jsx", + "web/js/components/preact/live/LiveBuildingPlan.jsx", + "web/js/components/preact/live/LiveOperatorNavigator.jsx", + "web/js/components/preact/lpr/PlatesView.jsx", + "web/js/components/preact/recordings/ActiveFilters.jsx", + "web/js/components/preact/recordings/FiltersSidebar.jsx", + "web/js/components/preact/recordings/PaginationControls.jsx", + "web/js/components/preact/recordings/RecordingsGrid.jsx", + "web/js/components/preact/recordings/RecordingsTable.jsx", + "web/js/components/preact/recordings/TagsOverlay.jsx", + "web/js/components/preact/recordings/recordingsAPI.jsx", + "web/js/components/preact/system/ClearLogsModal.jsx", + "web/js/components/preact/system/HealthIncidentHistory.jsx", + "web/js/components/preact/system/LogsView.jsx", + "web/js/components/preact/system/MemoryStorage.jsx", + "web/js/components/preact/system/NetworkInfo.jsx", + "web/js/components/preact/system/RestartModal.jsx", + "web/js/components/preact/system/StorageHealth.jsx", + "web/js/components/preact/system/StreamStorage.jsx", + "web/js/components/preact/system/StreamsInfo.jsx", + "web/js/components/preact/system/SystemControls.jsx", + "web/js/components/preact/system/SystemHealth.jsx", + "web/js/components/preact/system/SystemInfo.jsx", + "web/js/components/preact/system/VersionsTable.jsx", + "web/js/components/preact/system/WebServiceInfo.jsx", + "web/js/components/preact/timeline/CalendarPicker.jsx", + "web/js/components/preact/timeline/SpeedControls.jsx", + "web/js/components/preact/timeline/TimelineControls.jsx", + "web/js/components/preact/timeline/TimelineCursor.jsx", + "web/js/components/preact/timeline/TimelinePage.jsx", + "web/js/components/preact/timeline/TimelinePlayer.jsx", + "web/js/components/preact/timeline/TimelineSegments.jsx", + "web/js/components/preact/users/AccessPolicyModal.jsx", + "web/js/components/preact/users/AddUserModal.jsx", + "web/js/components/preact/users/ApiKeyModal.jsx", + "web/js/components/preact/users/AuditDecisionModes.jsx", + "web/js/components/preact/users/AuditHistoryModal.jsx", + "web/js/components/preact/users/DeleteUserModal.jsx", + "web/js/components/preact/users/EditUserModal.jsx", + "web/js/components/preact/users/RoleManagerModal.jsx", + "web/js/components/preact/users/TotpSetupModal.jsx", + "web/js/components/preact/users/UsersTable.jsx", + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/login-page.jsx", + "web/js/pages/plates-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/system-page.jsx", + "web/js/pages/timeline-page.jsx", + "web/js/pages/users-page.jsx", + "web/js/utils/batch-delete-status.js" + ], + "consumer_count": 97 + }, + "auth": { + "modules": [ + "web/js/utils/auth-utils.js", + "web/js/components/preact/AuthGate.jsx", + "web/js/components/preact/forcedPasswordChange.js" + ], + "consumers": [ + "web/js/components/preact/FleetView.jsx", + "web/js/components/preact/Header.jsx", + "web/js/components/preact/RecordingsView.jsx", + "web/js/components/preact/SettingsView.jsx", + "web/js/components/preact/StreamsView.jsx", + "web/js/components/preact/SystemView.jsx", + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/plates-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/system-page.jsx", + "web/js/pages/timeline-page.jsx", + "web/js/pages/users-page.jsx" + ], + "consumer_count": 16 + }, + "auth_failure_redirect": { + "modules": [ + "web/js/fetch-utils.js" + ], + "consumers": [ + "web/js/components/preact/lpr/PlatesView.jsx", + "web/js/components/preact/recordings/recordingsAPI.jsx", + "web/js/components/preact/system/LogsPoller.jsx", + "web/js/components/preact/users/AuditHistoryModal.jsx", + "web/js/query-client.js", + "web/js/utils/auth-utils.js", + "web/js/utils/settings-utils.js", + "web/js/utils/stream-summaries.js" + ], + "consumer_count": 8, + "note": "fetch-utils.js owns handleAuthenticationFailure()/401 redirect inside enhancedFetch/fetchJSON; every consumer of fetch-utils (direct or via query-client re-export of fetchJSON) inherits auth redirect behavior." + }, + "toast": { + "modules": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/Toast.jsx" + ], + "consumers": [ + "web/js/components/preact/BatchDeleteModal.jsx", + "web/js/components/preact/BatchDownloadModal.jsx", + "web/js/components/preact/DayNightControl.jsx", + "web/js/components/preact/DetectionOverlay.jsx", + "web/js/components/preact/EventRoutingView.jsx", + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/Header.jsx", + "web/js/components/preact/LiveView.jsx", + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/ManualRecordingButton.jsx", + "web/js/components/preact/MobileTileGestures.jsx", + "web/js/components/preact/PTZControls.jsx", + "web/js/components/preact/PictureInPictureButton.jsx", + "web/js/components/preact/RecordingsView.jsx", + "web/js/components/preact/SettingsView.jsx", + "web/js/components/preact/SetupWizard.jsx", + "web/js/components/preact/SnapshotManager.jsx", + "web/js/components/preact/StreamConfigModal.jsx", + "web/js/components/preact/StreamsView.jsx", + "web/js/components/preact/SystemView.jsx", + "web/js/components/preact/UI.jsx", + "web/js/components/preact/UsersView.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx", + "web/js/components/preact/events/EventDestinationEditor.jsx", + "web/js/components/preact/events/EventRouteEditor.jsx", + "web/js/components/preact/fleet/BulkOrganizeModal.jsx", + "web/js/components/preact/fleet/CollectionManager.jsx", + "web/js/components/preact/fleet/OrganizationManager.jsx", + "web/js/components/preact/fleet/SavedViewsBar.jsx", + "web/js/components/preact/live/LiveBuildingPlan.jsx", + "web/js/components/preact/live/LiveOperatorNavigator.jsx", + "web/js/components/preact/lpr/PlatesView.jsx", + "web/js/components/preact/recordings/TagsOverlay.jsx", + "web/js/components/preact/recordings/recordingsAPI.jsx", + "web/js/components/preact/settings/GeneralTab.jsx", + "web/js/components/preact/settings/StorageTab.jsx", + "web/js/components/preact/settings/WorkspacesTab.jsx", + "web/js/components/preact/timeline/SpeedControls.jsx", + "web/js/components/preact/timeline/TimelineControls.jsx", + "web/js/components/preact/timeline/TimelinePage.jsx", + "web/js/components/preact/timeline/TimelinePlayer.jsx", + "web/js/components/preact/users/AccessPolicyModal.jsx", + "web/js/components/preact/users/ApiKeyModal.jsx", + "web/js/components/preact/users/AuditDecisionModes.jsx", + "web/js/components/preact/users/AuditHistoryModal.jsx", + "web/js/components/preact/users/RoleManagerModal.jsx", + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/login-page.jsx", + "web/js/pages/plates-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/system-page.jsx", + "web/js/pages/timeline-page.jsx", + "web/js/pages/users-page.jsx" + ], + "consumer_count": 57, + "note": "Two toast modules exist. ToastContainer.jsx is the live system (rendered by every page). Toast.jsx (ToastProvider/useToast) has no importers in web/js or tests: orphan candidate for T25/T34." + }, + "modal": { + "modules": [ + "web/js/components/preact/common/ModalDialog.jsx", + "web/js/components/preact/UI.jsx" + ], + "consumers": [ + "web/js/components/preact/EventRoutingView.jsx", + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/RecordingsView.jsx", + "web/js/components/preact/SnapshotManager.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx", + "web/js/components/preact/ZoneEditor.jsx", + "web/js/components/preact/fleet/CollectionManager.jsx", + "web/js/components/preact/fleet/OrganizationManager.jsx", + "web/js/components/preact/fleet/SavedViewsBar.jsx", + "web/js/components/preact/live/LiveBuildingPlan.jsx", + "web/js/components/preact/live/LiveOperatorNavigator.jsx", + "web/js/components/preact/lpr/PlatesView.jsx", + "web/js/components/preact/settings/StorageTab.jsx", + "web/js/components/preact/timeline/TimelinePlayer.jsx", + "web/js/components/preact/users/AccessPolicyModal.jsx", + "web/js/components/preact/users/ApiKeyModal.jsx", + "web/js/components/preact/users/RoleManagerModal.jsx", + "web/js/pages/recordings-page.jsx" + ], + "consumer_count": 18, + "note": "UI.jsx re-exports ConfirmDialog from common/ModalDialog.jsx and owns ModalProvider/VideoModal/SnapshotPreviewModal plus imperative showVideoModal/showSnapshotPreview (dynamic import of preact)." + }, + "zone_editor": { + "modules": [ + "web/js/components/preact/ZoneEditor.jsx", + "web/js/utils/zone-editor-geometry.js" + ], + "consumers": [ + "web/js/components/preact/StreamConfigModal.jsx" + ], + "consumer_count": 1, + "note": "ZoneEditor is only consumed by StreamConfigModal (Streams edit). It loads/saves /api/streams/{name}/zones and snapshot frames via /go2rtc/api/frame.jpeg. DetectionOverlay (Live) reads the same zones route independently. zone-editor-geometry.js is shared with DetectionOverlay conventions (see zoneEditorGeometry.spec.js)." + }, + "query": { + "modules": [ + "web/js/query-client.js" + ], + "consumers": [ + "web/js/components/preact/BatchDeleteModal.jsx", + "web/js/components/preact/EventRoutingView.jsx", + "web/js/components/preact/FleetView.jsx", + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/Header.jsx", + "web/js/components/preact/HealthView.jsx", + "web/js/components/preact/LiveView.jsx", + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/RecordingsView.jsx", + "web/js/components/preact/SettingsView.jsx", + "web/js/components/preact/StreamsView.jsx", + "web/js/components/preact/SystemView.jsx", + "web/js/components/preact/UsersView.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx", + "web/js/components/preact/fleet/BulkOrganizeModal.jsx", + "web/js/components/preact/fleet/CollectionManager.jsx", + "web/js/components/preact/fleet/CollectionSelectorBuilder.jsx", + "web/js/components/preact/fleet/OrganizationManager.jsx", + "web/js/components/preact/fleet/SavedViewsBar.jsx", + "web/js/components/preact/fleet/StaticCollectionMembers.jsx", + "web/js/components/preact/fleet/collectionMembership.js", + "web/js/components/preact/investigation/InvestigationActions.jsx", + "web/js/components/preact/investigation/InvestigationBookmarks.jsx", + "web/js/components/preact/investigation/InvestigationView.jsx", + "web/js/components/preact/live/LiveBuildingPlan.jsx", + "web/js/components/preact/live/LiveOperatorNavigator.jsx", + "web/js/components/preact/live/cameraFavorites.js", + "web/js/components/preact/lpr/PlatesView.jsx", + "web/js/components/preact/recordings/recordingsAPI.jsx", + "web/js/components/preact/settings/Go2rtcTab.jsx", + "web/js/components/preact/settings/StorageTab.jsx", + "web/js/components/preact/settings/WorkspacesTab.jsx", + "web/js/components/preact/system/HealthIncidentHistory.jsx", + "web/js/components/preact/system/StorageHealth.jsx", + "web/js/components/preact/system/SystemHealth.jsx", + "web/js/components/preact/system/WebServiceInfo.jsx", + "web/js/components/preact/timeline/TimelinePage.jsx", + "web/js/components/preact/users/AccessPolicyModal.jsx", + "web/js/components/preact/users/ApiKeyModal.jsx", + "web/js/components/preact/users/AuditDecisionModes.jsx", + "web/js/components/preact/users/AuditHistoryModal.jsx", + "web/js/components/preact/users/RoleManagerModal.jsx", + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/login-page.jsx", + "web/js/pages/plates-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/system-page.jsx", + "web/js/pages/timeline-page.jsx", + "web/js/pages/users-page.jsx" + ], + "consumer_count": 53, + "note": "query-client.js wraps @preact-signals/query: useQuery(key,url,fetchOpts,queryOpts), useMutation, usePost/Put/DeleteMutation(url), QueryClientProvider/queryClient singleton, and re-exports fetchJSON. Every page entry wraps its tree in QueryClientProvider." + } + }, + "files": [ + { + "path": "web/js/components/preact/AlwaysFullscreenToggle.jsx", + "ext": ".jsx", + "lines": 25, + "kind": "component", + "proposed_domain_owner": "live", + "imports": [ + "web/js/i18n.js" + ], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/LiveView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/AsyncButton.jsx", + "ext": ".jsx", + "lines": 297, + "kind": "component", + "proposed_domain_owner": "shared-ui-primitives", + "imports": [ + "web/js/hooks/useAsyncAction.js", + "web/js/i18n.js" + ], + "external_imports": [ + "preact", + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/RecordingsView.jsx", + "web/js/components/preact/SettingsView.jsx", + "web/js/components/preact/StreamBulkActionModal.jsx", + "web/js/components/preact/StreamCard.jsx", + "web/js/components/preact/StreamConfigModal.jsx", + "web/js/components/preact/StreamDeleteModal.jsx", + "web/js/components/preact/recordings/FiltersSidebar.jsx", + "web/js/components/preact/settings/AuthTab.jsx", + "web/js/components/preact/system/RestartModal.jsx", + "web/js/components/preact/users/AddUserModal.jsx", + "web/js/components/preact/users/DeleteUserModal.jsx", + "web/js/components/preact/users/EditUserModal.jsx", + "web/js/components/preact/users/TotpSetupModal.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/plates-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/system-page.jsx", + "web/js/pages/timeline-page.jsx", + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [], + "tests": [], + "consumed_by_other_domains": [ + "recordings", + "settings", + "streams", + "system-health", + "users-access" + ] + }, + { + "path": "web/js/components/preact/AuthGate.jsx", + "ext": ".jsx", + "lines": 171, + "kind": "component", + "proposed_domain_owner": "shared-auth", + "imports": [ + "web/js/components/preact/forcedPasswordChange.js", + "web/js/i18n.js", + "web/js/utils/auth-utils.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/plates-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/system-page.jsx", + "web/js/pages/timeline-page.jsx", + "web/js/pages/users-page.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/plates-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/system-page.jsx", + "web/js/pages/timeline-page.jsx", + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "auth" + ], + "ui_operation_ids": [ + "UI-001" + ], + "tests": [], + "consumed_by_other_domains": [ + "investigation", + "live", + "lpr", + "recordings", + "settings", + "streams", + "system-health", + "timeline", + "users-access" + ] + }, + { + "path": "web/js/components/preact/BatchDeleteModal.jsx", + "ext": ".jsx", + "lines": 505, + "kind": "component", + "proposed_domain_owner": "recordings", + "imports": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/i18n.js", + "web/js/query-client.js", + "web/js/utils/batch-delete-status.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/pages/recordings-page.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/recordings-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "toast", + "query" + ], + "ui_operation_ids": [ + "UI-002", + "UI-003" + ], + "tests": [] + }, + { + "path": "web/js/components/preact/BatchDownloadModal.jsx", + "ext": ".jsx", + "lines": 215, + "kind": "component", + "proposed_domain_owner": "recordings", + "imports": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/i18n.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/RecordingsView.jsx", + "web/js/components/preact/timeline/TimelinePage.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/recordings-page.jsx", + "web/js/pages/timeline-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "toast" + ], + "ui_operation_ids": [ + "UI-004", + "UI-005", + "UI-006", + "UI-007" + ], + "tests": [], + "i18n_literal_baseline_key": "preact/BatchDownloadModal.jsx", + "i18n_literal_baseline_count": 1, + "consumed_by_other_domains": [ + "timeline" + ] + }, + { + "path": "web/js/components/preact/DayNightControl.jsx", + "ext": ".jsx", + "lines": 181, + "kind": "component", + "proposed_domain_owner": "live", + "imports": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/i18n.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "toast" + ], + "ui_operation_ids": [ + "UI-008", + "UI-009" + ], + "tests": [] + }, + { + "path": "web/js/components/preact/DetectionOverlay.jsx", + "ext": ".jsx", + "lines": 318, + "kind": "component", + "proposed_domain_owner": "live", + "imports": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/useLiveDisplayMode.js", + "web/js/i18n.js", + "web/js/utils/date-utils.js", + "web/js/utils/detection-polling.js" + ], + "external_imports": [ + "preact/compat", + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "toast" + ], + "ui_operation_ids": [ + "UI-010" + ], + "tests": [] + }, + { + "path": "web/js/components/preact/EventRoutingView.jsx", + "ext": ".jsx", + "lines": 226, + "kind": "component", + "proposed_domain_owner": "events", + "imports": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/common/ModalDialog.jsx", + "web/js/components/preact/events/EventDestinationEditor.jsx", + "web/js/components/preact/events/EventRouteEditor.jsx", + "web/js/components/preact/events/eventRouting.js", + "web/js/i18n.js", + "web/js/query-client.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/StreamsView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/streams-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "toast", + "modal", + "query" + ], + "ui_operation_ids": [ + "UI-011", + "UI-012", + "UI-013", + "UI-014", + "UI-015", + "UI-016", + "UI-017", + "UI-018", + "UI-019", + "UI-020", + "UI-021", + "UI-022", + "UI-023", + "UI-024", + "UI-025" + ], + "tests": [], + "i18n_literal_baseline_key": "preact/EventRoutingView.jsx", + "i18n_literal_baseline_count": 1, + "consumed_by_other_domains": [ + "streams" + ] + }, + { + "path": "web/js/components/preact/FisheyeEptzCanvas.jsx", + "ext": ".jsx", + "lines": 506, + "kind": "component", + "proposed_domain_owner": "live", + "imports": [ + "web/js/i18n.js", + "web/js/utils/eptz-config.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx", + "web/js/components/preact/investigation/InvestigationView.jsx", + "web/js/components/preact/timeline/TimelinePlayer.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/timeline-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [], + "tests": [], + "i18n_literal_baseline_key": "preact/FisheyeEptzCanvas.jsx", + "i18n_literal_baseline_count": 1, + "consumed_by_other_domains": [ + "investigation", + "timeline" + ] + }, + { + "path": "web/js/components/preact/FleetView.jsx", + "ext": ".jsx", + "lines": 421, + "kind": "component", + "proposed_domain_owner": "fleet", + "imports": [ + "web/js/components/preact/LoadingIndicator.jsx", + "web/js/components/preact/fleet/BulkOrganizeModal.jsx", + "web/js/components/preact/fleet/CollectionManager.jsx", + "web/js/components/preact/fleet/FleetFilters.jsx", + "web/js/components/preact/fleet/FleetTable.jsx", + "web/js/components/preact/fleet/OrganizationManager.jsx", + "web/js/components/preact/fleet/SavedViewsBar.jsx", + "web/js/components/preact/fleet/fleetOrganization.js", + "web/js/components/preact/fleet/fleetQuery.js", + "web/js/i18n.js", + "web/js/query-client.js", + "web/js/utils/auth-utils.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/StreamsView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/streams-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "auth", + "query" + ], + "ui_operation_ids": [ + "UI-026", + "UI-027", + "UI-028", + "UI-029", + "UI-030" + ], + "tests": [], + "consumed_by_other_domains": [ + "streams" + ] + }, + { + "path": "web/js/components/preact/Footer.jsx", + "ext": ".jsx", + "lines": 36, + "kind": "component", + "proposed_domain_owner": "shared-shell", + "imports": [ + "web/js/i18n.js", + "web/js/utils/date-utils.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/plates-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/system-page.jsx", + "web/js/pages/timeline-page.jsx", + "web/js/pages/users-page.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/plates-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/system-page.jsx", + "web/js/pages/timeline-page.jsx", + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [], + "tests": [ + "web/tests/i18n.spec.js" + ], + "i18n_literal_baseline_key": "preact/Footer.jsx", + "i18n_literal_baseline_count": 1, + "consumed_by_other_domains": [ + "investigation", + "live", + "lpr", + "recordings", + "settings", + "streams", + "system-health", + "timeline", + "users-access" + ] + }, + { + "path": "web/js/components/preact/FullscreenManager.jsx", + "ext": ".jsx", + "lines": 526, + "kind": "component", + "proposed_domain_owner": "live", + "imports": [ + "web/js/components/preact/fullscreenApi.js", + "web/js/components/preact/mobileLiveGestures.js" + ], + "external_imports": [ + "preact/hooks", + "tinykeys" + ], + "imported_by": [ + "web/js/components/preact/LiveView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/GridPicker.jsx", + "ext": ".jsx", + "lines": 147, + "kind": "component", + "proposed_domain_owner": "live", + "imports": [ + "web/js/i18n.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/LiveView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/HLSVideoCell.jsx", + "ext": ".jsx", + "lines": 1376, + "kind": "component", + "proposed_domain_owner": "live", + "imports": [ + "web/js/components/preact/DayNightControl.jsx", + "web/js/components/preact/DetectionOverlay.jsx", + "web/js/components/preact/FisheyeEptzCanvas.jsx", + "web/js/components/preact/LiveTileStatus.jsx", + "web/js/components/preact/LoadingIndicator.jsx", + "web/js/components/preact/ManualRecordingButton.jsx", + "web/js/components/preact/MobileTileGestures.jsx", + "web/js/components/preact/PTZControls.jsx", + "web/js/components/preact/PictureInPictureButton.jsx", + "web/js/components/preact/SnapshotManager.jsx", + "web/js/components/preact/TileAudioButton.jsx", + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/UI.jsx", + "web/js/components/preact/recordings/formatUtils.js", + "web/js/components/preact/useAlwaysFullscreenOnTap.js", + "web/js/components/preact/useAutoRetry.js", + "web/js/components/preact/useVideoZoom.js", + "web/js/i18n.js", + "web/js/query-client.js", + "web/js/utils/date-utils.js", + "web/js/utils/eptz-config.js", + "web/js/utils/navigation-utils.js", + "web/js/utils/player-telemetry.js", + "web/js/utils/settings-utils.js", + "web/js/utils/stream-connection-gate.js" + ], + "external_imports": [ + "hls.js", + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/PlaybackTransportCell.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "toast", + "modal", + "query" + ], + "ui_operation_ids": [ + "UI-031", + "UI-032", + "UI-033", + "UI-034", + "UI-035", + "UI-036", + "UI-037", + "UI-296", + "UI-297" + ], + "tests": [], + "i18n_literal_baseline_key": "preact/HLSVideoCell.jsx", + "i18n_literal_baseline_count": 3 + }, + { + "path": "web/js/components/preact/Header.jsx", + "ext": ".jsx", + "lines": 420, + "kind": "component", + "proposed_domain_owner": "shared-shell", + "imports": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/common/LanguageSelector.jsx", + "web/js/components/preact/users/EditUserModal.jsx", + "web/js/i18n.js", + "web/js/query-client.js", + "web/js/utils/auth-utils.js", + "web/js/utils/navigation-utils.js", + "web/js/utils/settings-utils.js", + "web/js/version.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/plates-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/system-page.jsx", + "web/js/pages/timeline-page.jsx", + "web/js/pages/users-page.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/plates-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/system-page.jsx", + "web/js/pages/timeline-page.jsx", + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "auth", + "toast", + "query" + ], + "ui_operation_ids": [ + "UI-038", + "UI-039" + ], + "tests": [], + "i18n_literal_baseline_key": "preact/Header.jsx", + "i18n_literal_baseline_count": 2, + "consumed_by_other_domains": [ + "investigation", + "live", + "lpr", + "recordings", + "settings", + "streams", + "system-health", + "timeline", + "users-access" + ] + }, + { + "path": "web/js/components/preact/HealthView.jsx", + "ext": ".jsx", + "lines": 253, + "kind": "component", + "proposed_domain_owner": "system-health", + "imports": [ + "web/js/components/preact/health/Sparkline.jsx", + "web/js/i18n.js", + "web/js/query-client.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/StreamsView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/streams-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "query" + ], + "ui_operation_ids": [ + "UI-040", + "UI-041" + ], + "tests": [], + "i18n_literal_baseline_key": "preact/HealthView.jsx", + "i18n_literal_baseline_count": 1, + "consumed_by_other_domains": [ + "streams" + ] + }, + { + "path": "web/js/components/preact/LiveDisplayModeToggle.jsx", + "ext": ".jsx", + "lines": 71, + "kind": "component", + "proposed_domain_owner": "live", + "imports": [ + "web/js/components/preact/useLiveDisplayMode.js", + "web/js/i18n.js" + ], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/LiveView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/LiveSlideshowControl.jsx", + "ext": ".jsx", + "lines": 48, + "kind": "component", + "proposed_domain_owner": "live", + "imports": [ + "web/js/components/preact/useLiveSlideshow.js", + "web/js/i18n.js" + ], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/LiveView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [], + "tests": [ + "web/tests/liveSlideshowControl.spec.js" + ] + }, + { + "path": "web/js/components/preact/LiveTileStatus.jsx", + "ext": ".jsx", + "lines": 99, + "kind": "component", + "proposed_domain_owner": "live", + "imports": [ + "web/js/components/preact/liveTileStatus.js", + "web/js/i18n.js" + ], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/LiveView.jsx", + "ext": ".jsx", + "lines": 1096, + "kind": "component", + "proposed_domain_owner": "live", + "imports": [ + "web/js/components/preact/AlwaysFullscreenToggle.jsx", + "web/js/components/preact/FullscreenManager.jsx", + "web/js/components/preact/GridPicker.jsx", + "web/js/components/preact/LiveDisplayModeToggle.jsx", + "web/js/components/preact/LiveSlideshowControl.jsx", + "web/js/components/preact/PlaybackTransportCell.jsx", + "web/js/components/preact/SnapshotManager.jsx", + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/fleet/collectionMembership.js", + "web/js/components/preact/live/LiveBuildingPlan.jsx", + "web/js/components/preact/live/LiveOperatorNavigator.jsx", + "web/js/components/preact/live/cameraFavorites.js", + "web/js/components/preact/live/liveOperator.js", + "web/js/components/preact/mobileLiveGestures.js", + "web/js/components/preact/useAlwaysFullscreenOnTap.js", + "web/js/components/preact/useCameraOrder.js", + "web/js/components/preact/useLiveDisplayMode.js", + "web/js/components/preact/useLiveSlideshow.js", + "web/js/components/preact/usePullToRefresh.js", + "web/js/i18n.js", + "web/js/query-client.js", + "web/js/utils/live-view-url.js", + "web/js/utils/settings-utils.js", + "web/js/utils/stream-summaries.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "toast", + "query" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/LoadingIndicator.jsx", + "ext": ".jsx", + "lines": 87, + "kind": "component", + "proposed_domain_owner": "shared-ui-primitives", + "imports": [ + "web/js/i18n.js" + ], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/FleetView.jsx", + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/RecordingsView.jsx", + "web/js/components/preact/SettingsView.jsx", + "web/js/components/preact/StreamsView.jsx", + "web/js/components/preact/SystemView.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx", + "web/js/components/preact/investigation/InvestigationView.jsx", + "web/js/components/preact/timeline/TimelinePage.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/system-page.jsx", + "web/js/pages/timeline-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [], + "tests": [], + "consumed_by_other_domains": [ + "fleet", + "investigation", + "live", + "recordings", + "settings", + "streams", + "system-health", + "timeline" + ] + }, + { + "path": "web/js/components/preact/LoginView.jsx", + "ext": ".jsx", + "lines": 455, + "kind": "component", + "proposed_domain_owner": "shared-auth", + "imports": [ + "web/js/components/preact/common/LanguageSelector.jsx", + "web/js/i18n.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/pages/login-page.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/login-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [ + "UI-042", + "UI-043", + "UI-044", + "UI-045" + ], + "tests": [], + "i18n_literal_baseline_key": "preact/LoginView.jsx", + "i18n_literal_baseline_count": 1 + }, + { + "path": "web/js/components/preact/MSEVideoCell.jsx", + "ext": ".jsx", + "lines": 1232, + "kind": "component", + "proposed_domain_owner": "live", + "imports": [ + "web/js/components/preact/DayNightControl.jsx", + "web/js/components/preact/DetectionOverlay.jsx", + "web/js/components/preact/FisheyeEptzCanvas.jsx", + "web/js/components/preact/LiveTileStatus.jsx", + "web/js/components/preact/LoadingIndicator.jsx", + "web/js/components/preact/ManualRecordingButton.jsx", + "web/js/components/preact/MobileTileGestures.jsx", + "web/js/components/preact/PTZControls.jsx", + "web/js/components/preact/PictureInPictureButton.jsx", + "web/js/components/preact/SnapshotManager.jsx", + "web/js/components/preact/TileAudioButton.jsx", + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/recordings/formatUtils.js", + "web/js/components/preact/useAlwaysFullscreenOnTap.js", + "web/js/components/preact/useAutoRetry.js", + "web/js/components/preact/useVideoZoom.js", + "web/js/i18n.js", + "web/js/query-client.js", + "web/js/utils/date-utils.js", + "web/js/utils/eptz-config.js", + "web/js/utils/live-video-errors.js", + "web/js/utils/navigation-utils.js", + "web/js/utils/player-telemetry.js", + "web/js/utils/settings-utils.js", + "web/js/utils/stream-connection-gate.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/PlaybackTransportCell.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "toast", + "query" + ], + "ui_operation_ids": [ + "UI-046", + "UI-047", + "UI-048" + ], + "tests": [], + "i18n_literal_baseline_key": "preact/MSEVideoCell.jsx", + "i18n_literal_baseline_count": 2 + }, + { + "path": "web/js/components/preact/ManualRecordingButton.jsx", + "ext": ".jsx", + "lines": 100, + "kind": "component", + "proposed_domain_owner": "live", + "imports": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/i18n.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "toast" + ], + "ui_operation_ids": [ + "UI-049" + ], + "tests": [] + }, + { + "path": "web/js/components/preact/MobileTileGestures.jsx", + "ext": ".jsx", + "lines": 262, + "kind": "component", + "proposed_domain_owner": "live", + "imports": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/mobileLiveGestures.js", + "web/js/i18n.js", + "web/js/utils/date-utils.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "toast" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/PTZControls.jsx", + "ext": ".jsx", + "lines": 426, + "kind": "component", + "proposed_domain_owner": "live", + "imports": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/ptzActions.js", + "web/js/i18n.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "toast" + ], + "ui_operation_ids": [ + "UI-050", + "UI-051", + "UI-052", + "UI-053" + ], + "tests": [] + }, + { + "path": "web/js/components/preact/PictureInPictureButton.jsx", + "ext": ".jsx", + "lines": 62, + "kind": "component", + "proposed_domain_owner": "live", + "imports": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/pictureInPicture.js", + "web/js/i18n.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "toast" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/PlaybackTransportCell.jsx", + "ext": ".jsx", + "lines": 103, + "kind": "component", + "proposed_domain_owner": "live", + "imports": [ + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx", + "web/js/i18n.js", + "web/js/utils/playback-transport.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/LiveView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/RecordingsView.jsx", + "ext": ".jsx", + "lines": 1216, + "kind": "component", + "proposed_domain_owner": "recordings", + "imports": [ + "web/js/components/preact/AsyncButton.jsx", + "web/js/components/preact/BatchDownloadModal.jsx", + "web/js/components/preact/LoadingIndicator.jsx", + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/UI.jsx", + "web/js/components/preact/recordings/ActiveFilters.jsx", + "web/js/components/preact/recordings/FiltersSidebar.jsx", + "web/js/components/preact/recordings/PaginationControls.jsx", + "web/js/components/preact/recordings/RecordingsGrid.jsx", + "web/js/components/preact/recordings/RecordingsTable.jsx", + "web/js/components/preact/recordings/formatUtils.js", + "web/js/components/preact/recordings/recordingsAPI.jsx", + "web/js/components/preact/recordings/urlUtils.js", + "web/js/components/preact/usePullToRefresh.js", + "web/js/i18n.js", + "web/js/query-client.js", + "web/js/request-queue.js", + "web/js/utils/auth-utils.js", + "web/js/utils/date-utils.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/pages/recordings-page.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/recordings-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "auth", + "toast", + "modal", + "query" + ], + "ui_operation_ids": [ + "UI-054", + "UI-055", + "UI-056", + "UI-057", + "UI-058" + ], + "tests": [] + }, + { + "path": "web/js/components/preact/SettingsView.jsx", + "ext": ".jsx", + "lines": 944, + "kind": "component", + "proposed_domain_owner": "settings", + "imports": [ + "web/js/components/preact/AsyncButton.jsx", + "web/js/components/preact/LoadingIndicator.jsx", + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/settings/AdvancedTab.jsx", + "web/js/components/preact/settings/AppearanceTab.jsx", + "web/js/components/preact/settings/AuthTab.jsx", + "web/js/components/preact/settings/DetectionTab.jsx", + "web/js/components/preact/settings/GeneralTab.jsx", + "web/js/components/preact/settings/Go2rtcTab.jsx", + "web/js/components/preact/settings/HealthTab.jsx", + "web/js/components/preact/settings/MqttTab.jsx", + "web/js/components/preact/settings/StorageTab.jsx", + "web/js/components/preact/settings/StreamsDefaultsTab.jsx", + "web/js/components/preact/settings/WorkspacesTab.jsx", + "web/js/i18n.js", + "web/js/query-client.js", + "web/js/utils/auth-utils.js", + "web/js/utils/date-utils.js", + "web/js/utils/reduceMotion.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/pages/settings-page.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/settings-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "auth", + "toast", + "query" + ], + "ui_operation_ids": [ + "UI-059", + "UI-060", + "UI-061", + "UI-062", + "UI-063", + "UI-064" + ], + "tests": [] + }, + { + "path": "web/js/components/preact/SetupWizard.jsx", + "ext": ".jsx", + "lines": 340, + "kind": "component", + "proposed_domain_owner": "shared-shell", + "imports": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/i18n.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/pages/index-page.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "toast" + ], + "ui_operation_ids": [ + "UI-065", + "UI-066", + "UI-067", + "UI-068", + "UI-069" + ], + "tests": [], + "i18n_literal_baseline_key": "preact/SetupWizard.jsx", + "i18n_literal_baseline_count": 2, + "consumed_by_other_domains": [ + "live" + ] + }, + { + "path": "web/js/components/preact/SnapshotManager.jsx", + "ext": ".jsx", + "lines": 267, + "kind": "component", + "proposed_domain_owner": "live", + "imports": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/UI.jsx", + "web/js/i18n.js", + "web/js/utils/date-utils.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/LiveView.jsx", + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "toast", + "modal" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/StreamBulkActionModal.jsx", + "ext": ".jsx", + "lines": 132, + "kind": "component", + "proposed_domain_owner": "streams", + "imports": [ + "web/js/components/preact/AsyncButton.jsx", + "web/js/i18n.js" + ], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/StreamsView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/streams-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/StreamCard.jsx", + "ext": ".jsx", + "lines": 540, + "kind": "component", + "proposed_domain_owner": "streams", + "imports": [ + "web/js/components/preact/AsyncButton.jsx" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/StreamsView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/streams-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [ + "UI-070" + ], + "tests": [], + "i18n_literal_baseline_key": "preact/StreamCard.jsx", + "i18n_literal_baseline_count": 2 + }, + { + "path": "web/js/components/preact/StreamConfigModal.jsx", + "ext": ".jsx", + "lines": 1736, + "kind": "component", + "proposed_domain_owner": "streams", + "imports": [ + "web/js/components/preact/AsyncButton.jsx", + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/ZoneEditor.jsx", + "web/js/i18n.js", + "web/js/utils/url-utils.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/StreamsView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/streams-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "toast", + "zone_editor" + ], + "ui_operation_ids": [ + "UI-071" + ], + "tests": [], + "i18n_literal_baseline_key": "preact/StreamConfigModal.jsx", + "i18n_literal_baseline_count": 12 + }, + { + "path": "web/js/components/preact/StreamDeleteModal.jsx", + "ext": ".jsx", + "lines": 159, + "kind": "component", + "proposed_domain_owner": "streams", + "imports": [ + "web/js/components/preact/AsyncButton.jsx", + "web/js/i18n.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/StreamsView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/streams-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/StreamsView.jsx", + "ext": ".jsx", + "lines": 2070, + "kind": "component", + "proposed_domain_owner": "streams", + "imports": [ + "web/js/components/preact/EventRoutingView.jsx", + "web/js/components/preact/FleetView.jsx", + "web/js/components/preact/HealthView.jsx", + "web/js/components/preact/LoadingIndicator.jsx", + "web/js/components/preact/StreamBulkActionModal.jsx", + "web/js/components/preact/StreamCard.jsx", + "web/js/components/preact/StreamConfigModal.jsx", + "web/js/components/preact/StreamDeleteModal.jsx", + "web/js/components/preact/ToastContainer.jsx", + "web/js/i18n.js", + "web/js/query-client.js", + "web/js/utils/auth-utils.js", + "web/js/utils/eptz-config.js", + "web/js/utils/stream-availability.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/pages/streams-page.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/streams-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "auth", + "toast", + "query" + ], + "ui_operation_ids": [ + "UI-072", + "UI-073", + "UI-074", + "UI-075", + "UI-076", + "UI-077", + "UI-078", + "UI-079", + "UI-080", + "UI-081", + "UI-082", + "UI-083", + "UI-084", + "UI-085", + "UI-086", + "UI-087", + "UI-088", + "UI-089", + "UI-090", + "UI-091" + ], + "tests": [ + "web/tests/streamAvailability.spec.js" + ], + "i18n_literal_baseline_key": "preact/StreamsView.jsx", + "i18n_literal_baseline_count": 3 + }, + { + "path": "web/js/components/preact/SystemView.jsx", + "ext": ".jsx", + "lines": 392, + "kind": "component", + "proposed_domain_owner": "system-health", + "imports": [ + "web/js/components/preact/LoadingIndicator.jsx", + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/system/ClearLogsModal.jsx", + "web/js/components/preact/system/LogsPoller.jsx", + "web/js/components/preact/system/LogsView.jsx", + "web/js/components/preact/system/MemoryStorage.jsx", + "web/js/components/preact/system/NetworkInfo.jsx", + "web/js/components/preact/system/StorageHealth.jsx", + "web/js/components/preact/system/StreamStorage.jsx", + "web/js/components/preact/system/StreamsInfo.jsx", + "web/js/components/preact/system/SystemControls.jsx", + "web/js/components/preact/system/SystemHealth.jsx", + "web/js/components/preact/system/SystemInfo.jsx", + "web/js/components/preact/system/SystemUtils.js", + "web/js/components/preact/system/VersionsTable.jsx", + "web/js/components/preact/system/WebServiceInfo.jsx", + "web/js/i18n.js", + "web/js/query-client.js", + "web/js/utils/auth-utils.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/pages/system-page.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/system-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "auth", + "toast", + "query" + ], + "ui_operation_ids": [ + "UI-092", + "UI-093", + "UI-094" + ], + "tests": [] + }, + { + "path": "web/js/components/preact/ThemeCustomizer.jsx", + "ext": ".jsx", + "lines": 260, + "kind": "component", + "proposed_domain_owner": "shared-shell", + "imports": [ + "web/js/i18n.js", + "web/js/utils/theme-init.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/settings/AppearanceTab.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/settings-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [], + "tests": [], + "consumed_by_other_domains": [ + "settings" + ] + }, + { + "path": "web/js/components/preact/TileAudioButton.jsx", + "ext": ".jsx", + "lines": 45, + "kind": "component", + "proposed_domain_owner": "live", + "imports": [ + "web/js/i18n.js" + ], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/MSEVideoCell.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/Toast.jsx", + "ext": ".jsx", + "lines": 392, + "kind": "component", + "proposed_domain_owner": "shared-ui-primitives", + "imports": [ + "web/js/utils/date-utils.js" + ], + "external_imports": [ + "preact", + "preact/hooks" + ], + "imported_by": [], + "reachable_from_entries": [], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [], + "orphan": true + }, + { + "path": "web/js/components/preact/ToastContainer.jsx", + "ext": ".jsx", + "lines": 181, + "kind": "component", + "proposed_domain_owner": "shared-ui-primitives", + "imports": [ + "web/js/utils/date-utils.js" + ], + "external_imports": [ + "preact/compat", + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/BatchDeleteModal.jsx", + "web/js/components/preact/BatchDownloadModal.jsx", + "web/js/components/preact/DayNightControl.jsx", + "web/js/components/preact/DetectionOverlay.jsx", + "web/js/components/preact/EventRoutingView.jsx", + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/Header.jsx", + "web/js/components/preact/LiveView.jsx", + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/ManualRecordingButton.jsx", + "web/js/components/preact/MobileTileGestures.jsx", + "web/js/components/preact/PTZControls.jsx", + "web/js/components/preact/PictureInPictureButton.jsx", + "web/js/components/preact/RecordingsView.jsx", + "web/js/components/preact/SettingsView.jsx", + "web/js/components/preact/SetupWizard.jsx", + "web/js/components/preact/SnapshotManager.jsx", + "web/js/components/preact/StreamConfigModal.jsx", + "web/js/components/preact/StreamsView.jsx", + "web/js/components/preact/SystemView.jsx", + "web/js/components/preact/UI.jsx", + "web/js/components/preact/UsersView.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx", + "web/js/components/preact/events/EventDestinationEditor.jsx", + "web/js/components/preact/events/EventRouteEditor.jsx", + "web/js/components/preact/fleet/BulkOrganizeModal.jsx", + "web/js/components/preact/fleet/CollectionManager.jsx", + "web/js/components/preact/fleet/OrganizationManager.jsx", + "web/js/components/preact/fleet/SavedViewsBar.jsx", + "web/js/components/preact/live/LiveBuildingPlan.jsx", + "web/js/components/preact/live/LiveOperatorNavigator.jsx", + "web/js/components/preact/lpr/PlatesView.jsx", + "web/js/components/preact/recordings/TagsOverlay.jsx", + "web/js/components/preact/recordings/recordingsAPI.jsx", + "web/js/components/preact/settings/GeneralTab.jsx", + "web/js/components/preact/settings/StorageTab.jsx", + "web/js/components/preact/settings/WorkspacesTab.jsx", + "web/js/components/preact/timeline/SpeedControls.jsx", + "web/js/components/preact/timeline/TimelineControls.jsx", + "web/js/components/preact/timeline/TimelinePage.jsx", + "web/js/components/preact/timeline/TimelinePlayer.jsx", + "web/js/components/preact/users/AccessPolicyModal.jsx", + "web/js/components/preact/users/ApiKeyModal.jsx", + "web/js/components/preact/users/AuditDecisionModes.jsx", + "web/js/components/preact/users/AuditHistoryModal.jsx", + "web/js/components/preact/users/RoleManagerModal.jsx", + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/login-page.jsx", + "web/js/pages/plates-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/system-page.jsx", + "web/js/pages/timeline-page.jsx", + "web/js/pages/users-page.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/login-page.jsx", + "web/js/pages/plates-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/system-page.jsx", + "web/js/pages/timeline-page.jsx", + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/recordingsAPI.spec.js" + ], + "consumed_by_other_domains": [ + "events", + "fleet", + "investigation", + "live", + "lpr", + "recordings", + "settings", + "shared-auth", + "shared-shell", + "streams", + "system-health", + "timeline", + "users-access" + ] + }, + { + "path": "web/js/components/preact/UI.jsx", + "ext": ".jsx", + "lines": 1279, + "kind": "component", + "proposed_domain_owner": "shared-ui-primitives", + "imports": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/common/ModalDialog.jsx", + "web/js/components/preact/recordings/formatUtils.js", + "web/js/i18n.js", + "web/js/utils/date-utils.js", + "web/js/utils/recording-playback.js" + ], + "external_imports": [ + "dayjs", + "dayjs/plugin/customParseFormat", + "dayjs/plugin/utc", + "preact", + "preact/compat", + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/RecordingsView.jsx", + "web/js/components/preact/SnapshotManager.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx", + "web/js/components/preact/timeline/TimelinePlayer.jsx", + "web/js/pages/recordings-page.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/timeline-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "toast", + "modal" + ], + "ui_operation_ids": [ + "UI-095", + "UI-096", + "UI-097", + "UI-098" + ], + "tests": [], + "consumed_by_other_domains": [ + "live", + "recordings", + "timeline" + ] + }, + { + "path": "web/js/components/preact/UsersView.jsx", + "ext": ".jsx", + "lines": 525, + "kind": "component", + "proposed_domain_owner": "users-access", + "imports": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/users/AccessPolicyModal.jsx", + "web/js/components/preact/users/AddUserModal.jsx", + "web/js/components/preact/users/ApiKeyModal.jsx", + "web/js/components/preact/users/AuditHistoryModal.jsx", + "web/js/components/preact/users/DeleteUserModal.jsx", + "web/js/components/preact/users/EditUserModal.jsx", + "web/js/components/preact/users/RoleManagerModal.jsx", + "web/js/components/preact/users/TotpSetupModal.jsx", + "web/js/components/preact/users/UsersTable.jsx", + "web/js/i18n.js", + "web/js/query-client.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/pages/users-page.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "toast", + "query" + ], + "ui_operation_ids": [ + "UI-099", + "UI-100", + "UI-101", + "UI-102", + "UI-103" + ], + "tests": [] + }, + { + "path": "web/js/components/preact/WebRTCVideoCell.jsx", + "ext": ".jsx", + "lines": 2165, + "kind": "component", + "proposed_domain_owner": "live", + "imports": [ + "web/js/components/preact/DayNightControl.jsx", + "web/js/components/preact/DetectionOverlay.jsx", + "web/js/components/preact/FisheyeEptzCanvas.jsx", + "web/js/components/preact/LiveTileStatus.jsx", + "web/js/components/preact/LoadingIndicator.jsx", + "web/js/components/preact/ManualRecordingButton.jsx", + "web/js/components/preact/MobileTileGestures.jsx", + "web/js/components/preact/PTZControls.jsx", + "web/js/components/preact/PictureInPictureButton.jsx", + "web/js/components/preact/SnapshotManager.jsx", + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/UI.jsx", + "web/js/components/preact/liveStreamPolicy.js", + "web/js/components/preact/recordings/formatUtils.js", + "web/js/components/preact/useAlwaysFullscreenOnTap.js", + "web/js/components/preact/useAutoRetry.js", + "web/js/components/preact/useVideoZoom.js", + "web/js/i18n.js", + "web/js/query-client.js", + "web/js/utils/date-utils.js", + "web/js/utils/eptz-config.js", + "web/js/utils/live-video-errors.js", + "web/js/utils/navigation-utils.js", + "web/js/utils/player-telemetry.js", + "web/js/utils/settings-utils.js", + "web/js/utils/stream-connection-gate.js", + "web/js/utils/webrtc-ice-gathering.js" + ], + "external_imports": [ + "preact/hooks", + "webrtc-adapter" + ], + "imported_by": [ + "web/js/components/preact/PlaybackTransportCell.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "toast", + "modal", + "query" + ], + "ui_operation_ids": [ + "UI-104", + "UI-105", + "UI-106", + "UI-107", + "UI-108" + ], + "tests": [], + "i18n_literal_baseline_key": "preact/WebRTCVideoCell.jsx", + "i18n_literal_baseline_count": 1 + }, + { + "path": "web/js/components/preact/ZoneEditor.jsx", + "ext": ".jsx", + "lines": 702, + "kind": "component", + "proposed_domain_owner": "streams", + "imports": [ + "web/js/components/preact/common/ModalDialog.jsx", + "web/js/i18n.js", + "web/js/utils/date-utils.js", + "web/js/utils/settings-utils.js", + "web/js/utils/zone-editor-geometry.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/StreamConfigModal.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/streams-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "modal", + "zone_editor" + ], + "ui_operation_ids": [ + "UI-109", + "UI-110", + "UI-111", + "UI-112" + ], + "tests": [] + }, + { + "path": "web/js/components/preact/common/Image.jsx", + "ext": ".jsx", + "lines": 90, + "kind": "component", + "proposed_domain_owner": "shared-ui-primitives", + "imports": [], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [], + "reachable_from_entries": [], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [], + "orphan": true + }, + { + "path": "web/js/components/preact/common/LanguageSelector.jsx", + "ext": ".jsx", + "lines": 73, + "kind": "component", + "proposed_domain_owner": "shared-i18n", + "imports": [ + "web/js/i18n.js" + ], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/Header.jsx", + "web/js/components/preact/LoginView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/login-page.jsx", + "web/js/pages/plates-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/system-page.jsx", + "web/js/pages/timeline-page.jsx", + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [], + "tests": [], + "consumed_by_other_domains": [ + "shared-auth", + "shared-shell" + ] + }, + { + "path": "web/js/components/preact/common/ModalDialog.jsx", + "ext": ".jsx", + "lines": 283, + "kind": "component", + "proposed_domain_owner": "shared-ui-primitives", + "imports": [], + "external_imports": [ + "preact/compat", + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/EventRoutingView.jsx", + "web/js/components/preact/UI.jsx", + "web/js/components/preact/ZoneEditor.jsx", + "web/js/components/preact/fleet/CollectionManager.jsx", + "web/js/components/preact/fleet/OrganizationManager.jsx", + "web/js/components/preact/fleet/SavedViewsBar.jsx", + "web/js/components/preact/live/LiveBuildingPlan.jsx", + "web/js/components/preact/live/LiveOperatorNavigator.jsx", + "web/js/components/preact/lpr/PlatesView.jsx", + "web/js/components/preact/settings/StorageTab.jsx", + "web/js/components/preact/users/AccessPolicyModal.jsx", + "web/js/components/preact/users/ApiKeyModal.jsx", + "web/js/components/preact/users/RoleManagerModal.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/plates-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/timeline-page.jsx", + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [], + "consumed_by_other_domains": [ + "events", + "fleet", + "live", + "lpr", + "settings", + "streams", + "users-access" + ] + }, + { + "path": "web/js/components/preact/events/EventDestinationEditor.jsx", + "ext": ".jsx", + "lines": 195, + "kind": "component", + "proposed_domain_owner": "events", + "imports": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/events/eventRouting.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/EventRoutingView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/streams-page.jsx" + ], + "shared_dependencies_used": [ + "toast" + ], + "ui_operation_ids": [], + "tests": [], + "i18n_literal_baseline_key": "preact/events/EventDestinationEditor.jsx", + "i18n_literal_baseline_count": 5 + }, + { + "path": "web/js/components/preact/events/EventRouteEditor.jsx", + "ext": ".jsx", + "lines": 332, + "kind": "component", + "proposed_domain_owner": "events", + "imports": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/events/eventRouting.js", + "web/js/components/preact/fleet/CollectionSelectorBuilder.jsx" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/EventRoutingView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/streams-page.jsx" + ], + "shared_dependencies_used": [ + "toast" + ], + "ui_operation_ids": [], + "tests": [], + "i18n_literal_baseline_key": "preact/events/EventRouteEditor.jsx", + "i18n_literal_baseline_count": 3 + }, + { + "path": "web/js/components/preact/events/eventRouting.js", + "ext": ".js", + "lines": 389, + "kind": "module", + "proposed_domain_owner": "events", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/EventRoutingView.jsx", + "web/js/components/preact/events/EventDestinationEditor.jsx", + "web/js/components/preact/events/EventRouteEditor.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/streams-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/eventRouting.spec.js" + ] + }, + { + "path": "web/js/components/preact/fleet/BulkOrganizeModal.jsx", + "ext": ".jsx", + "lines": 130, + "kind": "component", + "proposed_domain_owner": "fleet", + "imports": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/fleet/fleetOrganization.js", + "web/js/query-client.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/FleetView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/streams-page.jsx" + ], + "shared_dependencies_used": [ + "toast", + "query" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/fleet/CollectionManager.jsx", + "ext": ".jsx", + "lines": 239, + "kind": "component", + "proposed_domain_owner": "fleet", + "imports": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/common/ModalDialog.jsx", + "web/js/components/preact/fleet/CollectionSelectorBuilder.jsx", + "web/js/components/preact/fleet/StaticCollectionMembers.jsx", + "web/js/query-client.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/FleetView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/streams-page.jsx" + ], + "shared_dependencies_used": [ + "toast", + "modal", + "query" + ], + "ui_operation_ids": [ + "UI-113", + "UI-114", + "UI-115", + "UI-116", + "UI-117", + "UI-118" + ], + "tests": [] + }, + { + "path": "web/js/components/preact/fleet/CollectionSelectorBuilder.jsx", + "ext": ".jsx", + "lines": 367, + "kind": "component", + "proposed_domain_owner": "fleet", + "imports": [ + "web/js/components/preact/fleet/collectionSelector.js", + "web/js/components/preact/fleet/fleetOrganization.js", + "web/js/query-client.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/events/EventRouteEditor.jsx", + "web/js/components/preact/fleet/CollectionManager.jsx", + "web/js/components/preact/settings/StorageTab.jsx", + "web/js/components/preact/users/AccessPolicyModal.jsx", + "web/js/components/preact/users/ApiKeyModal.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [ + "query" + ], + "ui_operation_ids": [ + "UI-119", + "UI-120", + "UI-121" + ], + "tests": [], + "consumed_by_other_domains": [ + "events", + "settings", + "users-access" + ] + }, + { + "path": "web/js/components/preact/fleet/FleetFilters.jsx", + "ext": ".jsx", + "lines": 146, + "kind": "component", + "proposed_domain_owner": "fleet", + "imports": [ + "web/js/components/preact/fleet/fleetQuery.js" + ], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/FleetView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/streams-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/fleet/FleetTable.jsx", + "ext": ".jsx", + "lines": 193, + "kind": "component", + "proposed_domain_owner": "fleet", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/FleetView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/streams-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [], + "i18n_literal_baseline_key": "preact/fleet/FleetTable.jsx", + "i18n_literal_baseline_count": 1 + }, + { + "path": "web/js/components/preact/fleet/OrganizationManager.jsx", + "ext": ".jsx", + "lines": 322, + "kind": "component", + "proposed_domain_owner": "fleet", + "imports": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/common/ModalDialog.jsx", + "web/js/components/preact/fleet/fleetOrganization.js", + "web/js/query-client.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/FleetView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/streams-page.jsx" + ], + "shared_dependencies_used": [ + "toast", + "modal", + "query" + ], + "ui_operation_ids": [ + "UI-122", + "UI-123", + "UI-124", + "UI-125", + "UI-126", + "UI-127", + "UI-128" + ], + "tests": [], + "i18n_literal_baseline_key": "preact/fleet/OrganizationManager.jsx", + "i18n_literal_baseline_count": 1 + }, + { + "path": "web/js/components/preact/fleet/SavedViewsBar.jsx", + "ext": ".jsx", + "lines": 133, + "kind": "component", + "proposed_domain_owner": "fleet", + "imports": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/common/ModalDialog.jsx", + "web/js/components/preact/fleet/fleetQuery.js", + "web/js/query-client.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/FleetView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/streams-page.jsx" + ], + "shared_dependencies_used": [ + "toast", + "modal", + "query" + ], + "ui_operation_ids": [ + "UI-129", + "UI-130" + ], + "tests": [] + }, + { + "path": "web/js/components/preact/fleet/StaticCollectionMembers.jsx", + "ext": ".jsx", + "lines": 91, + "kind": "component", + "proposed_domain_owner": "fleet", + "imports": [ + "web/js/query-client.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/fleet/CollectionManager.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/streams-page.jsx" + ], + "shared_dependencies_used": [ + "query" + ], + "ui_operation_ids": [ + "UI-131" + ], + "tests": [] + }, + { + "path": "web/js/components/preact/fleet/collectionMembership.js", + "ext": ".js", + "lines": 62, + "kind": "module", + "proposed_domain_owner": "fleet", + "imports": [ + "web/js/query-client.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/LiveView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [ + "query" + ], + "ui_operation_ids": [ + "UI-132", + "UI-133" + ], + "tests": [ + "web/tests/collectionMembership.spec.js" + ], + "consumed_by_other_domains": [ + "live" + ] + }, + { + "path": "web/js/components/preact/fleet/collectionSelector.js", + "ext": ".js", + "lines": 102, + "kind": "module", + "proposed_domain_owner": "fleet", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/fleet/CollectionSelectorBuilder.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/collectionSelector.spec.js" + ] + }, + { + "path": "web/js/components/preact/fleet/fleetOrganization.js", + "ext": ".js", + "lines": 150, + "kind": "module", + "proposed_domain_owner": "fleet", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/FleetView.jsx", + "web/js/components/preact/fleet/BulkOrganizeModal.jsx", + "web/js/components/preact/fleet/CollectionSelectorBuilder.jsx", + "web/js/components/preact/fleet/OrganizationManager.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [ + "UI-134", + "UI-135", + "UI-136" + ], + "tests": [ + "web/tests/fleetOrganization.spec.js" + ] + }, + { + "path": "web/js/components/preact/fleet/fleetQuery.js", + "ext": ".js", + "lines": 219, + "kind": "module", + "proposed_domain_owner": "fleet", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/FleetView.jsx", + "web/js/components/preact/fleet/FleetFilters.jsx", + "web/js/components/preact/fleet/SavedViewsBar.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/streams-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/fleetQuery.spec.js" + ] + }, + { + "path": "web/js/components/preact/forcedPasswordChange.js", + "ext": ".js", + "lines": 7, + "kind": "module", + "proposed_domain_owner": "shared-auth", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/AuthGate.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/plates-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/system-page.jsx", + "web/js/pages/timeline-page.jsx", + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/forcedPasswordChange.spec.js" + ] + }, + { + "path": "web/js/components/preact/fullscreenApi.js", + "ext": ".js", + "lines": 60, + "kind": "module", + "proposed_domain_owner": "live", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/FullscreenManager.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/fullscreenFallback.spec.js" + ] + }, + { + "path": "web/js/components/preact/health/Sparkline.jsx", + "ext": ".jsx", + "lines": 47, + "kind": "component", + "proposed_domain_owner": "system-health", + "imports": [], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/HealthView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/streams-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/investigation/InvestigationActions.jsx", + "ext": ".jsx", + "lines": 433, + "kind": "component", + "proposed_domain_owner": "investigation", + "imports": [ + "web/js/components/preact/investigation/investigationUtils.js", + "web/js/components/preact/recordings/formatUtils.js", + "web/js/query-client.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/investigation/InvestigationView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/investigation-page.jsx" + ], + "shared_dependencies_used": [ + "query" + ], + "ui_operation_ids": [ + "UI-137", + "UI-138", + "UI-139", + "UI-140", + "UI-141" + ], + "tests": [] + }, + { + "path": "web/js/components/preact/investigation/InvestigationBookmarks.jsx", + "ext": ".jsx", + "lines": 245, + "kind": "component", + "proposed_domain_owner": "investigation", + "imports": [ + "web/js/components/preact/investigation/investigationUtils.js", + "web/js/query-client.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/investigation/InvestigationView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/investigation-page.jsx" + ], + "shared_dependencies_used": [ + "query" + ], + "ui_operation_ids": [ + "UI-142", + "UI-143", + "UI-144" + ], + "tests": [] + }, + { + "path": "web/js/components/preact/investigation/InvestigationView.jsx", + "ext": ".jsx", + "lines": 1955, + "kind": "component", + "proposed_domain_owner": "investigation", + "imports": [ + "web/js/components/preact/FisheyeEptzCanvas.jsx", + "web/js/components/preact/LoadingIndicator.jsx", + "web/js/components/preact/investigation/InvestigationActions.jsx", + "web/js/components/preact/investigation/InvestigationBookmarks.jsx", + "web/js/components/preact/investigation/investigationUtils.js", + "web/js/components/preact/recordings/formatUtils.js", + "web/js/i18n.js", + "web/js/query-client.js", + "web/js/request-queue.js", + "web/js/utils/eptz-config.js", + "web/js/utils/recording-playback.js", + "web/js/utils/stream-summaries.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/pages/investigation-page.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/investigation-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "query" + ], + "ui_operation_ids": [ + "UI-145", + "UI-146", + "UI-147", + "UI-148", + "UI-149", + "UI-150" + ], + "tests": [ + "web/tests/open-issues-regressions.spec.js" + ] + }, + { + "path": "web/js/components/preact/investigation/investigationUtils.js", + "ext": ".js", + "lines": 376, + "kind": "module", + "proposed_domain_owner": "investigation", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/investigation/InvestigationActions.jsx", + "web/js/components/preact/investigation/InvestigationBookmarks.jsx", + "web/js/components/preact/investigation/InvestigationView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/investigation-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/investigationUtils.spec.js" + ] + }, + { + "path": "web/js/components/preact/live/LiveBuildingPlan.jsx", + "ext": ".jsx", + "lines": 1368, + "kind": "component", + "proposed_domain_owner": "live", + "imports": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/common/ModalDialog.jsx", + "web/js/components/preact/live/PlanSketchControls.jsx", + "web/js/components/preact/live/PlanSketchLayer.jsx", + "web/js/components/preact/live/liveOperator.js", + "web/js/components/preact/live/planSketch.js", + "web/js/i18n.js", + "web/js/query-client.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/LiveView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "toast", + "modal", + "query" + ], + "ui_operation_ids": [ + "UI-151", + "UI-152", + "UI-153", + "UI-154", + "UI-155", + "UI-156", + "UI-157", + "UI-158", + "UI-159", + "UI-160" + ], + "tests": [] + }, + { + "path": "web/js/components/preact/live/LiveOperatorNavigator.jsx", + "ext": ".jsx", + "lines": 463, + "kind": "component", + "proposed_domain_owner": "live", + "imports": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/common/ModalDialog.jsx", + "web/js/components/preact/live/liveOperator.js", + "web/js/i18n.js", + "web/js/query-client.js", + "web/js/utils/workspace-preferences.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/LiveView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "toast", + "modal", + "query" + ], + "ui_operation_ids": [ + "UI-161", + "UI-162", + "UI-163", + "UI-164", + "UI-165", + "UI-166", + "UI-167" + ], + "tests": [] + }, + { + "path": "web/js/components/preact/live/PlanSketchControls.jsx", + "ext": ".jsx", + "lines": 233, + "kind": "component", + "proposed_domain_owner": "live", + "imports": [ + "web/js/components/preact/live/planSketch.js" + ], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/live/LiveBuildingPlan.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/live/PlanSketchLayer.jsx", + "ext": ".jsx", + "lines": 161, + "kind": "component", + "proposed_domain_owner": "live", + "imports": [ + "web/js/components/preact/live/planSketch.js" + ], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/live/LiveBuildingPlan.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/live/cameraFavorites.js", + "ext": ".js", + "lines": 75, + "kind": "module", + "proposed_domain_owner": "live", + "imports": [ + "web/js/query-client.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/LiveView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [ + "query" + ], + "ui_operation_ids": [ + "UI-168", + "UI-169", + "UI-170" + ], + "tests": [ + "web/tests/cameraFavorites.spec.js" + ] + }, + { + "path": "web/js/components/preact/live/liveOperator.js", + "ext": ".js", + "lines": 253, + "kind": "module", + "proposed_domain_owner": "live", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/LiveView.jsx", + "web/js/components/preact/live/LiveBuildingPlan.jsx", + "web/js/components/preact/live/LiveOperatorNavigator.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/liveOperator.spec.js" + ] + }, + { + "path": "web/js/components/preact/live/planSketch.js", + "ext": ".js", + "lines": 320, + "kind": "module", + "proposed_domain_owner": "live", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/live/LiveBuildingPlan.jsx", + "web/js/components/preact/live/PlanSketchControls.jsx", + "web/js/components/preact/live/PlanSketchLayer.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/planSketch.spec.js" + ] + }, + { + "path": "web/js/components/preact/liveStreamPolicy.js", + "ext": ".js", + "lines": 21, + "kind": "module", + "proposed_domain_owner": "live", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/WebRTCVideoCell.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/open-issues-regressions.spec.js" + ] + }, + { + "path": "web/js/components/preact/liveTileStatus.js", + "ext": ".js", + "lines": 25, + "kind": "module", + "proposed_domain_owner": "live", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/LiveTileStatus.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/liveTileStatus.spec.js" + ] + }, + { + "path": "web/js/components/preact/lpr/PlatesView.jsx", + "ext": ".jsx", + "lines": 525, + "kind": "component", + "proposed_domain_owner": "lpr", + "imports": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/common/ModalDialog.jsx", + "web/js/components/preact/lpr/lprSearch.js", + "web/js/fetch-utils.js", + "web/js/i18n.js", + "web/js/query-client.js", + "web/js/utils/stream-summaries.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/pages/plates-page.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/plates-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "auth_failure_redirect", + "toast", + "modal", + "query" + ], + "ui_operation_ids": [], + "tests": [ + "web/tests/platesView.spec.js" + ] + }, + { + "path": "web/js/components/preact/lpr/lprSearch.js", + "ext": ".js", + "lines": 247, + "kind": "module", + "proposed_domain_owner": "lpr", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/lpr/PlatesView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/plates-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [ + "UI-171", + "UI-172", + "UI-173" + ], + "tests": [ + "web/tests/lprSearch.spec.js" + ] + }, + { + "path": "web/js/components/preact/mobileLiveGestures.js", + "ext": ".js", + "lines": 47, + "kind": "module", + "proposed_domain_owner": "live", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/FullscreenManager.jsx", + "web/js/components/preact/LiveView.jsx", + "web/js/components/preact/MobileTileGestures.jsx", + "web/js/components/preact/usePullToRefresh.js" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/recordings-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/mobileLiveGestures.spec.js" + ] + }, + { + "path": "web/js/components/preact/pictureInPicture.js", + "ext": ".js", + "lines": 22, + "kind": "module", + "proposed_domain_owner": "live", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/PictureInPictureButton.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/pictureInPicture.spec.js" + ] + }, + { + "path": "web/js/components/preact/ptzActions.js", + "ext": ".js", + "lines": 46, + "kind": "module", + "proposed_domain_owner": "live", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/PTZControls.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [ + "UI-174", + "UI-175", + "UI-176", + "UI-177" + ], + "tests": [ + "web/tests/ptzActions.spec.js" + ] + }, + { + "path": "web/js/components/preact/recordings/ActiveFilters.jsx", + "ext": ".jsx", + "lines": 34, + "kind": "component", + "proposed_domain_owner": "recordings", + "imports": [ + "web/js/i18n.js" + ], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/RecordingsView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/recordings-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/recordings/FiltersSidebar.jsx", + "ext": ".jsx", + "lines": 488, + "kind": "component", + "proposed_domain_owner": "recordings", + "imports": [ + "web/js/components/preact/AsyncButton.jsx", + "web/js/components/preact/recordings/formatUtils.js", + "web/js/components/preact/recordings/lazyFilterOptions.js", + "web/js/components/preact/recordings/recordingsAPI.jsx", + "web/js/components/preact/recordings/urlUtils.js", + "web/js/i18n.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/RecordingsView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/recordings-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/recordings/PaginationControls.jsx", + "ext": ".jsx", + "lines": 79, + "kind": "component", + "proposed_domain_owner": "recordings", + "imports": [ + "web/js/i18n.js" + ], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/RecordingsView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/recordings-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/recordings/RecordingsGrid.jsx", + "ext": ".jsx", + "lines": 659, + "kind": "component", + "proposed_domain_owner": "recordings", + "imports": [ + "web/js/components/preact/recordings/TagsOverlay.jsx", + "web/js/components/preact/recordings/formatUtils.js", + "web/js/i18n.js", + "web/js/request-queue.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/RecordingsView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/recordings-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [ + "UI-178", + "UI-179", + "UI-180", + "UI-181" + ], + "tests": [] + }, + { + "path": "web/js/components/preact/recordings/RecordingsTable.jsx", + "ext": ".jsx", + "lines": 477, + "kind": "component", + "proposed_domain_owner": "recordings", + "imports": [ + "web/js/components/preact/recordings/TagsOverlay.jsx", + "web/js/components/preact/recordings/formatUtils.js", + "web/js/i18n.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/RecordingsView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/recordings-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/recordings/TagsOverlay.jsx", + "ext": ".jsx", + "lines": 331, + "kind": "component", + "proposed_domain_owner": "recordings", + "imports": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/recordings/recordingsAPI.jsx", + "web/js/i18n.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/recordings/RecordingsGrid.jsx", + "web/js/components/preact/recordings/RecordingsTable.jsx", + "web/js/components/preact/timeline/TimelineControls.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/recordings-page.jsx", + "web/js/pages/timeline-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "toast" + ], + "ui_operation_ids": [], + "tests": [], + "consumed_by_other_domains": [ + "timeline" + ] + }, + { + "path": "web/js/components/preact/recordings/formatUtils.js", + "ext": ".js", + "lines": 177, + "kind": "module", + "proposed_domain_owner": "recordings", + "imports": [], + "external_imports": [ + "dayjs", + "dayjs/plugin/utc" + ], + "imported_by": [ + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/RecordingsView.jsx", + "web/js/components/preact/UI.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx", + "web/js/components/preact/investigation/InvestigationActions.jsx", + "web/js/components/preact/investigation/InvestigationView.jsx", + "web/js/components/preact/recordings/FiltersSidebar.jsx", + "web/js/components/preact/recordings/RecordingsGrid.jsx", + "web/js/components/preact/recordings/RecordingsTable.jsx", + "web/js/components/preact/recordings/recordingsAPI.jsx", + "web/js/components/preact/recordings/urlUtils.js" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/timeline-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/open-issues-regressions.spec.js" + ], + "consumed_by_other_domains": [ + "investigation", + "live", + "shared-ui-primitives" + ] + }, + { + "path": "web/js/components/preact/recordings/lazyFilterOptions.js", + "ext": ".js", + "lines": 60, + "kind": "module", + "proposed_domain_owner": "recordings", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/recordings/FiltersSidebar.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/recordings-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/lazyFilterOptions.spec.js" + ] + }, + { + "path": "web/js/components/preact/recordings/recordingsAPI.jsx", + "ext": ".jsx", + "lines": 850, + "kind": "component", + "proposed_domain_owner": "recordings", + "imports": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/recordings/formatUtils.js", + "web/js/components/preact/recordings/urlUtils.js", + "web/js/fetch-utils.js", + "web/js/i18n.js", + "web/js/query-client.js", + "web/js/utils/batch-delete-status.js", + "web/js/utils/recording-playback.js", + "web/js/utils/stream-summaries.js" + ], + "external_imports": [ + "dayjs", + "dayjs/plugin/customParseFormat", + "dayjs/plugin/utc" + ], + "imported_by": [ + "web/js/components/preact/RecordingsView.jsx", + "web/js/components/preact/recordings/FiltersSidebar.jsx", + "web/js/components/preact/recordings/TagsOverlay.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/recordings-page.jsx", + "web/js/pages/timeline-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "auth_failure_redirect", + "toast", + "query" + ], + "ui_operation_ids": [ + "UI-182", + "UI-183", + "UI-184", + "UI-185", + "UI-186", + "UI-187", + "UI-188", + "UI-189", + "UI-190", + "UI-191", + "UI-192", + "UI-193", + "UI-194", + "UI-195", + "UI-196", + "UI-197", + "UI-198", + "UI-199", + "UI-200", + "UI-201" + ], + "tests": [ + "web/tests/recordingsAPI.spec.js" + ] + }, + { + "path": "web/js/components/preact/recordings/urlUtils.js", + "ext": ".js", + "lines": 461, + "kind": "module", + "proposed_domain_owner": "recordings", + "imports": [ + "web/js/components/preact/recordings/formatUtils.js", + "web/js/utils/date-utils.js" + ], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/RecordingsView.jsx", + "web/js/components/preact/recordings/FiltersSidebar.jsx", + "web/js/components/preact/recordings/recordingsAPI.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/recordings-page.jsx", + "web/js/pages/timeline-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "tests/integration/recordings-url-utils.ui.spec.ts", + "web/tests/recordingsUrlUtils.spec.js" + ] + }, + { + "path": "web/js/components/preact/settings/AdvancedTab.jsx", + "ext": ".jsx", + "lines": 191, + "kind": "component", + "proposed_domain_owner": "settings", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/SettingsView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/settings-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/settings/AppearanceTab.jsx", + "ext": ".jsx", + "lines": 70, + "kind": "component", + "proposed_domain_owner": "settings", + "imports": [ + "web/js/components/preact/ThemeCustomizer.jsx", + "web/js/utils/reduceMotion.js" + ], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/SettingsView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/settings-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/settings/AuthTab.jsx", + "ext": ".jsx", + "lines": 322, + "kind": "component", + "proposed_domain_owner": "settings", + "imports": [ + "web/js/components/preact/AsyncButton.jsx" + ], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/SettingsView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/settings-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [], + "i18n_literal_baseline_key": "preact/settings/AuthTab.jsx", + "i18n_literal_baseline_count": 2 + }, + { + "path": "web/js/components/preact/settings/DetectionTab.jsx", + "ext": ".jsx", + "lines": 214, + "kind": "component", + "proposed_domain_owner": "settings", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/SettingsView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/settings-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [], + "i18n_literal_baseline_key": "preact/settings/DetectionTab.jsx", + "i18n_literal_baseline_count": 2 + }, + { + "path": "web/js/components/preact/settings/GeneralTab.jsx", + "ext": ".jsx", + "lines": 217, + "kind": "component", + "proposed_domain_owner": "settings", + "imports": [ + "web/js/components/preact/ToastContainer.jsx" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/SettingsView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/settings-page.jsx" + ], + "shared_dependencies_used": [ + "toast" + ], + "ui_operation_ids": [ + "UI-202" + ], + "tests": [], + "i18n_literal_baseline_key": "preact/settings/GeneralTab.jsx", + "i18n_literal_baseline_count": 11 + }, + { + "path": "web/js/components/preact/settings/Go2rtcTab.jsx", + "ext": ".jsx", + "lines": 630, + "kind": "component", + "proposed_domain_owner": "settings", + "imports": [ + "web/js/query-client.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/SettingsView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/settings-page.jsx" + ], + "shared_dependencies_used": [ + "query" + ], + "ui_operation_ids": [ + "UI-203", + "UI-204", + "UI-205" + ], + "tests": [], + "i18n_literal_baseline_key": "preact/settings/Go2rtcTab.jsx", + "i18n_literal_baseline_count": 4 + }, + { + "path": "web/js/components/preact/settings/HealthTab.jsx", + "ext": ".jsx", + "lines": 289, + "kind": "component", + "proposed_domain_owner": "settings", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/SettingsView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/settings-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/systemHealthSettings.spec.js" + ] + }, + { + "path": "web/js/components/preact/settings/MqttTab.jsx", + "ext": ".jsx", + "lines": 265, + "kind": "component", + "proposed_domain_owner": "settings", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/SettingsView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/settings-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [], + "i18n_literal_baseline_key": "preact/settings/MqttTab.jsx", + "i18n_literal_baseline_count": 4 + }, + { + "path": "web/js/components/preact/settings/StorageTab.jsx", + "ext": ".jsx", + "lines": 967, + "kind": "component", + "proposed_domain_owner": "settings", + "imports": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/common/ModalDialog.jsx", + "web/js/components/preact/fleet/CollectionSelectorBuilder.jsx", + "web/js/components/preact/settings/storageTargetRouting.js", + "web/js/query-client.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/SettingsView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/settings-page.jsx" + ], + "shared_dependencies_used": [ + "toast", + "modal", + "query" + ], + "ui_operation_ids": [ + "UI-206", + "UI-207", + "UI-208", + "UI-209", + "UI-210", + "UI-211", + "UI-212", + "UI-213", + "UI-214", + "UI-215", + "UI-216", + "UI-217", + "UI-218", + "UI-219", + "UI-220", + "UI-221", + "UI-222", + "UI-223", + "UI-224", + "UI-225", + "UI-226", + "UI-227", + "UI-228", + "UI-229", + "UI-230", + "UI-231", + "UI-232", + "UI-233" + ], + "tests": [], + "i18n_literal_baseline_key": "preact/settings/StorageTab.jsx", + "i18n_literal_baseline_count": 2 + }, + { + "path": "web/js/components/preact/settings/StreamsDefaultsTab.jsx", + "ext": ".jsx", + "lines": 108, + "kind": "component", + "proposed_domain_owner": "settings", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/SettingsView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/settings-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/settings/WorkspacesTab.jsx", + "ext": ".jsx", + "lines": 105, + "kind": "component", + "proposed_domain_owner": "settings", + "imports": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/query-client.js", + "web/js/utils/workspace-preferences.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/SettingsView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/settings-page.jsx" + ], + "shared_dependencies_used": [ + "toast", + "query" + ], + "ui_operation_ids": [ + "UI-234", + "UI-235" + ], + "tests": [] + }, + { + "path": "web/js/components/preact/settings/storageTargetRouting.js", + "ext": ".js", + "lines": 56, + "kind": "module", + "proposed_domain_owner": "settings", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/settings/StorageTab.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/settings-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/storageTargetRouting.spec.js" + ] + }, + { + "path": "web/js/components/preact/system/ClearLogsModal.jsx", + "ext": ".jsx", + "lines": 77, + "kind": "component", + "proposed_domain_owner": "system-health", + "imports": [ + "web/js/i18n.js" + ], + "external_imports": [ + "preact/compat", + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/SystemView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/system-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/system/HealthIncidentHistory.jsx", + "ext": ".jsx", + "lines": 89, + "kind": "component", + "proposed_domain_owner": "system-health", + "imports": [ + "web/js/components/preact/system/SystemUtils.js", + "web/js/i18n.js", + "web/js/query-client.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/system/SystemHealth.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/system-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "query" + ], + "ui_operation_ids": [ + "UI-236" + ], + "tests": [ + "web/tests/systemHealth.spec.js" + ] + }, + { + "path": "web/js/components/preact/system/LogsPoller.jsx", + "ext": ".jsx", + "lines": 140, + "kind": "component", + "proposed_domain_owner": "system-health", + "imports": [ + "web/js/components/preact/system/SystemUtils.js", + "web/js/fetch-utils.js", + "web/js/utils/date-utils.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/SystemView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/system-page.jsx" + ], + "shared_dependencies_used": [ + "auth_failure_redirect" + ], + "ui_operation_ids": [ + "UI-237" + ], + "tests": [], + "note_jsx_without_markup": true + }, + { + "path": "web/js/components/preact/system/LogsView.jsx", + "ext": ".jsx", + "lines": 160, + "kind": "component", + "proposed_domain_owner": "system-health", + "imports": [ + "web/js/i18n.js" + ], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/SystemView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/system-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/system/MemoryStorage.jsx", + "ext": ".jsx", + "lines": 84, + "kind": "component", + "proposed_domain_owner": "system-health", + "imports": [ + "web/js/i18n.js" + ], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/SystemView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/system-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [], + "tests": [ + "web/tests/systemHealth.spec.js" + ] + }, + { + "path": "web/js/components/preact/system/NetworkInfo.jsx", + "ext": ".jsx", + "lines": 40, + "kind": "component", + "proposed_domain_owner": "system-health", + "imports": [ + "web/js/i18n.js" + ], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/SystemView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/system-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/system/RestartModal.jsx", + "ext": ".jsx", + "lines": 212, + "kind": "component", + "proposed_domain_owner": "system-health", + "imports": [ + "web/js/components/preact/AsyncButton.jsx", + "web/js/i18n.js" + ], + "external_imports": [ + "preact/compat", + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/system/SystemControls.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/system-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [ + "UI-238", + "UI-239" + ], + "tests": [] + }, + { + "path": "web/js/components/preact/system/StorageHealth.jsx", + "ext": ".jsx", + "lines": 213, + "kind": "component", + "proposed_domain_owner": "system-health", + "imports": [ + "web/js/i18n.js", + "web/js/query-client.js", + "web/js/utils/date-utils.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/SystemView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/system-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "query" + ], + "ui_operation_ids": [ + "UI-240", + "UI-241" + ], + "tests": [] + }, + { + "path": "web/js/components/preact/system/StreamStorage.jsx", + "ext": ".jsx", + "lines": 151, + "kind": "component", + "proposed_domain_owner": "system-health", + "imports": [ + "web/js/i18n.js" + ], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/SystemView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/system-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/system/StreamsInfo.jsx", + "ext": ".jsx", + "lines": 37, + "kind": "component", + "proposed_domain_owner": "system-health", + "imports": [ + "web/js/i18n.js" + ], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/SystemView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/system-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/system/SystemControls.jsx", + "ext": ".jsx", + "lines": 65, + "kind": "component", + "proposed_domain_owner": "system-health", + "imports": [ + "web/js/components/preact/system/RestartModal.jsx", + "web/js/i18n.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/SystemView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/system-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/system/SystemHealth.jsx", + "ext": ".jsx", + "lines": 248, + "kind": "component", + "proposed_domain_owner": "system-health", + "imports": [ + "web/js/components/preact/system/HealthIncidentHistory.jsx", + "web/js/components/preact/system/SystemUtils.js", + "web/js/i18n.js", + "web/js/query-client.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/SystemView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/system-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "query" + ], + "ui_operation_ids": [ + "UI-242" + ], + "tests": [ + "web/tests/systemHealth.spec.js" + ] + }, + { + "path": "web/js/components/preact/system/SystemInfo.jsx", + "ext": ".jsx", + "lines": 54, + "kind": "component", + "proposed_domain_owner": "system-health", + "imports": [ + "web/js/i18n.js" + ], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/SystemView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/system-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/system/SystemUtils.js", + "ext": ".js", + "lines": 97, + "kind": "module", + "proposed_domain_owner": "system-health", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/SystemView.jsx", + "web/js/components/preact/system/HealthIncidentHistory.jsx", + "web/js/components/preact/system/LogsPoller.jsx", + "web/js/components/preact/system/SystemHealth.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/system-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/open-issues-regressions.spec.js" + ] + }, + { + "path": "web/js/components/preact/system/VersionsTable.jsx", + "ext": ".jsx", + "lines": 73, + "kind": "component", + "proposed_domain_owner": "system-health", + "imports": [ + "web/js/i18n.js" + ], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/SystemView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/system-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/system/WebServiceInfo.jsx", + "ext": ".jsx", + "lines": 107, + "kind": "component", + "proposed_domain_owner": "system-health", + "imports": [ + "web/js/i18n.js", + "web/js/query-client.js" + ], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/SystemView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/system-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "query" + ], + "ui_operation_ids": [ + "UI-243" + ], + "tests": [] + }, + { + "path": "web/js/components/preact/timeline/CalendarPicker.jsx", + "ext": ".jsx", + "lines": 224, + "kind": "component", + "proposed_domain_owner": "timeline", + "imports": [ + "web/js/i18n.js" + ], + "external_imports": [ + "dayjs", + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/timeline/TimelinePage.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/timeline-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/timeline/SpeedControls.jsx", + "ext": ".jsx", + "lines": 67, + "kind": "component", + "proposed_domain_owner": "timeline", + "imports": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/timeline/TimelinePage.jsx", + "web/js/i18n.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/timeline/TimelinePlayer.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/timeline-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "toast" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/timeline/TimelineControls.jsx", + "ext": ".jsx", + "lines": 418, + "kind": "component", + "proposed_domain_owner": "timeline", + "imports": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/recordings/TagsOverlay.jsx", + "web/js/components/preact/timeline/TimelinePage.jsx", + "web/js/components/preact/timeline/timelineUtils.js", + "web/js/i18n.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/timeline/TimelinePage.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/timeline-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "toast" + ], + "ui_operation_ids": [ + "UI-244" + ], + "tests": [] + }, + { + "path": "web/js/components/preact/timeline/TimelineCursor.jsx", + "ext": ".jsx", + "lines": 490, + "kind": "component", + "proposed_domain_owner": "timeline", + "imports": [ + "web/js/components/preact/timeline/TimelinePage.jsx", + "web/js/components/preact/timeline/timelineUtils.js", + "web/js/i18n.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/timeline/TimelinePage.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/timeline-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [ + "UI-245", + "UI-246" + ], + "tests": [] + }, + { + "path": "web/js/components/preact/timeline/TimelinePage.jsx", + "ext": ".jsx", + "lines": 1679, + "kind": "component", + "proposed_domain_owner": "timeline", + "imports": [ + "web/js/components/preact/BatchDownloadModal.jsx", + "web/js/components/preact/LoadingIndicator.jsx", + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/timeline/CalendarPicker.jsx", + "web/js/components/preact/timeline/TimelineControls.jsx", + "web/js/components/preact/timeline/TimelineCursor.jsx", + "web/js/components/preact/timeline/TimelinePlayer.jsx", + "web/js/components/preact/timeline/TimelineRuler.jsx", + "web/js/components/preact/timeline/TimelineSegments.jsx", + "web/js/components/preact/timeline/timelineUtils.js", + "web/js/i18n.js", + "web/js/query-client.js", + "web/js/utils/date-utils.js", + "web/js/utils/reduceMotion.js", + "web/js/utils/stream-summaries.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/timeline/SpeedControls.jsx", + "web/js/components/preact/timeline/TimelineControls.jsx", + "web/js/components/preact/timeline/TimelineCursor.jsx", + "web/js/components/preact/timeline/TimelinePlayer.jsx", + "web/js/components/preact/timeline/TimelineRuler.jsx", + "web/js/components/preact/timeline/TimelineSegments.jsx", + "web/js/pages/timeline-page.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/timeline-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "toast", + "query" + ], + "ui_operation_ids": [ + "UI-247" + ], + "tests": [] + }, + { + "path": "web/js/components/preact/timeline/TimelinePlayer.jsx", + "ext": ".jsx", + "lines": 1108, + "kind": "component", + "proposed_domain_owner": "timeline", + "imports": [ + "web/js/components/preact/FisheyeEptzCanvas.jsx", + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/UI.jsx", + "web/js/components/preact/timeline/SpeedControls.jsx", + "web/js/components/preact/timeline/TimelinePage.jsx", + "web/js/components/preact/timeline/timelineUtils.js", + "web/js/i18n.js", + "web/js/utils/date-utils.js", + "web/js/utils/eptz-config.js", + "web/js/utils/recording-playback.js", + "web/js/utils/stream-summaries.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/timeline/TimelinePage.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/timeline-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "toast", + "modal" + ], + "ui_operation_ids": [ + "UI-248", + "UI-249", + "UI-250", + "UI-251", + "UI-252", + "UI-253" + ], + "tests": [] + }, + { + "path": "web/js/components/preact/timeline/TimelineRuler.jsx", + "ext": ".jsx", + "lines": 99, + "kind": "component", + "proposed_domain_owner": "timeline", + "imports": [ + "web/js/components/preact/timeline/TimelinePage.jsx", + "web/js/components/preact/timeline/timelineUtils.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/timeline/TimelinePage.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/timeline-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/timeline/TimelineSegments.jsx", + "ext": ".jsx", + "lines": 364, + "kind": "component", + "proposed_domain_owner": "timeline", + "imports": [ + "web/js/components/preact/timeline/TimelinePage.jsx", + "web/js/components/preact/timeline/timelineUtils.js", + "web/js/i18n.js", + "web/js/utils/date-utils.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/timeline/TimelinePage.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/timeline-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [ + "UI-254", + "UI-255" + ], + "tests": [] + }, + { + "path": "web/js/components/preact/timeline/timelineUtils.js", + "ext": ".js", + "lines": 650, + "kind": "module", + "proposed_domain_owner": "timeline", + "imports": [], + "external_imports": [ + "dayjs" + ], + "imported_by": [ + "web/js/components/preact/timeline/TimelineControls.jsx", + "web/js/components/preact/timeline/TimelineCursor.jsx", + "web/js/components/preact/timeline/TimelinePage.jsx", + "web/js/components/preact/timeline/TimelinePlayer.jsx", + "web/js/components/preact/timeline/TimelineRuler.jsx", + "web/js/components/preact/timeline/TimelineSegments.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/timeline-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [ + "UI-256" + ], + "tests": [ + "web/tests/lprSearch.spec.js", + "web/tests/open-issues-regressions.spec.js", + "web/tests/timeline-utils.spec.js" + ] + }, + { + "path": "web/js/components/preact/useAlwaysFullscreenOnTap.js", + "ext": ".js", + "lines": 53, + "kind": "hook", + "proposed_domain_owner": "live", + "imports": [], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/LiveView.jsx", + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/liveFullscreenPreferences.spec.js" + ] + }, + { + "path": "web/js/components/preact/useAutoRetry.js", + "ext": ".js", + "lines": 96, + "kind": "hook", + "proposed_domain_owner": "live", + "imports": [], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/useCameraOrder.js", + "ext": ".js", + "lines": 207, + "kind": "hook", + "proposed_domain_owner": "live", + "imports": [], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/LiveView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/useLiveDisplayMode.js", + "ext": ".js", + "lines": 80, + "kind": "hook", + "proposed_domain_owner": "live", + "imports": [], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/DetectionOverlay.jsx", + "web/js/components/preact/LiveDisplayModeToggle.jsx", + "web/js/components/preact/LiveView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/liveDisplayMode.spec.js" + ] + }, + { + "path": "web/js/components/preact/useLiveSlideshow.js", + "ext": ".js", + "lines": 156, + "kind": "hook", + "proposed_domain_owner": "live", + "imports": [], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/LiveSlideshowControl.jsx", + "web/js/components/preact/LiveView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/liveSlideshow.spec.js", + "web/tests/liveSlideshowHook.spec.js" + ] + }, + { + "path": "web/js/components/preact/usePullToRefresh.js", + "ext": ".js", + "lines": 62, + "kind": "hook", + "proposed_domain_owner": "live", + "imports": [ + "web/js/components/preact/mobileLiveGestures.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/LiveView.jsx", + "web/js/components/preact/RecordingsView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/recordings-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [], + "consumed_by_other_domains": [ + "recordings" + ] + }, + { + "path": "web/js/components/preact/useVideoZoom.js", + "ext": ".js", + "lines": 300, + "kind": "hook", + "proposed_domain_owner": "live", + "imports": [], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/users/AccessPolicyModal.jsx", + "ext": ".jsx", + "lines": 307, + "kind": "component", + "proposed_domain_owner": "users-access", + "imports": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/common/ModalDialog.jsx", + "web/js/components/preact/fleet/CollectionSelectorBuilder.jsx", + "web/js/components/preact/users/authorizationPolicy.js", + "web/js/i18n.js", + "web/js/query-client.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/UsersView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "toast", + "modal", + "query" + ], + "ui_operation_ids": [ + "UI-257", + "UI-258", + "UI-259", + "UI-260", + "UI-261", + "UI-262", + "UI-263", + "UI-264" + ], + "tests": [] + }, + { + "path": "web/js/components/preact/users/AddUserModal.jsx", + "ext": ".jsx", + "lines": 279, + "kind": "component", + "proposed_domain_owner": "users-access", + "imports": [ + "web/js/components/preact/AsyncButton.jsx", + "web/js/components/preact/users/UserRoles.js", + "web/js/i18n.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/UsersView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [], + "tests": [], + "i18n_literal_baseline_key": "preact/users/AddUserModal.jsx", + "i18n_literal_baseline_count": 1 + }, + { + "path": "web/js/components/preact/users/ApiKeyModal.jsx", + "ext": ".jsx", + "lines": 352, + "kind": "component", + "proposed_domain_owner": "users-access", + "imports": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/common/ModalDialog.jsx", + "web/js/components/preact/fleet/CollectionSelectorBuilder.jsx", + "web/js/components/preact/users/apiTokenPolicy.js", + "web/js/components/preact/users/authorizationPolicy.js", + "web/js/i18n.js", + "web/js/query-client.js", + "web/js/utils/date-utils.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/UsersView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "toast", + "modal", + "query" + ], + "ui_operation_ids": [ + "UI-265", + "UI-266", + "UI-267", + "UI-268", + "UI-269", + "UI-270", + "UI-271", + "UI-272" + ], + "tests": [] + }, + { + "path": "web/js/components/preact/users/AuditDecisionModes.jsx", + "ext": ".jsx", + "lines": 93, + "kind": "component", + "proposed_domain_owner": "users-access", + "imports": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/users/auditHistory.js", + "web/js/i18n.js", + "web/js/query-client.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/users/AuditHistoryModal.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "toast", + "query" + ], + "ui_operation_ids": [ + "UI-273" + ], + "tests": [] + }, + { + "path": "web/js/components/preact/users/AuditHistoryModal.jsx", + "ext": ".jsx", + "lines": 285, + "kind": "component", + "proposed_domain_owner": "users-access", + "imports": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/users/AuditDecisionModes.jsx", + "web/js/components/preact/users/auditHistory.js", + "web/js/fetch-utils.js", + "web/js/i18n.js", + "web/js/query-client.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/UsersView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "auth_failure_redirect", + "toast", + "query" + ], + "ui_operation_ids": [ + "UI-274", + "UI-275", + "UI-276", + "UI-277" + ], + "tests": [], + "i18n_literal_baseline_key": "preact/users/AuditHistoryModal.jsx", + "i18n_literal_baseline_count": 1 + }, + { + "path": "web/js/components/preact/users/DeleteUserModal.jsx", + "ext": ".jsx", + "lines": 62, + "kind": "component", + "proposed_domain_owner": "users-access", + "imports": [ + "web/js/components/preact/AsyncButton.jsx", + "web/js/i18n.js" + ], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/UsersView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/users/EditUserModal.jsx", + "ext": ".jsx", + "lines": 313, + "kind": "component", + "proposed_domain_owner": "users-access", + "imports": [ + "web/js/components/preact/AsyncButton.jsx", + "web/js/components/preact/users/UserRoles.js", + "web/js/i18n.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/Header.jsx", + "web/js/components/preact/UsersView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/plates-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/system-page.jsx", + "web/js/pages/timeline-page.jsx", + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [], + "tests": [], + "i18n_literal_baseline_key": "preact/users/EditUserModal.jsx", + "i18n_literal_baseline_count": 1, + "consumed_by_other_domains": [ + "shared-shell" + ] + }, + { + "path": "web/js/components/preact/users/RoleManagerModal.jsx", + "ext": ".jsx", + "lines": 219, + "kind": "component", + "proposed_domain_owner": "users-access", + "imports": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/common/ModalDialog.jsx", + "web/js/components/preact/users/authorizationPolicy.js", + "web/js/i18n.js", + "web/js/query-client.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/UsersView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "toast", + "modal", + "query" + ], + "ui_operation_ids": [ + "UI-278", + "UI-279", + "UI-280", + "UI-281", + "UI-282" + ], + "tests": [] + }, + { + "path": "web/js/components/preact/users/TotpSetupModal.jsx", + "ext": ".jsx", + "lines": 238, + "kind": "component", + "proposed_domain_owner": "users-access", + "imports": [ + "web/js/components/preact/AsyncButton.jsx", + "web/js/i18n.js" + ], + "external_imports": [ + "preact/hooks", + "qrcode" + ], + "imported_by": [ + "web/js/components/preact/UsersView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [ + "UI-283", + "UI-284", + "UI-285", + "UI-286" + ], + "tests": [] + }, + { + "path": "web/js/components/preact/users/UserRoles.js", + "ext": ".js", + "lines": 14, + "kind": "module", + "proposed_domain_owner": "users-access", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/users/AddUserModal.jsx", + "web/js/components/preact/users/EditUserModal.jsx", + "web/js/components/preact/users/UsersTable.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/plates-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/system-page.jsx", + "web/js/pages/timeline-page.jsx", + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/users/UsersTable.jsx", + "ext": ".jsx", + "lines": 234, + "kind": "component", + "proposed_domain_owner": "users-access", + "imports": [ + "web/js/components/preact/users/UserRoles.js", + "web/js/i18n.js", + "web/js/utils/date-utils.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/UsersView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/components/preact/users/apiTokenPolicy.js", + "ext": ".js", + "lines": 91, + "kind": "module", + "proposed_domain_owner": "users-access", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/users/ApiKeyModal.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/apiTokenPolicy.spec.js" + ] + }, + { + "path": "web/js/components/preact/users/auditHistory.js", + "ext": ".js", + "lines": 137, + "kind": "module", + "proposed_domain_owner": "users-access", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/users/AuditDecisionModes.jsx", + "web/js/components/preact/users/AuditHistoryModal.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/auditHistory.spec.js" + ] + }, + { + "path": "web/js/components/preact/users/authorizationPolicy.js", + "ext": ".js", + "lines": 115, + "kind": "module", + "proposed_domain_owner": "users-access", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/users/AccessPolicyModal.jsx", + "web/js/components/preact/users/ApiKeyModal.jsx", + "web/js/components/preact/users/RoleManagerModal.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/authorizationPolicy.spec.js" + ] + }, + { + "path": "web/js/fetch-utils.js", + "ext": ".js", + "lines": 211, + "kind": "module", + "proposed_domain_owner": "shared-data-query", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/lpr/PlatesView.jsx", + "web/js/components/preact/recordings/recordingsAPI.jsx", + "web/js/components/preact/system/LogsPoller.jsx", + "web/js/components/preact/users/AuditHistoryModal.jsx", + "web/js/query-client.js", + "web/js/utils/auth-utils.js", + "web/js/utils/settings-utils.js", + "web/js/utils/stream-summaries.js" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/login-page.jsx", + "web/js/pages/plates-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/system-page.jsx", + "web/js/pages/timeline-page.jsx", + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/fetchUtils.spec.js", + "web/tests/go2rtcSettings.spec.js", + "web/tests/recordingsAPI.spec.js" + ], + "consumed_by_other_domains": [ + "lpr", + "recordings", + "shared-auth", + "shared-shell", + "streams", + "system-health", + "users-access" + ] + }, + { + "path": "web/js/hooks/useAsyncAction.js", + "ext": ".js", + "lines": 122, + "kind": "hook", + "proposed_domain_owner": "shared-data-query", + "imports": [], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/AsyncButton.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/plates-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/system-page.jsx", + "web/js/pages/timeline-page.jsx", + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/useAsyncAction.spec.js" + ], + "consumed_by_other_domains": [ + "shared-ui-primitives" + ] + }, + { + "path": "web/js/i18n.js", + "ext": ".js", + "lines": 291, + "kind": "module", + "proposed_domain_owner": "shared-i18n", + "imports": [ + "web/js/utils/reduceMotion.js" + ], + "external_imports": [ + "preact/hooks" + ], + "imported_by": [ + "web/js/components/preact/AlwaysFullscreenToggle.jsx", + "web/js/components/preact/AsyncButton.jsx", + "web/js/components/preact/AuthGate.jsx", + "web/js/components/preact/BatchDeleteModal.jsx", + "web/js/components/preact/BatchDownloadModal.jsx", + "web/js/components/preact/DayNightControl.jsx", + "web/js/components/preact/DetectionOverlay.jsx", + "web/js/components/preact/EventRoutingView.jsx", + "web/js/components/preact/FisheyeEptzCanvas.jsx", + "web/js/components/preact/FleetView.jsx", + "web/js/components/preact/Footer.jsx", + "web/js/components/preact/GridPicker.jsx", + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/Header.jsx", + "web/js/components/preact/HealthView.jsx", + "web/js/components/preact/LiveDisplayModeToggle.jsx", + "web/js/components/preact/LiveSlideshowControl.jsx", + "web/js/components/preact/LiveTileStatus.jsx", + "web/js/components/preact/LiveView.jsx", + "web/js/components/preact/LoadingIndicator.jsx", + "web/js/components/preact/LoginView.jsx", + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/ManualRecordingButton.jsx", + "web/js/components/preact/MobileTileGestures.jsx", + "web/js/components/preact/PTZControls.jsx", + "web/js/components/preact/PictureInPictureButton.jsx", + "web/js/components/preact/PlaybackTransportCell.jsx", + "web/js/components/preact/RecordingsView.jsx", + "web/js/components/preact/SettingsView.jsx", + "web/js/components/preact/SetupWizard.jsx", + "web/js/components/preact/SnapshotManager.jsx", + "web/js/components/preact/StreamBulkActionModal.jsx", + "web/js/components/preact/StreamConfigModal.jsx", + "web/js/components/preact/StreamDeleteModal.jsx", + "web/js/components/preact/StreamsView.jsx", + "web/js/components/preact/SystemView.jsx", + "web/js/components/preact/ThemeCustomizer.jsx", + "web/js/components/preact/TileAudioButton.jsx", + "web/js/components/preact/UI.jsx", + "web/js/components/preact/UsersView.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx", + "web/js/components/preact/ZoneEditor.jsx", + "web/js/components/preact/common/LanguageSelector.jsx", + "web/js/components/preact/investigation/InvestigationView.jsx", + "web/js/components/preact/live/LiveBuildingPlan.jsx", + "web/js/components/preact/live/LiveOperatorNavigator.jsx", + "web/js/components/preact/lpr/PlatesView.jsx", + "web/js/components/preact/recordings/ActiveFilters.jsx", + "web/js/components/preact/recordings/FiltersSidebar.jsx", + "web/js/components/preact/recordings/PaginationControls.jsx", + "web/js/components/preact/recordings/RecordingsGrid.jsx", + "web/js/components/preact/recordings/RecordingsTable.jsx", + "web/js/components/preact/recordings/TagsOverlay.jsx", + "web/js/components/preact/recordings/recordingsAPI.jsx", + "web/js/components/preact/system/ClearLogsModal.jsx", + "web/js/components/preact/system/HealthIncidentHistory.jsx", + "web/js/components/preact/system/LogsView.jsx", + "web/js/components/preact/system/MemoryStorage.jsx", + "web/js/components/preact/system/NetworkInfo.jsx", + "web/js/components/preact/system/RestartModal.jsx", + "web/js/components/preact/system/StorageHealth.jsx", + "web/js/components/preact/system/StreamStorage.jsx", + "web/js/components/preact/system/StreamsInfo.jsx", + "web/js/components/preact/system/SystemControls.jsx", + "web/js/components/preact/system/SystemHealth.jsx", + "web/js/components/preact/system/SystemInfo.jsx", + "web/js/components/preact/system/VersionsTable.jsx", + "web/js/components/preact/system/WebServiceInfo.jsx", + "web/js/components/preact/timeline/CalendarPicker.jsx", + "web/js/components/preact/timeline/SpeedControls.jsx", + "web/js/components/preact/timeline/TimelineControls.jsx", + "web/js/components/preact/timeline/TimelineCursor.jsx", + "web/js/components/preact/timeline/TimelinePage.jsx", + "web/js/components/preact/timeline/TimelinePlayer.jsx", + "web/js/components/preact/timeline/TimelineSegments.jsx", + "web/js/components/preact/users/AccessPolicyModal.jsx", + "web/js/components/preact/users/AddUserModal.jsx", + "web/js/components/preact/users/ApiKeyModal.jsx", + "web/js/components/preact/users/AuditDecisionModes.jsx", + "web/js/components/preact/users/AuditHistoryModal.jsx", + "web/js/components/preact/users/DeleteUserModal.jsx", + "web/js/components/preact/users/EditUserModal.jsx", + "web/js/components/preact/users/RoleManagerModal.jsx", + "web/js/components/preact/users/TotpSetupModal.jsx", + "web/js/components/preact/users/UsersTable.jsx", + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/login-page.jsx", + "web/js/pages/plates-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/system-page.jsx", + "web/js/pages/timeline-page.jsx", + "web/js/pages/users-page.jsx", + "web/js/utils/batch-delete-status.js" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/login-page.jsx", + "web/js/pages/plates-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/system-page.jsx", + "web/js/pages/timeline-page.jsx", + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/i18n.spec.js", + "web/tests/recordingsAPI.spec.js" + ], + "consumed_by_other_domains": [ + "events", + "fleet", + "investigation", + "live", + "lpr", + "recordings", + "settings", + "shared-auth", + "shared-shell", + "shared-ui-primitives", + "streams", + "system-health", + "timeline", + "users-access" + ] + }, + { + "path": "web/js/pages/hls-page.jsx", + "ext": ".jsx", + "lines": 101, + "kind": "page-entry", + "proposed_domain_owner": "live", + "imports": [ + "web/js/components/preact/AuthGate.jsx", + "web/js/components/preact/Footer.jsx", + "web/js/components/preact/Header.jsx", + "web/js/components/preact/LiveView.jsx", + "web/js/components/preact/ToastContainer.jsx", + "web/js/i18n.js", + "web/js/query-client.js", + "web/js/sentry.js", + "web/js/utils/auth-utils.js" + ], + "external_imports": [ + "preact", + "preact/hooks" + ], + "imported_by": [], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "auth", + "toast", + "query" + ], + "ui_operation_ids": [ + "UI-287" + ], + "tests": [] + }, + { + "path": "web/js/pages/index-page.jsx", + "ext": ".jsx", + "lines": 124, + "kind": "page-entry", + "proposed_domain_owner": "live", + "imports": [ + "web/js/components/preact/AuthGate.jsx", + "web/js/components/preact/Footer.jsx", + "web/js/components/preact/Header.jsx", + "web/js/components/preact/LiveView.jsx", + "web/js/components/preact/SetupWizard.jsx", + "web/js/components/preact/ToastContainer.jsx", + "web/js/i18n.js", + "web/js/query-client.js", + "web/js/sentry.js", + "web/js/utils/auth-utils.js", + "web/js/utils/live-view-url.js" + ], + "external_imports": [ + "preact", + "preact/hooks" + ], + "imported_by": [], + "reachable_from_entries": [ + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "auth", + "toast", + "query" + ], + "ui_operation_ids": [ + "UI-288", + "UI-289" + ], + "tests": [] + }, + { + "path": "web/js/pages/investigation-page.jsx", + "ext": ".jsx", + "lines": 29, + "kind": "page-entry", + "proposed_domain_owner": "investigation", + "imports": [ + "web/js/components/preact/AuthGate.jsx", + "web/js/components/preact/Footer.jsx", + "web/js/components/preact/Header.jsx", + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/investigation/InvestigationView.jsx", + "web/js/i18n.js", + "web/js/query-client.js", + "web/js/sentry.js", + "web/js/utils/auth-utils.js" + ], + "external_imports": [ + "preact" + ], + "imported_by": [], + "reachable_from_entries": [ + "web/js/pages/investigation-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "auth", + "toast", + "query" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/pages/login-page.jsx", + "ext": ".jsx", + "lines": 29, + "kind": "page-entry", + "proposed_domain_owner": "shared-auth", + "imports": [ + "web/js/components/preact/LoginView.jsx", + "web/js/components/preact/ToastContainer.jsx", + "web/js/i18n.js", + "web/js/query-client.js", + "web/js/sentry.js" + ], + "external_imports": [ + "preact" + ], + "imported_by": [], + "reachable_from_entries": [ + "web/js/pages/login-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "toast", + "query" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/pages/plates-page.jsx", + "ext": ".jsx", + "lines": 28, + "kind": "page-entry", + "proposed_domain_owner": "lpr", + "imports": [ + "web/js/components/preact/AuthGate.jsx", + "web/js/components/preact/Footer.jsx", + "web/js/components/preact/Header.jsx", + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/lpr/PlatesView.jsx", + "web/js/i18n.js", + "web/js/query-client.js", + "web/js/utils/auth-utils.js" + ], + "external_imports": [ + "preact" + ], + "imported_by": [], + "reachable_from_entries": [ + "web/js/pages/plates-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "auth", + "toast", + "query" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/pages/recordings-page.jsx", + "ext": ".jsx", + "lines": 44, + "kind": "page-entry", + "proposed_domain_owner": "recordings", + "imports": [ + "web/js/components/preact/AuthGate.jsx", + "web/js/components/preact/BatchDeleteModal.jsx", + "web/js/components/preact/Footer.jsx", + "web/js/components/preact/Header.jsx", + "web/js/components/preact/RecordingsView.jsx", + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/UI.jsx", + "web/js/i18n.js", + "web/js/query-client.js", + "web/js/sentry.js", + "web/js/utils/auth-utils.js" + ], + "external_imports": [ + "preact" + ], + "imported_by": [], + "reachable_from_entries": [ + "web/js/pages/recordings-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "auth", + "toast", + "modal", + "query" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/pages/settings-page.jsx", + "ext": ".jsx", + "lines": 39, + "kind": "page-entry", + "proposed_domain_owner": "settings", + "imports": [ + "web/js/components/preact/AuthGate.jsx", + "web/js/components/preact/Footer.jsx", + "web/js/components/preact/Header.jsx", + "web/js/components/preact/SettingsView.jsx", + "web/js/components/preact/ToastContainer.jsx", + "web/js/i18n.js", + "web/js/query-client.js", + "web/js/sentry.js", + "web/js/utils/auth-utils.js" + ], + "external_imports": [ + "preact" + ], + "imported_by": [], + "reachable_from_entries": [ + "web/js/pages/settings-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "auth", + "toast", + "query" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/pages/streams-page.jsx", + "ext": ".jsx", + "lines": 39, + "kind": "page-entry", + "proposed_domain_owner": "streams", + "imports": [ + "web/js/components/preact/AuthGate.jsx", + "web/js/components/preact/Footer.jsx", + "web/js/components/preact/Header.jsx", + "web/js/components/preact/StreamsView.jsx", + "web/js/components/preact/ToastContainer.jsx", + "web/js/i18n.js", + "web/js/query-client.js", + "web/js/sentry.js", + "web/js/utils/auth-utils.js" + ], + "external_imports": [ + "preact" + ], + "imported_by": [], + "reachable_from_entries": [ + "web/js/pages/streams-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "auth", + "toast", + "query" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/pages/system-page.jsx", + "ext": ".jsx", + "lines": 39, + "kind": "page-entry", + "proposed_domain_owner": "system-health", + "imports": [ + "web/js/components/preact/AuthGate.jsx", + "web/js/components/preact/Footer.jsx", + "web/js/components/preact/Header.jsx", + "web/js/components/preact/SystemView.jsx", + "web/js/components/preact/ToastContainer.jsx", + "web/js/i18n.js", + "web/js/query-client.js", + "web/js/sentry.js", + "web/js/utils/auth-utils.js" + ], + "external_imports": [ + "preact" + ], + "imported_by": [], + "reachable_from_entries": [ + "web/js/pages/system-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "auth", + "toast", + "query" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/pages/timeline-page.jsx", + "ext": ".jsx", + "lines": 39, + "kind": "page-entry", + "proposed_domain_owner": "timeline", + "imports": [ + "web/js/components/preact/AuthGate.jsx", + "web/js/components/preact/Footer.jsx", + "web/js/components/preact/Header.jsx", + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/timeline/TimelinePage.jsx", + "web/js/i18n.js", + "web/js/query-client.js", + "web/js/sentry.js", + "web/js/utils/auth-utils.js" + ], + "external_imports": [ + "preact" + ], + "imported_by": [], + "reachable_from_entries": [ + "web/js/pages/timeline-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "auth", + "toast", + "query" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/pages/users-page.jsx", + "ext": ".jsx", + "lines": 39, + "kind": "page-entry", + "proposed_domain_owner": "users-access", + "imports": [ + "web/js/components/preact/AuthGate.jsx", + "web/js/components/preact/Footer.jsx", + "web/js/components/preact/Header.jsx", + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/UsersView.jsx", + "web/js/i18n.js", + "web/js/query-client.js", + "web/js/sentry.js", + "web/js/utils/auth-utils.js" + ], + "external_imports": [ + "preact" + ], + "imported_by": [], + "reachable_from_entries": [ + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [ + "i18n", + "auth", + "toast", + "query" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/query-client.js", + "ext": ".js", + "lines": 237, + "kind": "module", + "proposed_domain_owner": "shared-data-query", + "imports": [ + "web/js/fetch-utils.js" + ], + "external_imports": [ + "@preact-signals/query" + ], + "imported_by": [ + "web/js/components/preact/BatchDeleteModal.jsx", + "web/js/components/preact/EventRoutingView.jsx", + "web/js/components/preact/FleetView.jsx", + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/Header.jsx", + "web/js/components/preact/HealthView.jsx", + "web/js/components/preact/LiveView.jsx", + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/RecordingsView.jsx", + "web/js/components/preact/SettingsView.jsx", + "web/js/components/preact/StreamsView.jsx", + "web/js/components/preact/SystemView.jsx", + "web/js/components/preact/UsersView.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx", + "web/js/components/preact/fleet/BulkOrganizeModal.jsx", + "web/js/components/preact/fleet/CollectionManager.jsx", + "web/js/components/preact/fleet/CollectionSelectorBuilder.jsx", + "web/js/components/preact/fleet/OrganizationManager.jsx", + "web/js/components/preact/fleet/SavedViewsBar.jsx", + "web/js/components/preact/fleet/StaticCollectionMembers.jsx", + "web/js/components/preact/fleet/collectionMembership.js", + "web/js/components/preact/investigation/InvestigationActions.jsx", + "web/js/components/preact/investigation/InvestigationBookmarks.jsx", + "web/js/components/preact/investigation/InvestigationView.jsx", + "web/js/components/preact/live/LiveBuildingPlan.jsx", + "web/js/components/preact/live/LiveOperatorNavigator.jsx", + "web/js/components/preact/live/cameraFavorites.js", + "web/js/components/preact/lpr/PlatesView.jsx", + "web/js/components/preact/recordings/recordingsAPI.jsx", + "web/js/components/preact/settings/Go2rtcTab.jsx", + "web/js/components/preact/settings/StorageTab.jsx", + "web/js/components/preact/settings/WorkspacesTab.jsx", + "web/js/components/preact/system/HealthIncidentHistory.jsx", + "web/js/components/preact/system/StorageHealth.jsx", + "web/js/components/preact/system/SystemHealth.jsx", + "web/js/components/preact/system/WebServiceInfo.jsx", + "web/js/components/preact/timeline/TimelinePage.jsx", + "web/js/components/preact/users/AccessPolicyModal.jsx", + "web/js/components/preact/users/ApiKeyModal.jsx", + "web/js/components/preact/users/AuditDecisionModes.jsx", + "web/js/components/preact/users/AuditHistoryModal.jsx", + "web/js/components/preact/users/RoleManagerModal.jsx", + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/login-page.jsx", + "web/js/pages/plates-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/system-page.jsx", + "web/js/pages/timeline-page.jsx", + "web/js/pages/users-page.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/login-page.jsx", + "web/js/pages/plates-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/system-page.jsx", + "web/js/pages/timeline-page.jsx", + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [ + "auth_failure_redirect" + ], + "ui_operation_ids": [], + "tests": [ + "web/tests/cameraFavorites.spec.js", + "web/tests/collectionMembership.spec.js", + "web/tests/recordingsAPI.spec.js" + ], + "consumed_by_other_domains": [ + "events", + "fleet", + "investigation", + "live", + "lpr", + "recordings", + "settings", + "shared-auth", + "shared-shell", + "streams", + "system-health", + "timeline", + "users-access" + ] + }, + { + "path": "web/js/request-queue.js", + "ext": ".js", + "lines": 284, + "kind": "module", + "proposed_domain_owner": "shared-data-query", + "imports": [ + "web/js/utils/date-utils.js" + ], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/RecordingsView.jsx", + "web/js/components/preact/investigation/InvestigationView.jsx", + "web/js/components/preact/recordings/RecordingsGrid.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/investigation-page.jsx", + "web/js/pages/recordings-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/requestQueue.spec.js" + ], + "consumed_by_other_domains": [ + "investigation", + "recordings" + ] + }, + { + "path": "web/js/sentry.js", + "ext": ".js", + "lines": 24, + "kind": "module", + "proposed_domain_owner": "shared-shell", + "imports": [], + "external_imports": [ + "@sentry/browser" + ], + "imported_by": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/login-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/system-page.jsx", + "web/js/pages/timeline-page.jsx", + "web/js/pages/users-page.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/login-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/system-page.jsx", + "web/js/pages/timeline-page.jsx", + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [], + "consumed_by_other_domains": [ + "investigation", + "live", + "recordings", + "settings", + "shared-auth", + "streams", + "system-health", + "timeline", + "users-access" + ] + }, + { + "path": "web/js/url-param-handler.js", + "ext": ".js", + "lines": 60, + "kind": "module", + "proposed_domain_owner": "shared-shell", + "imports": [], + "external_imports": [], + "imported_by": [], + "reachable_from_entries": [], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [], + "orphan": true + }, + { + "path": "web/js/utils/auth-utils.js", + "ext": ".js", + "lines": 237, + "kind": "module", + "proposed_domain_owner": "shared-auth", + "imports": [ + "web/js/fetch-utils.js" + ], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/AuthGate.jsx", + "web/js/components/preact/FleetView.jsx", + "web/js/components/preact/Header.jsx", + "web/js/components/preact/RecordingsView.jsx", + "web/js/components/preact/SettingsView.jsx", + "web/js/components/preact/StreamsView.jsx", + "web/js/components/preact/SystemView.jsx", + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/plates-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/system-page.jsx", + "web/js/pages/timeline-page.jsx", + "web/js/pages/users-page.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/plates-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/system-page.jsx", + "web/js/pages/timeline-page.jsx", + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [ + "auth_failure_redirect" + ], + "ui_operation_ids": [ + "UI-290" + ], + "tests": [], + "consumed_by_other_domains": [ + "fleet", + "investigation", + "live", + "lpr", + "recordings", + "settings", + "shared-shell", + "streams", + "system-health", + "timeline", + "users-access" + ] + }, + { + "path": "web/js/utils/batch-delete-status.js", + "ext": ".js", + "lines": 17, + "kind": "module", + "proposed_domain_owner": "recordings", + "imports": [ + "web/js/i18n.js" + ], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/BatchDeleteModal.jsx", + "web/js/components/preact/recordings/recordingsAPI.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/recordings-page.jsx", + "web/js/pages/timeline-page.jsx" + ], + "shared_dependencies_used": [ + "i18n" + ], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/utils/date-utils.js", + "ext": ".js", + "lines": 121, + "kind": "module", + "proposed_domain_owner": "shared-shell", + "imports": [], + "external_imports": [ + "dayjs", + "dayjs/plugin/utc" + ], + "imported_by": [ + "web/js/components/preact/DetectionOverlay.jsx", + "web/js/components/preact/Footer.jsx", + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/MobileTileGestures.jsx", + "web/js/components/preact/RecordingsView.jsx", + "web/js/components/preact/SettingsView.jsx", + "web/js/components/preact/SnapshotManager.jsx", + "web/js/components/preact/Toast.jsx", + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/UI.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx", + "web/js/components/preact/ZoneEditor.jsx", + "web/js/components/preact/recordings/urlUtils.js", + "web/js/components/preact/system/LogsPoller.jsx", + "web/js/components/preact/system/StorageHealth.jsx", + "web/js/components/preact/timeline/TimelinePage.jsx", + "web/js/components/preact/timeline/TimelinePlayer.jsx", + "web/js/components/preact/timeline/TimelineSegments.jsx", + "web/js/components/preact/users/ApiKeyModal.jsx", + "web/js/components/preact/users/UsersTable.jsx", + "web/js/request-queue.js", + "web/js/utils/settings-utils.js" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/login-page.jsx", + "web/js/pages/plates-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/system-page.jsx", + "web/js/pages/timeline-page.jsx", + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [], + "consumed_by_other_domains": [ + "live", + "recordings", + "settings", + "shared-data-query", + "shared-ui-primitives", + "streams", + "system-health", + "timeline", + "users-access" + ] + }, + { + "path": "web/js/utils/detection-polling.js", + "ext": ".js", + "lines": 57, + "kind": "module", + "proposed_domain_owner": "live", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/DetectionOverlay.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [ + "UI-291" + ], + "tests": [ + "web/tests/detectionPolling.spec.js" + ] + }, + { + "path": "web/js/utils/dom-utils.js", + "ext": ".js", + "lines": 271, + "kind": "module", + "proposed_domain_owner": "shared-shell", + "imports": [], + "external_imports": [], + "imported_by": [], + "reachable_from_entries": [], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [], + "orphan": true + }, + { + "path": "web/js/utils/eptz-config.js", + "ext": ".js", + "lines": 92, + "kind": "module", + "proposed_domain_owner": "streams", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/FisheyeEptzCanvas.jsx", + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/StreamsView.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx", + "web/js/components/preact/investigation/InvestigationView.jsx", + "web/js/components/preact/timeline/TimelinePlayer.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/timeline-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/eptzConfig.spec.js" + ], + "consumed_by_other_domains": [ + "investigation", + "live", + "timeline" + ] + }, + { + "path": "web/js/utils/live-video-errors.js", + "ext": ".js", + "lines": 36, + "kind": "module", + "proposed_domain_owner": "live", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/liveVideoErrors.spec.js" + ] + }, + { + "path": "web/js/utils/live-view-url.js", + "ext": ".js", + "lines": 93, + "kind": "module", + "proposed_domain_owner": "live", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/LiveView.jsx", + "web/js/pages/index-page.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/liveViewTransportTabs.spec.js", + "web/tests/liveViewUrl.spec.js" + ] + }, + { + "path": "web/js/utils/navigation-utils.js", + "ext": ".js", + "lines": 28, + "kind": "module", + "proposed_domain_owner": "shared-shell", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/Header.jsx", + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/plates-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/system-page.jsx", + "web/js/pages/timeline-page.jsx", + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/navigation-utils.spec.js" + ], + "consumed_by_other_domains": [ + "live" + ] + }, + { + "path": "web/js/utils/playback-transport.js", + "ext": ".js", + "lines": 70, + "kind": "module", + "proposed_domain_owner": "live", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/PlaybackTransportCell.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/playbackTransport.spec.js" + ] + }, + { + "path": "web/js/utils/player-telemetry.js", + "ext": ".js", + "lines": 98, + "kind": "module", + "proposed_domain_owner": "live", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [ + "UI-292", + "UI-293" + ], + "tests": [] + }, + { + "path": "web/js/utils/recording-playback.js", + "ext": ".js", + "lines": 90, + "kind": "module", + "proposed_domain_owner": "recordings", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/UI.jsx", + "web/js/components/preact/investigation/InvestigationView.jsx", + "web/js/components/preact/recordings/recordingsAPI.jsx", + "web/js/components/preact/timeline/TimelinePlayer.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/timeline-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/recordingPlayback.spec.js" + ], + "consumed_by_other_domains": [ + "investigation", + "shared-ui-primitives", + "timeline" + ] + }, + { + "path": "web/js/utils/reduceMotion.js", + "ext": ".js", + "lines": 123, + "kind": "module", + "proposed_domain_owner": "shared-shell", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/SettingsView.jsx", + "web/js/components/preact/settings/AppearanceTab.jsx", + "web/js/components/preact/timeline/TimelinePage.jsx", + "web/js/i18n.js" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/login-page.jsx", + "web/js/pages/plates-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/system-page.jsx", + "web/js/pages/timeline-page.jsx", + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [], + "consumed_by_other_domains": [ + "settings", + "shared-i18n", + "timeline" + ] + }, + { + "path": "web/js/utils/settings-utils.js", + "ext": ".js", + "lines": 238, + "kind": "module", + "proposed_domain_owner": "shared-shell", + "imports": [ + "web/js/fetch-utils.js", + "web/js/utils/date-utils.js" + ], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/Header.jsx", + "web/js/components/preact/LiveView.jsx", + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx", + "web/js/components/preact/ZoneEditor.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/plates-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/settings-page.jsx", + "web/js/pages/streams-page.jsx", + "web/js/pages/system-page.jsx", + "web/js/pages/timeline-page.jsx", + "web/js/pages/users-page.jsx" + ], + "shared_dependencies_used": [ + "auth_failure_redirect" + ], + "ui_operation_ids": [ + "UI-294" + ], + "tests": [ + "web/tests/go2rtcSettings.spec.js" + ], + "consumed_by_other_domains": [ + "live", + "streams" + ] + }, + { + "path": "web/js/utils/stream-availability.js", + "ext": ".js", + "lines": 23, + "kind": "module", + "proposed_domain_owner": "streams", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/StreamsView.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/streams-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/streamAvailability.spec.js" + ] + }, + { + "path": "web/js/utils/stream-connection-gate.js", + "ext": ".js", + "lines": 194, + "kind": "module", + "proposed_domain_owner": "live", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/utils/stream-summaries.js", + "ext": ".js", + "lines": 57, + "kind": "module", + "proposed_domain_owner": "streams", + "imports": [ + "web/js/fetch-utils.js" + ], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/LiveView.jsx", + "web/js/components/preact/investigation/InvestigationView.jsx", + "web/js/components/preact/lpr/PlatesView.jsx", + "web/js/components/preact/recordings/recordingsAPI.jsx", + "web/js/components/preact/timeline/TimelinePage.jsx", + "web/js/components/preact/timeline/TimelinePlayer.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/investigation-page.jsx", + "web/js/pages/plates-page.jsx", + "web/js/pages/recordings-page.jsx", + "web/js/pages/timeline-page.jsx" + ], + "shared_dependencies_used": [ + "auth_failure_redirect" + ], + "ui_operation_ids": [ + "UI-295" + ], + "tests": [ + "web/tests/streamSummaries.spec.js" + ], + "consumed_by_other_domains": [ + "investigation", + "live", + "lpr", + "recordings", + "timeline" + ] + }, + { + "path": "web/js/utils/theme-init.js", + "ext": ".js", + "lines": 165, + "kind": "module", + "proposed_domain_owner": "shared-shell", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/ThemeCustomizer.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/settings-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [] + }, + { + "path": "web/js/utils/url-utils.js", + "ext": ".js", + "lines": 88, + "kind": "module", + "proposed_domain_owner": "shared-shell", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/StreamConfigModal.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/streams-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [], + "consumed_by_other_domains": [ + "streams" + ] + }, + { + "path": "web/js/utils/webrtc-ice-gathering.js", + "ext": ".js", + "lines": 78, + "kind": "module", + "proposed_domain_owner": "live", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/WebRTCVideoCell.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/webrtcIceGathering.spec.js" + ] + }, + { + "path": "web/js/utils/workspace-preferences.js", + "ext": ".js", + "lines": 24, + "kind": "module", + "proposed_domain_owner": "shared-shell", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/live/LiveOperatorNavigator.jsx", + "web/js/components/preact/settings/WorkspacesTab.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/hls-page.jsx", + "web/js/pages/index-page.jsx", + "web/js/pages/settings-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/workspacePreferences.spec.js" + ], + "consumed_by_other_domains": [ + "live", + "settings" + ] + }, + { + "path": "web/js/utils/zone-editor-geometry.js", + "ext": ".js", + "lines": 112, + "kind": "module", + "proposed_domain_owner": "streams", + "imports": [], + "external_imports": [], + "imported_by": [ + "web/js/components/preact/ZoneEditor.jsx" + ], + "reachable_from_entries": [ + "web/js/pages/streams-page.jsx" + ], + "shared_dependencies_used": [], + "ui_operation_ids": [], + "tests": [ + "web/tests/zoneEditorGeometry.spec.js" + ] + } + ], + "orphans": { + "paths": [ + "web/js/components/preact/Toast.jsx", + "web/js/components/preact/common/Image.jsx", + "web/js/url-param-handler.js", + "web/js/utils/dom-utils.js" + ], + "note": "Not reachable from any HTML entry via static/dynamic imports. Toast.jsx has no importers at all." + }, + "jsx_files_without_markup": [ + "web/js/components/preact/system/LogsPoller.jsx" + ], + "tests": [ + { + "path": "tests/integration/fixtures/recording-media.ts", + "kind": "playwright-fixture", + "imports_app_modules": [] + }, + { + "path": "tests/integration/fixtures/recording.mp4", + "kind": "playwright-fixture" + }, + { + "path": "tests/integration/fixtures/test-fixtures.ts", + "kind": "playwright-fixture", + "imports_app_modules": [], + "api_paths_exercised": [ + "/api/auth/login", + "/api/auth/logout", + "/api/auth/users", + "/api/auth/verify", + "/api/recordings", + "/api/settings", + "/api/setup/status", + "/api/streams", + "/api/system", + "/logout" + ] + }, + { + "path": "tests/integration/global-setup.ts", + "kind": "playwright-support", + "imports_app_modules": [], + "api_paths_exercised": [ + "/go2rtc", + "go2rtc/go2rtc", + "http://localhost:{}/api/auth/users", + "http://localhost:{}/api/setup/status", + "http://localhost:{}/api/streams", + "http://localhost:{}/api/system", + "{}/api/streams", + "{}/go2rtc" + ] + }, + { + "path": "tests/integration/global-teardown.ts", + "kind": "playwright-support", + "imports_app_modules": [] + }, + { + "path": "tests/integration/go2rtc.api.spec.ts", + "kind": "playwright-api", + "imports_app_modules": [], + "api_paths_exercised": [ + "/api/streams", + "/api/webrtc", + "/go2rtc", + "GET /api/streams returns registered streams", + "GET /api/webrtc endpoint is accessible" + ] + }, + { + "path": "tests/integration/lightnvr.api.spec.ts", + "kind": "playwright-api", + "imports_app_modules": [], + "api_paths_exercised": [ + "/api/recordings", + "/api/settings", + "/api/streams", + "/api/streams/playwright_get_test", + "/api/system", + "/api/system/info", + "GET /api/recordings returns recording list", + "GET /api/settings returns settings", + "GET /api/streams returns stream list", + "GET /api/streams/{name} returns stream details", + "GET /api/system/info returns system info and version summary", + "POST /api/streams creates a new stream" + ] + }, + { + "path": "tests/integration/lightnvr.ui.spec.ts", + "kind": "playwright-ui", + "imports_app_modules": [], + "api_paths_exercised": [ + "**/api/auth/login/config" + ] + }, + { + "path": "tests/integration/pages/BasePage.ts", + "kind": "playwright-page-object", + "imports_app_modules": [], + "api_paths_exercised": [ + "/logout" + ] + }, + { + "path": "tests/integration/pages/LiveViewPage.ts", + "kind": "playwright-page-object", + "imports_app_modules": [] + }, + { + "path": "tests/integration/pages/LoginPage.ts", + "kind": "playwright-page-object", + "imports_app_modules": [] + }, + { + "path": "tests/integration/pages/RecordingsPage.ts", + "kind": "playwright-page-object", + "imports_app_modules": [] + }, + { + "path": "tests/integration/pages/SettingsPage.ts", + "kind": "playwright-page-object", + "imports_app_modules": [] + }, + { + "path": "tests/integration/pages/StreamsPage.ts", + "kind": "playwright-page-object", + "imports_app_modules": [], + "api_paths_exercised": [ + "/api/streams" + ] + }, + { + "path": "tests/integration/pages/SystemPage.ts", + "kind": "playwright-page-object", + "imports_app_modules": [] + }, + { + "path": "tests/integration/pages/TimelinePage.ts", + "kind": "playwright-page-object", + "imports_app_modules": [] + }, + { + "path": "tests/integration/pages/UsersPage.ts", + "kind": "playwright-page-object", + "imports_app_modules": [] + }, + { + "path": "tests/integration/pages/index.ts", + "kind": "playwright-page-object", + "imports_app_modules": [] + }, + { + "path": "tests/integration/recordings-url-utils.ui.spec.ts", + "kind": "playwright-ui", + "imports_app_modules": [ + "web/js/components/preact/recordings/urlUtils.js" + ] + }, + { + "path": "tests/integration/specs/api-tokens.ui.spec.ts", + "kind": "playwright-ui", + "imports_app_modules": [], + "api_paths_exercised": [ + "**/api/**", + "/api/auth/users", + "/api/authorization/actions", + "/api/authorization/users/1/tokens", + "/api/camera-collections", + "/api/camera-tags", + "/api/locations" + ] + }, + { + "path": "tests/integration/specs/auth.api.spec.ts", + "kind": "playwright-api", + "imports_app_modules": [], + "api_paths_exercised": [ + "/api/auth/login", + "/api/auth/logout", + "/api/auth/users", + "/api/auth/users/{}", + "/api/auth/users/{}/api-key", + "/api/auth/users/{}/login-lockout/clear", + "/api/auth/verify", + "/api/system", + "DELETE /api/auth/users/{id} deletes user", + "GET /api/auth/users returns user list", + "GET /api/auth/users/{id} returns user details", + "GET /api/auth/verify checks session", + "POST /api/auth/login with invalid credentials", + "POST /api/auth/login with valid credentials", + "POST /api/auth/logout ends session", + "POST /api/auth/users creates new user", + "POST /api/auth/users stores bare IP login restrictions as single-host CIDRs", + "POST /api/auth/users/{id}/api-key generates API key", + "POST /api/auth/users/{id}/login-lockout/clear clears a user login lockout", + "PUT /api/auth/users/{id} updates user" + ] + }, + { + "path": "tests/integration/specs/auth.ui.spec.ts", + "kind": "playwright-ui", + "imports_app_modules": [] + }, + { + "path": "tests/integration/specs/camera-favorites.ui.spec.ts", + "kind": "playwright-ui", + "imports_app_modules": [], + "api_paths_exercised": [ + "**/api/**", + "**/go2rtc/api/ws*", + "/api/auth/verify", + "/api/camera-collections", + "/api/camera-favorites", + "/api/client-config", + "/api/fleet/cameras/query", + "/api/setup/status", + "/api/streams" + ] + }, + { + "path": "tests/integration/specs/comprehensive.api.spec.ts", + "kind": "playwright-api", + "imports_app_modules": [], + "api_paths_exercised": [ + "/api/health", + "/api/recordings", + "/api/recordings/protected", + "/api/settings", + "/api/streams", + "/api/streams/test", + "/api/streams/{}", + "/api/system", + "/api/system/logs", + "/api/system/status", + "DELETE /api/streams/{name} deletes stream", + "GET /api/health returns health status", + "GET /api/recordings returns recording list", + "GET /api/recordings with pagination", + "GET /api/recordings/protected returns protected count", + "GET /api/settings returns all settings", + "GET /api/streams returns stream list", + "GET /api/streams/{name} returns stream details", + "GET /api/system returns complete system info", + "GET /api/system/logs returns logs", + "GET /api/system/status returns status", + "POST /api/streams creates a new stream", + "POST /api/streams/test tests stream connection", + "PUT /api/streams/{name} updates stream" + ] + }, + { + "path": "tests/integration/specs/detection-overlay-requests.ui.spec.ts", + "kind": "playwright-ui", + "imports_app_modules": [], + "api_paths_exercised": [ + "**/api/**", + "**/go2rtc/api/ws*", + "/api/auth/verify", + "/api/client-config", + "/api/detection/results", + "/api/detection/results/cam_a", + "/api/setup/status", + "/api/streams" + ] + }, + { + "path": "tests/integration/specs/health-monitoring-state.ui.spec.ts", + "kind": "playwright-ui", + "imports_app_modules": [], + "api_paths_exercised": [ + "**/api/**", + "/api/auth/verify", + "/api/client-config", + "/api/system/health", + "/api/system/health/incidents", + "/api/system/info" + ] + }, + { + "path": "tests/integration/specs/investigation.ui.spec.ts", + "kind": "playwright-ui", + "imports_app_modules": [], + "api_paths_exercised": [ + "**/api/investigations/search", + "**/api/investigations/timeline", + "**/api/recordings/play/568*", + "**/api/streams" + ] + }, + { + "path": "tests/integration/specs/live-inventory-refresh.ui.spec.ts", + "kind": "playwright-ui", + "imports_app_modules": [], + "api_paths_exercised": [ + "**/api/**", + "**/go2rtc/api/ws*", + "/api/auth/verify", + "/api/client-config", + "/api/setup/status", + "/api/streams" + ] + }, + { + "path": "tests/integration/specs/liveview.ui.spec.ts", + "kind": "playwright-ui", + "imports_app_modules": [], + "api_paths_exercised": [ + "**/api/stream.m3u8*", + "**/api/webrtc", + "**/hls/**", + "/api/streams" + ] + }, + { + "path": "tests/integration/specs/recordings.ui.spec.ts", + "kind": "playwright-ui", + "imports_app_modules": [], + "api_paths_exercised": [ + "**/api/client-config*", + "**/api/detection/results/cam1", + "**/api/recordings", + "**/api/recordings/601", + "**/api/recordings/602", + "**/api/recordings/detection-labels*", + "**/api/recordings/play/601*", + "**/api/recordings/play/602*", + "**/api/recordings/tags*", + "**/api/recordings/thumbnail/602/**", + "**/api/settings*", + "**/api/streams*", + "/api/recordings/play/601" + ] + }, + { + "path": "tests/integration/specs/roles.ui.spec.ts", + "kind": "playwright-ui", + "imports_app_modules": [], + "api_paths_exercised": [ + "/api/auth/users" + ] + }, + { + "path": "tests/integration/specs/settings.ui.spec.ts", + "kind": "playwright-ui", + "imports_app_modules": [] + }, + { + "path": "tests/integration/specs/stream-snapshot-requests.ui.spec.ts", + "kind": "playwright-ui", + "imports_app_modules": [], + "api_paths_exercised": [ + "**/api/**", + "/api/auth/verify", + "/api/client-config", + "/api/detection/models", + "/api/streams", + "/api/streams/cam_a", + "/go2rtc/api/frame.jpeg" + ] + }, + { + "path": "tests/integration/specs/streams.ui.spec.ts", + "kind": "playwright-ui", + "imports_app_modules": [], + "api_paths_exercised": [ + "**/api/detection/models", + "**/api/streams/{}/full", + "**/go2rtc/api/frame.jpeg*", + "{}/api/streams/{}", + "{}/api/system" + ] + }, + { + "path": "tests/integration/specs/substream-fullscreen.ui.spec.ts", + "kind": "playwright-ui", + "imports_app_modules": [], + "api_paths_exercised": [ + "**/go2rtc/api/frame.jpeg*", + "**/go2rtc/api/streams*", + "**/hls/**" + ] + }, + { + "path": "tests/integration/specs/system-health-mqtt.api.spec.ts", + "kind": "playwright-api", + "imports_app_modules": [], + "api_paths_exercised": [ + "/api/event-destinations", + "/api/event-destinations/{}", + "/api/event-routes", + "/api/event-routes/preview", + "/api/event-routes/{}", + "/api/metrics", + "/api/system/health" + ] + }, + { + "path": "tests/integration/specs/system-health-settings.ui.spec.ts", + "kind": "playwright-ui", + "imports_app_modules": [], + "api_paths_exercised": [ + "**/api/auth/sessions", + "**/api/auth/trusted-devices", + "**/api/settings" + ] + }, + { + "path": "tests/integration/specs/system-health.api.spec.ts", + "kind": "playwright-api", + "imports_app_modules": [], + "api_paths_exercised": [ + "/api/health", + "/api/metrics", + "/api/system/health", + "/api/system/health/incidents" + ] + }, + { + "path": "tests/integration/specs/system-health.ui.spec.ts", + "kind": "playwright-ui", + "imports_app_modules": [], + "api_paths_exercised": [ + "**/api/system/health", + "**/api/system/health/incidents", + "**/api/system/info", + "/api/auth/verify", + "/api/system/health", + "/api/system/health/incidents" + ] + }, + { + "path": "tests/integration/specs/system.ui.spec.ts", + "kind": "playwright-ui", + "imports_app_modules": [] + }, + { + "path": "tests/integration/specs/timeline-boundary.ui.spec.ts", + "kind": "playwright-ui", + "imports_app_modules": [], + "api_paths_exercised": [ + "**/api/detection/results/**", + "**/api/recordings", + "**/api/recordings/**", + "**/api/recordings/play/*", + "**/api/timeline/segments", + "**/api/timeline/segments-by-ids" + ] + }, + { + "path": "tests/integration/specs/timeline.ui.spec.ts", + "kind": "playwright-ui", + "imports_app_modules": [] + }, + { + "path": "tests/integration/specs/users.ui.spec.ts", + "kind": "playwright-ui", + "imports_app_modules": [] + }, + { + "path": "tests/integration/synthetic-onvif-prebuffer.py", + "kind": "integration-helper-script" + }, + { + "path": "web/tests/README.md", + "kind": "doc" + }, + { + "path": "web/tests/RUNNING_TESTS_LOCALLY.md", + "kind": "doc" + }, + { + "path": "web/tests/apiTokenPolicy.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/components/preact/users/apiTokenPolicy.js" + ] + }, + { + "path": "web/tests/auditHistory.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/components/preact/users/auditHistory.js" + ] + }, + { + "path": "web/tests/authorizationPolicy.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/components/preact/users/authorizationPolicy.js" + ] + }, + { + "path": "web/tests/browserDialogs.spec.js", + "kind": "jest-unit", + "imports_app_modules": [], + "source_tree_walk_extension_filter": [ + "/\\.(?:js|jsx)$/" + ] + }, + { + "path": "web/tests/cameraFavorites.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/components/preact/live/cameraFavorites.js" + ], + "jest_mock_paths": [ + "web/js/query-client.js" + ] + }, + { + "path": "web/tests/collectionMembership.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/components/preact/fleet/collectionMembership.js" + ], + "jest_mock_paths": [ + "web/js/query-client.js" + ] + }, + { + "path": "web/tests/collectionSelector.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/components/preact/fleet/collectionSelector.js" + ] + }, + { + "path": "web/tests/detectionPolling.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/utils/detection-polling.js" + ] + }, + { + "path": "web/tests/e2e/pages/LoginPage.js", + "kind": "selenium-e2e-support", + "imports_app_modules": [] + }, + { + "path": "web/tests/e2e/pages/NavigationMenu.js", + "kind": "selenium-e2e-support", + "imports_app_modules": [] + }, + { + "path": "web/tests/e2e/pages/StreamsPage.js", + "kind": "selenium-e2e-support", + "imports_app_modules": [] + }, + { + "path": "web/tests/e2e/specs/login.spec.js", + "kind": "selenium-e2e-spec", + "imports_app_modules": [] + }, + { + "path": "web/tests/e2e/specs/navigation.spec.js", + "kind": "selenium-e2e-spec", + "imports_app_modules": [] + }, + { + "path": "web/tests/e2e/specs/streams.spec.js", + "kind": "selenium-e2e-spec", + "imports_app_modules": [] + }, + { + "path": "web/tests/e2e/utils/test-utils.js", + "kind": "selenium-e2e-support", + "imports_app_modules": [] + }, + { + "path": "web/tests/eptzConfig.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/utils/eptz-config.js" + ] + }, + { + "path": "web/tests/eventRouting.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/components/preact/events/eventRouting.js" + ] + }, + { + "path": "web/tests/fetchUtils.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/fetch-utils.js" + ] + }, + { + "path": "web/tests/fleetOrganization.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/components/preact/fleet/fleetOrganization.js" + ] + }, + { + "path": "web/tests/fleetQuery.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/components/preact/fleet/fleetQuery.js" + ] + }, + { + "path": "web/tests/forcedPasswordChange.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/components/preact/forcedPasswordChange.js" + ] + }, + { + "path": "web/tests/fullscreenFallback.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/components/preact/fullscreenApi.js" + ] + }, + { + "path": "web/tests/go2rtcSettings.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/fetch-utils.js", + "web/js/utils/settings-utils.js" + ], + "jest_mock_paths": [ + "web/js/fetch-utils.js" + ] + }, + { + "path": "web/tests/i18n.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/i18n.js" + ], + "literal_source_paths": [ + "web/js/components/preact/Footer.jsx" + ], + "reads_source_text": true + }, + { + "path": "web/tests/install-and-run.sh", + "kind": "script" + }, + { + "path": "web/tests/investigationUtils.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/components/preact/investigation/investigationUtils.js" + ] + }, + { + "path": "web/tests/layoutStyles.spec.js", + "kind": "jest-unit", + "imports_app_modules": [] + }, + { + "path": "web/tests/lazyFilterOptions.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/components/preact/recordings/lazyFilterOptions.js" + ] + }, + { + "path": "web/tests/liveDisplayMode.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/components/preact/useLiveDisplayMode.js" + ] + }, + { + "path": "web/tests/liveFullscreenPreferences.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/components/preact/useAlwaysFullscreenOnTap.js" + ] + }, + { + "path": "web/tests/liveOperator.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/components/preact/live/liveOperator.js" + ] + }, + { + "path": "web/tests/liveSlideshow.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/components/preact/useLiveSlideshow.js" + ] + }, + { + "path": "web/tests/liveSlideshowControl.spec.js", + "kind": "jest-unit", + "imports_app_modules": [], + "literal_source_paths": [ + "web/js/components/preact/LiveSlideshowControl.jsx" + ], + "esbuild_external_suffix_stubs": [ + "i18n.js" + ], + "bundles_with_esbuild": true + }, + { + "path": "web/tests/liveSlideshowHook.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/components/preact/useLiveSlideshow.js" + ] + }, + { + "path": "web/tests/liveTileStatus.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/components/preact/liveTileStatus.js" + ] + }, + { + "path": "web/tests/liveVideoErrors.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/utils/live-video-errors.js" + ] + }, + { + "path": "web/tests/liveViewTransportTabs.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/utils/live-view-url.js" + ] + }, + { + "path": "web/tests/liveViewUrl.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/utils/live-view-url.js" + ] + }, + { + "path": "web/tests/locale-coverage.spec.js", + "kind": "jest-unit", + "imports_app_modules": [], + "source_tree_walk_extension_filter": [ + "/\\.jsx?$/" + ] + }, + { + "path": "web/tests/lprSearch.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/components/preact/lpr/lprSearch.js", + "web/js/components/preact/timeline/timelineUtils.js" + ] + }, + { + "path": "web/tests/mobileLiveGestures.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/components/preact/mobileLiveGestures.js" + ] + }, + { + "path": "web/tests/navigation-utils.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/utils/navigation-utils.js" + ] + }, + { + "path": "web/tests/open-issues-regressions.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/components/preact/liveStreamPolicy.js", + "web/js/components/preact/recordings/formatUtils.js", + "web/js/components/preact/system/SystemUtils.js", + "web/js/components/preact/timeline/timelineUtils.js" + ], + "literal_source_paths": [ + "web/js/components/preact/investigation/InvestigationView.jsx" + ], + "reads_source_text": true + }, + { + "path": "web/tests/pictureInPicture.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/components/preact/pictureInPicture.js" + ] + }, + { + "path": "web/tests/planSketch.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/components/preact/live/planSketch.js" + ] + }, + { + "path": "web/tests/platesView.spec.js", + "kind": "jest-unit", + "imports_app_modules": [], + "literal_source_paths": [ + "web/js/components/preact/lpr/PlatesView.jsx" + ], + "esbuild_external_suffix_stubs": [ + "query-client.js", + "i18n.js", + "fetch-utils.js", + "stream-summaries.js", + "ModalDialog.jsx", + "ToastContainer.jsx" + ], + "bundles_with_esbuild": true + }, + { + "path": "web/tests/playbackTransport.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/utils/playback-transport.js" + ] + }, + { + "path": "web/tests/ptzActions.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/components/preact/ptzActions.js" + ] + }, + { + "path": "web/tests/recordingPlayback.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/utils/recording-playback.js" + ] + }, + { + "path": "web/tests/recordingsAPI.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/recordings/recordingsAPI.jsx", + "web/js/fetch-utils.js", + "web/js/query-client.js" + ], + "jest_mock_paths": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/fetch-utils.js", + "web/js/i18n.js", + "web/js/query-client.js" + ] + }, + { + "path": "web/tests/recordingsUrlUtils.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/components/preact/recordings/urlUtils.js" + ] + }, + { + "path": "web/tests/requestQueue.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/request-queue.js" + ] + }, + { + "path": "web/tests/setup.cjs", + "kind": "jest-setup", + "imports_app_modules": [] + }, + { + "path": "web/tests/storageTargetRouting.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/components/preact/settings/storageTargetRouting.js" + ] + }, + { + "path": "web/tests/streamAvailability.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/utils/stream-availability.js" + ], + "literal_source_paths": [ + "web/js/components/preact/StreamsView.jsx" + ], + "reads_source_text": true + }, + { + "path": "web/tests/streamSummaries.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/utils/stream-summaries.js" + ] + }, + { + "path": "web/tests/systemHealth.spec.js", + "kind": "jest-unit", + "imports_app_modules": [], + "literal_source_paths": [ + "web/js/components/preact/system/HealthIncidentHistory.jsx", + "web/js/components/preact/system/MemoryStorage.jsx", + "web/js/components/preact/system/SystemHealth.jsx" + ], + "bundles_with_esbuild": true + }, + { + "path": "web/tests/systemHealthSettings.spec.js", + "kind": "jest-unit", + "imports_app_modules": [], + "literal_source_paths": [ + "web/js/components/preact/settings/HealthTab.jsx" + ], + "bundles_with_esbuild": true + }, + { + "path": "web/tests/timeline-utils.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/components/preact/timeline/timelineUtils.js" + ] + }, + { + "path": "web/tests/useAsyncAction.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/hooks/useAsyncAction.js" + ] + }, + { + "path": "web/tests/webrtcIceGathering.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/utils/webrtc-ice-gathering.js" + ] + }, + { + "path": "web/tests/workspacePreferences.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/utils/workspace-preferences.js" + ] + }, + { + "path": "web/tests/zoneEditorGeometry.spec.js", + "kind": "jest-unit", + "imports_app_modules": [ + "web/js/utils/zone-editor-geometry.js" + ] + } + ], + "extension_sensitive_consumers": { + "tests": [ + { + "test": "tests/integration/recordings-url-utils.ui.spec.ts", + "kind": "playwright-ui", + "reasons": [ + "Playwright spec imports app source directly: web/js/components/preact/recordings/urlUtils.js" + ], + "targets": [ + "web/js/components/preact/recordings/urlUtils.js" + ] + }, + { + "test": "web/tests/browserDialogs.spec.js", + "kind": "jest-unit", + "reasons": [ + "walks web/js and filters by extension regex /\\.(?:js|jsx)$/ (TS/TSX files would be silently skipped)" + ], + "targets": [] + }, + { + "test": "web/tests/i18n.spec.js", + "kind": "jest-unit", + "reasons": [ + "literal source path(s): web/js/components/preact/Footer.jsx" + ], + "targets": [ + "web/js/components/preact/Footer.jsx", + "web/js/i18n.js" + ] + }, + { + "test": "web/tests/liveSlideshowControl.spec.js", + "kind": "jest-unit", + "reasons": [ + "literal source path(s): web/js/components/preact/LiveSlideshowControl.jsx", + "esbuild external/stub keyed by filename suffix: i18n.js" + ], + "targets": [ + "web/js/components/preact/LiveSlideshowControl.jsx" + ] + }, + { + "test": "web/tests/locale-coverage.spec.js", + "kind": "jest-unit", + "reasons": [ + "walks web/js and filters by extension regex /\\.jsx?$/ (TS/TSX files would be silently skipped)" + ], + "targets": [] + }, + { + "test": "web/tests/open-issues-regressions.spec.js", + "kind": "jest-unit", + "reasons": [ + "literal source path(s): web/js/components/preact/investigation/InvestigationView.jsx" + ], + "targets": [ + "web/js/components/preact/investigation/InvestigationView.jsx", + "web/js/components/preact/liveStreamPolicy.js", + "web/js/components/preact/recordings/formatUtils.js", + "web/js/components/preact/system/SystemUtils.js", + "web/js/components/preact/timeline/timelineUtils.js" + ] + }, + { + "test": "web/tests/platesView.spec.js", + "kind": "jest-unit", + "reasons": [ + "literal source path(s): web/js/components/preact/lpr/PlatesView.jsx", + "esbuild external/stub keyed by filename suffix: query-client.js, i18n.js, fetch-utils.js, stream-summaries.js, ModalDialog.jsx, ToastContainer.jsx" + ], + "targets": [ + "web/js/components/preact/lpr/PlatesView.jsx" + ] + }, + { + "test": "web/tests/recordingsAPI.spec.js", + "kind": "jest-unit", + "reasons": [ + "imports/mocks .jsx module path(s): web/js/components/preact/ToastContainer.jsx, web/js/components/preact/recordings/recordingsAPI.jsx, web/js/components/preact/ToastContainer.jsx" + ], + "targets": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/recordings/recordingsAPI.jsx", + "web/js/fetch-utils.js", + "web/js/i18n.js", + "web/js/query-client.js" + ] + }, + { + "test": "web/tests/streamAvailability.spec.js", + "kind": "jest-unit", + "reasons": [ + "literal source path(s): web/js/components/preact/StreamsView.jsx" + ], + "targets": [ + "web/js/components/preact/StreamsView.jsx", + "web/js/utils/stream-availability.js" + ] + }, + { + "test": "web/tests/systemHealth.spec.js", + "kind": "jest-unit", + "reasons": [ + "literal source path(s): web/js/components/preact/system/HealthIncidentHistory.jsx, web/js/components/preact/system/MemoryStorage.jsx, web/js/components/preact/system/SystemHealth.jsx" + ], + "targets": [ + "web/js/components/preact/system/HealthIncidentHistory.jsx", + "web/js/components/preact/system/MemoryStorage.jsx", + "web/js/components/preact/system/SystemHealth.jsx" + ] + }, + { + "test": "web/tests/systemHealthSettings.spec.js", + "kind": "jest-unit", + "reasons": [ + "literal source path(s): web/js/components/preact/settings/HealthTab.jsx" + ], + "targets": [ + "web/js/components/preact/settings/HealthTab.jsx" + ] + } + ], + "config_and_tooling": [ + { + "path": "web/jest.config.cjs", + "detail": "testMatch '**/tests/**/*.spec.js' and transform '^.+\\.jsx?$' only: .ts/.tsx specs/modules are neither discovered nor transformed." + }, + { + "path": "web/jest.e2e.config.cjs", + "detail": "testMatch '**/tests/e2e/**/*.spec.js', transform '^.+\\.jsx?$'." + }, + { + "path": "web/babel.config.cjs", + "detail": "Babel config used by Jest; several specs note it has no JSX transform, hence esbuild bundling in tests." + }, + { + "path": "web/eslint.config.js", + "detail": "files globs 'js/**/*.js','js/**/*.jsx' and 'js/components/**/*.{js,jsx}' (i18n rule): TS/TSX would not be linted." + }, + { + "path": "web/eslint-rules/no-literal-ui-string.js", + "detail": "Looks up web/i18n-literal-baseline.json by path relative to web/js/components/ including extension; a .jsx->.tsx rename loses the allowance (lint fails) or needs a new key (T10)." + }, + { + "path": "web/i18n-literal-baseline.json", + "detail": "Path-keyed (e.g. \"preact/StreamConfigModal.jsx\") per-file literal allowance counts." + }, + { + "path": "web/vite.config.js", + "detail": "rollupOptions.input lists 11 HTML pages; MISSING_APP_JS_IMPORTERS=['streams.html']; aliases @js/@css/@img." + }, + { + "path": "web/*.html", + "detail": "Each HTML page references ./js/pages/.jsx by literal path in +`; + legacyB = ` +`; + } + + write(path.join(dist, 'index.html'), ` + + + +${noise(11, 900)}${legacyA}\n`); + write(path.join(dist, 'other.html'), ` + + +${legacyB}\n`); + + const manifest = { locales: locales.map((code) => ({ code, name: code })) }; + write(path.join(dist, 'locales', 'manifest.json'), JSON.stringify(manifest), { gz: false }); + for (const code of locales) { + write(path.join(dist, 'locales', `${code}.json`), JSON.stringify({ k: noise(code.length * 13, 5000) })); + write(path.join(dist, 'locales', `${code}.png`), Buffer.alloc(300, 7), { gz: false }); + } + // Source locale manifest: lists every available locale. + write(path.join(web, 'public', 'locales', 'manifest.json'), + JSON.stringify({ locales: [{ code: 'en' }, { code: 'de' }] }), { gz: false }); + + // Make sources clearly older than the build output. + const past = new Date(Date.now() - 3600_000); + for (const f of ['js/app.js', 'index.html', 'vite.config.js', 'public/locales/manifest.json']) { + fs.utimesSync(path.join(web, f), past, past); + } + return { root, web, dist, sizes: { shared, lazy, entryA, entryB, css } }; +} + +function bytes(s) { + return Buffer.byteLength(s); +} +function gz9(s) { + return zlib.gzipSync(s, { level: 9 }).length; +} +function br11(s) { + return zlib.brotliCompressSync(s, { + params: { [zlib.constants.BROTLI_PARAM_QUALITY]: 11 }, + }).length; +} +function fileSize(p) { + return fs.statSync(p).size; +} + +function profileDef(overrides = {}) { + return { + expect: { legacy: true, locales: 'all' }, + entries: ['index', 'other'], + budgets: {}, + ...overrides, + }; +} + +function writeBudgets(dir, profiles) { + const file = path.join(dir, 'web-budgets.json'); + fs.writeFileSync(file, `${JSON.stringify({ schemaVersion: 1, profiles }, null, 2)}\n`); + return file; +} + +function runCli(args) { + return spawnSync(process.execPath, [script, ...args], { encoding: 'utf8' }); +} + +test('accounts installed vs transfer bytes and never double-counts shared chunks', () => { + const fx = makeFixture(); + const report = analyzeDist(fx.dist); + const m = flattenMetrics(report); + + // Installed bytes: every file on disk exactly once, including .gz copies. + let total = 0; + let gzTotal = 0; + const walk = (d) => { + for (const e of fs.readdirSync(d, { withFileTypes: true })) { + const p = path.join(d, e.name); + if (e.isDirectory()) walk(p); + else { + total += fileSize(p); + if (e.name.endsWith('.gz')) gzTotal += fileSize(p); + } + } + }; + walk(fx.dist); + assert.equal(m['installed.totalBytes'], total); + assert.equal(m['installed.precompressedCopyBytes'], gzTotal); + assert.equal(m['installed.originalBytes'], total - gzTotal); + + // Unique modern JS: each chunk once, although shared-AAAA.js is used by two entries. + const modernJs = [fx.sizes.shared, fx.sizes.lazy, fx.sizes.entryA, fx.sizes.entryB]; + assert.equal(m['transfer.unique.modernJs.raw'], modernJs.reduce((a, s) => a + bytes(s), 0)); + assert.equal(m['transfer.unique.modernJs.gzip'], modernJs.reduce((a, s) => a + gz9(s), 0)); + assert.equal(m['transfer.unique.modernJs.brotli'], modernJs.reduce((a, s) => a + br11(s), 0)); + // "served" is what the LightNVR server sends: the precompressed .gz sibling. + const servedShared = fileSize(path.join(fx.dist, 'assets', 'shared-AAAA.js.gz')); + assert.ok(servedShared < bytes(fx.sizes.shared)); + + // Per-entry initial JS = entry + its static closure; lazy chunks are separate. + assert.equal(m['entries.index.modern.initialJs.raw'], bytes(fx.sizes.entryA) + bytes(fx.sizes.shared)); + assert.equal(m['entries.index.modern.initialJs.gzip'], gz9(fx.sizes.entryA) + gz9(fx.sizes.shared)); + assert.equal(m['entries.index.modern.lazyJs.raw'], bytes(fx.sizes.lazy)); + assert.equal(m['entries.other.modern.initialJs.raw'], bytes(fx.sizes.entryB) + bytes(fx.sizes.shared)); + assert.equal(m['entries.other.modern.lazyJs.raw'], 0); + assert.equal(m['entries.index.modern.initialCss.raw'], bytes(fx.sizes.css)); + assert.equal( + m['entries.index.modern.initialJs.served'], + fileSize(path.join(fx.dist, 'assets', 'entry-a-CCCC.js.gz')) + servedShared, + ); + + // The shared chunk is reported once, attributed to both entries. + const shared = report.chunks.shared.find((c) => c.file === 'assets/shared-AAAA.js'); + assert.ok(shared, 'shared chunk listed'); + assert.deepEqual([...shared.entries].sort(), ['index', 'other']); + assert.ok(report.chunks.lazy.some((c) => c.file === 'assets/lazy-BBBB.js')); + + // Legacy graph resolved through System.register and t.import(). + assert.ok(m['entries.index.legacy.initialJs.raw'] > 0); + assert.equal( + m['entries.index.legacy.lazyJs.raw'], + fileSize(path.join(fx.dist, 'assets', 'lazy-legacy-RRRR.js')), + ); + assert.equal(m['build.legacyChunks'] > 0, true); + + // Locales are counted as installed bytes, including their .gz copies. + const locBytes = ['en', 'de'].reduce((a, c) => { + const base = path.join(fx.dist, 'locales', `${c}.json`); + return a + fileSize(base) + fileSize(`${base}.gz`) + fileSize(path.join(fx.dist, 'locales', `${c}.png`)); + }, fileSize(path.join(fx.dist, 'locales', 'manifest.json'))); + assert.equal(m['installed.locales.totalBytes'], locBytes); + assert.equal(m['build.localeCount'], 2); +}); + +test('check passes for a fresh, in-budget fixture', () => { + const fx = makeFixture(); + const result = checkProfile({ + distDir: fx.dist, + webRoot: fx.web, + profileName: 'default', + profile: profileDef({ budgets: { 'installed.totalBytes': 10_000_000 } }), + }); + assert.deepEqual(result.failures, []); + assert.equal(result.ok, true); +}); + +test('check rejects a missing dist and a missing referenced artifact', () => { + const fx = makeFixture(); + const profile = profileDef({ budgets: { 'installed.totalBytes': 10_000_000 } }); + + fs.rmSync(path.join(fx.dist, 'assets', 'shared-AAAA.js')); + let result = checkProfile({ distDir: fx.dist, webRoot: fx.web, profileName: 'default', profile }); + assert.equal(result.ok, false); + assert.ok(result.failures.some((f) => /missing/i.test(f)), result.failures.join('\n')); + + fs.rmSync(path.join(fx.dist, 'other.html')); + result = checkProfile({ distDir: fx.dist, webRoot: fx.web, profileName: 'default', profile }); + assert.ok(result.failures.some((f) => /missing entry.*other/i.test(f)), result.failures.join('\n')); + + fs.rmSync(fx.dist, { recursive: true }); + result = checkProfile({ distDir: fx.dist, webRoot: fx.web, profileName: 'default', profile }); + assert.equal(result.ok, false); + assert.ok(result.failures.some((f) => /missing/i.test(f))); +}); + +test('check rejects a stale dist (sources newer than the build)', () => { + const fx = makeFixture(); + const future = new Date(Date.now() + 60_000); + fs.utimesSync(path.join(fx.web, 'js', 'app.js'), future, future); + const result = checkProfile({ + distDir: fx.dist, + webRoot: fx.web, + profileName: 'default', + profile: profileDef({ budgets: { 'installed.totalBytes': 10_000_000 } }), + }); + assert.equal(result.ok, false); + assert.ok(result.failures.some((f) => /stale/i.test(f) && /js\/app\.js/.test(f)), result.failures.join('\n')); +}); + +test('check rejects a dist built for a different profile', () => { + const fx = makeFixture({ legacy: true, locales: ['en', 'de'] }); + const result = checkProfile({ + distDir: fx.dist, + webRoot: fx.web, + profileName: 'modern', + profile: profileDef({ expect: { legacy: false, locales: ['en'] }, budgets: { 'installed.totalBytes': 10_000_000 } }), + }); + assert.equal(result.ok, false); + assert.ok(result.failures.some((f) => /legacy/i.test(f)), result.failures.join('\n')); + assert.ok(result.failures.some((f) => /locale/i.test(f)), result.failures.join('\n')); +}); + +test('check rejects a deliberately oversized artifact and unknown budget metrics', () => { + const fx = makeFixture(); + const baseline = flattenMetrics(analyzeDist(fx.dist)); + const profile = profileDef({ + budgets: { + 'installed.totalBytes': baseline['installed.totalBytes'] + 100, + 'entries.index.modern.initialJs.served': baseline['entries.index.modern.initialJs.served'] + 100, + }, + }); + assert.equal(checkProfile({ distDir: fx.dist, webRoot: fx.web, profileName: 'default', profile }).ok, true); + + // Grow the shared chunk by ~200 KiB of incompressible data. + const sharedPath = path.join(fx.dist, 'assets', 'shared-AAAA.js'); + const big = `${fs.readFileSync(sharedPath, 'utf8')}const pad=${JSON.stringify(crypto.randomBytes(150_000).toString('base64'))};\n`; + write(sharedPath, big); + const result = checkProfile({ distDir: fx.dist, webRoot: fx.web, profileName: 'default', profile }); + assert.equal(result.ok, false); + assert.ok(result.failures.some((f) => /installed\.totalBytes/.test(f) && /over budget/i.test(f)), result.failures.join('\n')); + assert.ok(result.failures.some((f) => /entries\.index\.modern\.initialJs\.served/.test(f)), result.failures.join('\n')); + + const unknown = checkProfile({ + distDir: fx.dist, + webRoot: fx.web, + profileName: 'default', + profile: profileDef({ budgets: { 'no.such.metric': 5 } }), + }); + assert.equal(unknown.ok, false); + assert.ok(unknown.failures.some((f) => /no\.such\.metric/.test(f))); + + const empty = checkProfile({ distDir: fx.dist, webRoot: fx.web, profileName: 'default', profile: profileDef() }); + assert.equal(empty.ok, false, 'a profile without budgets must not pass'); +}); + +test('CLI --check exits nonzero on overrun and never rewrites the budgets file', () => { + const fx = makeFixture(); + const budgetsFile = writeBudgets(fx.root, { + default: profileDef({ budgets: { 'installed.totalBytes': 1000 } }), + }); + const before = fs.readFileSync(budgetsFile); + const beforeStat = fs.statSync(budgetsFile); + + const res = runCli(['--check', '--profile', 'default', '--dist', fx.dist, '--web-root', fx.web, '--budgets', budgetsFile]); + assert.notEqual(res.status, 0, res.stdout + res.stderr); + assert.match(res.stdout + res.stderr, /over budget/i); + + const after = fs.readFileSync(budgetsFile); + assert.ok(before.equals(after), 'budgets file content changed'); + assert.equal(fs.statSync(budgetsFile).mtimeMs, beforeStat.mtimeMs, 'budgets file was rewritten'); + assert.deepEqual(fs.readdirSync(fx.root).sort(), ['web', 'web-budgets.json'], 'no sidecar files written'); + + // Unknown profile and missing budgets file are hard failures too. + assert.notEqual(runCli(['--check', '--profile', 'nope', '--dist', fx.dist, '--web-root', fx.web, '--budgets', budgetsFile]).status, 0); + assert.notEqual(runCli(['--check', '--profile', 'default', '--dist', fx.dist, '--web-root', fx.web, '--budgets', path.join(fx.root, 'absent.json')]).status, 0); +}); + +test('CLI --check succeeds for an in-budget fixture and --report prints JSON', () => { + const fx = makeFixture(); + const budgetsFile = writeBudgets(fx.root, { + default: profileDef({ budgets: { 'installed.totalBytes': 10_000_000 } }), + }); + const ok = runCli(['--check', '--profile', 'default', '--dist', fx.dist, '--web-root', fx.web, '--budgets', budgetsFile]); + assert.equal(ok.status, 0, ok.stdout + ok.stderr); + + const rep = runCli(['--report', '--dist', fx.dist]); + assert.equal(rep.status, 0, rep.stderr); + const parsed = JSON.parse(rep.stdout); + assert.equal(parsed.metrics['installed.totalBytes'] > 0, true); +}); + +test('reference parsers ignore data URIs, comments, bare CSS packages and template imports', () => { + const css = `/* see the @import line */@import "tailwindcss";@import "./theme/x.css"; +.a{background:url("data:image/svg+xml,%3Csvg filter='url(%23a)'%3E")}.b{background:url(../img/b.png)}`; + assert.deepEqual(parseCss(css).sort(), ['../img/b.png', './theme/x.css']); + + const js = 'import{a as b}from"./a-1.js";import"./b-2.js";export*from"./c-3.js";' + + 'x.import("./d-4.js");import(`./e-${n}.js`);import"data:text/javascript,1";' + + 'const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./f-5.js","../css/g.css"])))=>i.map(i=>d[i]);'; + const r = parseJs(js); + assert.deepEqual(r.statics.sort(), ['./a-1.js', './b-2.js', './c-3.js']); + assert.deepEqual(r.dynamics.sort(), ['../css/g.css', './d-4.js', './f-5.js']); +}); From 561d235c7408574b44dc997580736a0063afcae6 Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Sat, 31 Oct 2026 03:04:51 -0400 Subject: [PATCH 005/230] T3: map operational coverage and archive native baseline Record CI-executed vs registered native tests, PRD scenario gaps for media/storage/lifecycle, production feature profiles, calibration constants, and bounded C improvement candidates. Baseline: 146/153 with the as-specified build (FFmpeg 7.1 headers vs 8.0 libs on this host), 153/153 with consistent system FFmpeg. Co-Authored-By: Claude Opus 5.5 --- quality/evidence/T3.md | 213 ++ quality/native-profiles.json | 347 ++++ quality/operational-coverage.json | 3136 +++++++++++++++++++++++++++++ 3 files changed, 3696 insertions(+) create mode 100644 quality/evidence/T3.md create mode 100644 quality/native-profiles.json create mode 100644 quality/operational-coverage.json diff --git a/quality/evidence/T3.md b/quality/evidence/T3.md new file mode 100644 index 000000000..b7037bce6 --- /dev/null +++ b/quality/evidence/T3.md @@ -0,0 +1,213 @@ +# T3 evidence: operational coverage map and native baseline + +- **Task:** T3, map operational coverage and reproduce the native baseline +- **Date:** 2026-10-31 +- **Outputs:** `quality/operational-coverage.json`, `quality/native-profiles.json`, this file +- **TDD:** `reason_not_testable`: this is an inventory and baseline task. It changes no production code or tests, so there is no behavior to drive with a failing test first. Verification is the cmake/ctest output below plus `python3 -m json.tool` on both JSON outputs. + +## Revision + +| Item | Value | +| --- | --- | +| Plan baseline | `1b8d4332` | +| Built tree | `7db92e0d` (HEAD of `feat/engineering-foundation`) | +| Source equivalence | Same compiled sources as `8927bc8a` | +| `1b8d4332..8927bc8a` | PR #692 added SPDX/copyright comment headers to 517 `.c`/`.h` files (+3613/−1). Filtering the diff for non-comment `+` lines returns nothing. The single `−` line is a blank line. | +| `8927bc8a..7db92e0d` | `docs/prd/README.md` only | +| Tracked changes to build inputs | None (`git status -- src include tests CMakeLists.txt cmake db third_party`). The only untracked path there is `tests/quality/` from T4, which the native build does not use. | + +Because the code is unchanged apart from comments, I built from the working tree and did not create a `1b8d4332` worktree. The archive keeps the plan's `1b8d4332` path name. + +## Validation commands (as specified) + +``` +cmake -S . -B build/eng-T3 -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTS=ON -DENABLE_SOD=OFF -DENABLE_LITERT=OFF -DENABLE_GO2RTC=OFF -DENABLE_MQTT=OFF -> exit 0 +cmake --build build/eng-T3 -j2 -> exit 0 (333 lines containing "warning:") +ctest --test-dir build/eng-T3 --output-on-failure --no-tests=error -R 'test_(system_health_proc|stream_state|shutdown_coordinator|mp4_audio_recovery|mp4_writer_watchdog|storage_retention_sqlite)$' + -> exit 8: 5/6 passed, test_mp4_audio_recovery FAILED +ctest --test-dir build/eng-T3 --output-on-failure -> exit 8: 146/153 passed, 7 FAILED (123 s) +python3 -m json.tool quality/operational-coverage.json -> ok +python3 -m json.tool quality/native-profiles.json -> ok +``` + +Raw logs are in `build/eng-artifacts/T3/` and are also copied into each archive's `config/` directory. + +### Baseline failures: host environment, not code (BLOCKER for the as-specified command) + +The as-specified build fails these 7 tests: + +- `test_audio_transcoder` +- `test_mp4_forced_reconnect` +- `test_mp4_audio_recovery` +- `test_hls_cleanup` +- `test_mp4_segment_boundaries` +- `test_audio_voice_filter_faults` +- `test_udt_recording` + +**Root cause: FFmpeg header/library ABI mismatch on this host.** + +- `/usr/local/lib/pkgconfig/libav*.pc` and `/usr/local/include/libav*` come from a stale FFmpeg 7.1 install (libavcodec 61.19.101). Its libraries were moved to `/usr/local/lib/ffmpeg-local-backup`. +- pkg-config searches `/usr/local` first, and gcc searches `/usr/local/include` before `/usr/include/x86_64-linux-gnu`. The build therefore compiles against the 7.1 headers. +- The linker and loader resolve the Ubuntu `libavcodec-dev 8.0.1` libraries instead (`libavcodec.so.62`, `libavutil.so.60`). `ldd build/eng-T3/bin/test_mp4_audio_recovery` shows this. + +The mismatch shows up in three ways: + +- **`avcodec_open2` returns −22.** The encoder sees "Picture size 32x0 is invalid" because the `AVCodecContext` layout differs between the two versions. This hits `test_mp4_audio_recovery` (4/4 cases) and `test_hls_cleanup` (2/8 cases). +- **ASan SEGV in `av_buffer_unref` (libavutil.so.60).** This follows "Failed to allocate resampled frame buffer: Invalid argument", caused by the `AVFrame` layout. It hits `test_audio_transcoder`, `test_mp4_forced_reconnect` and `test_audio_voice_filter_faults`. +- **Leak reports** (`test_mp4_segment_boundaries`) and **transcode failures** (`test_udt_recording`) come from the same mismatch. + +**Diagnostic control build.** This build uses the same flags, but `PKG_CONFIG_LIBDIR` points at the system `.pc` files and `-isystem /usr/include/x86_64-linux-gnu` is added. It ends up with FFmpeg 8.0.1 headers and libraries on both sides: + +``` +build/eng-T3/sysffmpeg-debug: ctest full -> 153/153 passed (exit 0, 123 s) + targeted 6 -> 6/6 passed (exit 0) +``` + +So the baseline has **no code failures** for the lean feature set. On this host, the as-specified command is reproducible only after one of these fixes: + +- removing or renaming the stale `/usr/local` FFmpeg headers and `.pc` files (needs sudo; not done), or +- exporting the two overrides above. + +T13's `run-native.py` should pin dependency resolution, or detect a header/soname major mismatch and fail. Otherwise later tasks will report these failures as regressions. + +Per-test status for both builds (`baseline_as_specified`, `baseline_system_ffmpeg`) is recorded under `tests[]` in `quality/operational-coverage.json`. + +## Archive: `build/eng-baseline/1b8d4332/native/` (gitignored) + +| Artifact | Build | `bin/lightnvr` sha256 | Bytes | Runs on | Valid for | +| --- | --- | --- | --- | --- | --- | +| `debug-lean-as-specified/` | Debug + ASan/UBSan; SOD/LiteRT/go2rtc/MQTT off | `021cc7261d2e186cc1575784c69d1d4f1a3d4cad72882854527806fdefa86aeb` | 33425768 | This host only. FFmpeg ABI is mismatched. | Reproducing the as-specified result only | +| `debug-lean-system-ffmpeg/` | Same flags with consistent FFmpeg 8.0.1 | `4f86c1b53621cd7d06c2e30a5c12b355d988301441e3105c4c1965d80937f3d9` | 33433264 | x86_64 with glibc ≥ 2.43 and Ubuntu 26.04 FFmpeg sonames | Lean functional and sanitizer baseline. Not valid for perf, RSS or size. | +| `release-full-system-ffmpeg/` | Release -O3, container feature set: SOD dynamic, LiteRT+XNNPACK, go2rtc, MQTT, S3, audio filters/denoise | `a56ce959b256f08dd04fd72e0ad8054669ad300464894d99995efca2928a61d1` | 10362224 | This host. Needs `LD_LIBRARY_PATH=/bin` (otherwise an unrelated host `/usr/local/lib/libsod.so.1` is loaded). | Approximate amd64 size and idle-RSS reference for T5. This is **not** the shipped container binary. | + +Each archive directory contains: + +- `bin/`: `lightnvr`, `lightnvr-ffmpeg-guard`, `rebuild_recordings`, and `libsod.so*` where applicable +- `config/CMakeCache.txt`, `config/feature-flags.txt`, `config/dependency-resolution.txt`, `config/compile_commands.json.gz`, plus the configure, build and ctest logs +- `ldd.txt`, containing `file(1)` output, `ldd` output, and NEEDED/RUNPATH entries +- `SHA256SUMS`, which verifies with `sha256sum -c` in all three directories + +The toolchain and host provenance file is `toolchain.txt` (sha256 `62e1a1dceb8a8d9e2931f89abcf39b36462e72f66a3ae8ea3a1a2904dafa38d0`). Contents: + +- gcc 15.2.0, binutils 2.46, glibc 2.43, cmake 4.2.3, make 4.4.1 +- Ubuntu 26.04.1 bare host. Not a container. +- System libraries: FFmpeg 8.0.1, SQLite 3.46.1, libuv 1.51.0, curl 8.18.0, cJSON 1.7.19, mbedTLS 3.6.5, mosquitto 2.0.22. libyaml is absent. +- Submodule SHAs + +Differences from the shipped container builds: + +- They use debian:sid with SQLite 3.53.4, libuv 1.52.1 and llhttp 9.3.1, and include libyaml. +- They are built for amd64, arm64 and arm/v7. + +No arm64, arm/v7, MIPS or physical constrained-device artifact was built or run. Cross-built or emulated artifacts would not count as physical performance evidence. + +## Coverage map summary + +The full detail is in `quality/operational-coverage.json`, which records `ci_jobs` with computed regex selections, a `tests[]` entry for every test (layer, evidence kind, `--wrap` mocks, CI jobs, baseline status), `scenarios`, `seams`, `calibration_limits` and `c_improvement_candidates`. + +### CI execution + +| Job | Tests selected | +| --- | --- | +| sanitizer | 42 (Debug/ASan; lean flags) | +| unity | 63 (Debug/ASan; lean) | +| system-health | 24 across three ctest gates (Release, MQTT on), plus the benchmark binary run directly | +| go2rtc unity | 12 (Debug; go2rtc on) | +| Playwright | `--project=ui` only, in 2 shards. The `api` and `go2rtc` projects never run in CI, except the system-health API specs. | + +There is no `schedule:` trigger in any workflow, so no scheduled media, recovery or soak lane exists. + +**Registered in the lean build but never run in CI (59 tests).** Notable ones: + +- Media: `test_mp4_writer_watchdog`, `test_mp4_segment_timestamps`, `test_mp4_faststart`, `test_hls_reconnect_backoff`, `test_onvif_poll_recovery`, `test_go2rtc_recovery` +- Storage and database: `test_storage_deletion_ledger`, `test_db_core_initialization` +- API: `test_api_read_isolation`, `test_api_handlers_system`, most `test_api_handlers_*`, and the event bus/router tests + +**Feature-gated tests that are never run in CI:** + +- `test_go2rtc_process_lifecycle`, `test_go2rtc_proxy_query`, `test_go2rtc_publish_async`, `test_go2rtc_stream_activity`, `test_go2rtc_unregister_recovery`, `test_go2rtc_websocket` +- `test_sod_unified`, `test_sod_voc` + +### Kinds of evidence + +- **Mocks.** Many recovery tests replace functions at link time with `-Wl,--wrap`: + - `test_mp4_forced_reconnect` wraps `record_segment`, `av_usleep`, config lookup, storage pause and path placement. + - `test_mp4_recovery_watchdog` wraps `sleep` and the writer start/stop/is_recording functions. + - `test_mp4_audio_recovery` wraps `av_read_frame` and `cleanup_audio_transcoder`. + - `test_api_handlers_recordings_playback` wraps 7 functions. +- **Real media.** Two sources are used: media encoded in-process with the FFmpeg library (MPEG-4/G.711), and `tests/integration/fixtures/recording.mp4` (64x64, 1 fps). Playwright uses a real server and go2rtc with `ffmpeg:virtual` test patterns. No test drives a real RTSP disconnect. +- **Hardware.** No lane has any hardware evidence. + +**Omitted features are not counted as covered.** The lean baseline compiles out SOD, LiteRT, go2rtc and MQTT, plus libyaml on this host. Production containers ship LiteRT and SOD-dynamic, but no CI lane tests them. + +### Missing cases for T27 (media recovery and segments) + +1. A real source disconnect followed by restore, asserting that recording resumes within a declared deadline. +2. ffprobe/decode playability of the segment written after recovery. Current tests assert state, not output validity. +3. Timestamp monotonicity across the reconnect boundary, within a tolerance. +4. Video-only and H.264+AAC recovery. Only G.711 A-law/µ-law paths are covered. +5. Recovery while storage is paused. `storage_should_pause_recording` is wrapped away in the current tests. +6. The `MAX_SELF_RESTARTS` (5) exhaustion path into `COOLDOWN_SECS` (300) and the retry after it. +7. Over N consecutive segments: duration within tolerance, ordering, and DB start/end/size matching each file. +8. No gap or overlap between consecutive segments. +9. Add `test_mp4_writer_watchdog`, `test_mp4_segment_timestamps` and `test_mp4_faststart` to a CI lane. They currently pass but never run in CI. + +### Missing cases for T28 (storage and retention) + +1. Real ENOSPC or EIO during an active MP4 write, on a disposable size-limited filesystem or via a write wrap. This covers the ENOSPC/EIO branches in `mp4_segment_recorder.c`. +2. `storage_should_pause_recording()` pausing and resuming in `mp4_writer_thread`. +3. EROFS on the recordings root, both at startup and mid-run. +4. The storage root unmounted and then restored, without erasing protected recordings. +5. SQLITE_FULL during a metadata update. +6. The `storage_target_health` 3000 ms timeout on a hung mount. +7. In `apply_retention_policy` for enabled streams: inherited (−1), unlimited (0) and finite retention. Today only disabled-stream variants are asserted end to end. +8. A protected file surviving the actual delete path. Protection is currently asserted only at query level. +9. Files held open by playback or export during cleanup. +10. Add `test_storage_deletion_ledger` to CI. + +### Missing cases for T29 (shutdown, restart, upgrade) + +1. Process-level SIGTERM during active recording: the process exits within a declared deadline, and this is observed separately from the 900 s `SHUTDOWN_WATCHDOG_TIMEOUT_SECONDS` force-kill and the 5 s component wait. The current sanitizer smoke test accepts any exit. +2. SIGKILL mid-segment, then restart. **`storage_reconcile_incomplete_recordings()` has no test** (`STALE_WINDOW_SEC` 3600, batch 500). +3. `PRAGMA integrity_check` and playable committed recordings after a forced kill. +4. PID-file takeover (120 s graceful wait, then SIGKILL). +5. A database from the previous release (0.45.0 / 0.44.x) upgraded in place. No such fixture exists; every test builds the schema from scratch using migrations 0001..0089. +6. The legacy `schema_version` table migration path. +7. A previous-release `lightnvr.ini`. +8. Browser `localStorage` preference keys from the previous release. +9. Downgrade documented as unsupported. + +### Numerical limits that need calibration + +These are listed in `calibration_limits`. They are production constants, not acceptance limits. Each scenario deadline must be derived from them and measured on the T5 target: + +- 5 s dead threshold, 5 restarts, 300 s cooldown, 120 s healthy reset +- writer inactivity `max(45, segment+15)` s, with a 60 s initial grace +- keyframe wait 5 s / 1 s +- reconnect backoff 500–30000 ms +- shutdown watchdog 900 s +- disk pressure thresholds at 20/10/5% free +- 300 s retention budget +- 60/900/21600 s storage cadences +- health timeout 3000 ms +- benchmark gate: heap ≤ 512 KiB and CPU ratio ≤ 0.005 + +### Candidate bounded C improvements (for T31) + +1. **C1 `stream_state` transitions.** The state machine has 6 states but no transition table or transition tests. The test file references `STREAM_STATE_*` exactly once. Proposal: extract a pure transition function. +2. **C2 `/proc` and cgroup parsing in `api_handlers_system.c`.** This code duplicates the injectable `linux_cgroup` and `linux_process` collectors and cannot be tested with fixtures. Lowest risk; matches the PRD's `/proc` example. +3. **C3 `/proc` probes in `go2rtc_process.c`.** There are 8 hard-coded sites in a heavily changed file (32 commits since 2026-04). +4. **C4 `storage_reconcile_incomplete_recordings()`.** Untested, and it mixes the finalize/prune decision with I/O. +5. **C5 a `statvfs` provider seam in `storage_manager.c`.** This would let T28 inject faults; the same pattern already exists in `storage_target_health` ops. + +The telemetry collectors (`src/telemetry/collectors/*`) already take a `proc_root`, are tested against fixtures, and look sound. They should not be refactored. + +## Files + +- Edited: `quality/operational-coverage.json`, `quality/native-profiles.json`, `quality/evidence/T3.md` +- Build output, all gitignored: + - `build/eng-T3/` (as specified) + - `build/eng-T3/sysffmpeg-debug/` + - `build/eng-T3/release-full/` + - `build/eng-artifacts/T3/` (logs and parsed results) + - `build/eng-baseline/1b8d4332/native/` diff --git a/quality/native-profiles.json b/quality/native-profiles.json new file mode 100644 index 000000000..36880c65b --- /dev/null +++ b/quality/native-profiles.json @@ -0,0 +1,347 @@ +{ + "schema_version": 1, + "task": "T3", + "generated": "2026-10-31", + "revisions": { + "plan_baseline": "1b8d4332", + "built_tree": "7db92e0d37fda1de77ad1eb74c4cdbf6ea315453", + "source_equivalent_to": "8927bc8a", + "note": "1b8d4332..8927bc8a = SPDX/copyright comment headers only (PR #692); 8927bc8a..7db92e0d = docs/prd/README.md only. Archive path keeps the plan's 1b8d4332 name." + }, + "cmake_options": { + "LIGHTNVR_PROFILE": "full (default) | embedded; embedded flips optional-feature defaults OFF and caps streams at 16", + "LIGHTNVR_MAX_STREAMS": "auto -> 1024 (full) / 16 (embedded)", + "ENABLE_SOD": "default = profile optional default (ON in full)", + "SOD_DYNAMIC_LINK": "OFF", + "ENABLE_LITERT": "default ON in full; auto-disabled when third_party/litert submodule absent", + "LITERT_WITH_XNNPACK": "ON", + "LITERT_WITH_GPU": "OFF", + "ENABLE_GO2RTC": "ON", + "ENABLE_SSL": "OFF (USE_MBEDTLS/USE_WOLFSSL OFF); mbedTLS still linked for ONVIF/auth crypto", + "HTTP_BACKEND": "libuv (+llhttp)", + "ENABLE_S3_ARCHIVE": "ON (requires libcurl >= 7.75)", + "ENABLE_AUDIO_FILTERS": "ON (libavfilter)", + "ENABLE_AUDIO_DENOISE": "profile default (ON in full)", + "ENABLE_MQTT": "profile default (ON in full)", + "ENABLE_SENTRY": "OFF", + "BUILD_TESTS": "OFF", + "libyaml": "optional; absent -> YAML validation stubbed", + "Debug build type": "adds -fsanitize=address,undefined -ggdb3 -fno-inline (CMakeLists.txt:119-130) - Debug artifacts are sanitizer builds" + }, + "production_profiles": [ + { + "id": "release-container-debian", + "source": "Dockerfile via scripts/build.sh --release --without-tests --with-sod --sod-dynamic --with-go2rtc (.github/workflows/docker-publish.yml, checkout submodules: recursive)", + "targets": [ + "linux/amd64 (ubuntu-latest)", + "linux/arm64 (ubuntu-24.04-arm native)", + "linux/arm/v7 (cross gcc arm-linux-gnueabihf on amd64, armhf sysroot)" + ], + "base": "debian:sid-slim (DEBIAN_SUITE=sid); SQLite 3.53.4 autoconf, libuv 1.52.1, llhttp 9.3.1 built from source; Node 24 web build", + "features": { + "CMAKE_BUILD_TYPE": "Release", + "LIGHTNVR_PROFILE": "full", + "ENABLE_SOD": "ON", + "SOD_DYNAMIC_LINK": "ON", + "ENABLE_GO2RTC": "ON", + "ENABLE_LITERT": "ON (default, submodule present)", + "ENABLE_MQTT": "ON (default)", + "ENABLE_S3_ARCHIVE": "ON", + "ENABLE_AUDIO_FILTERS": "ON", + "ENABLE_AUDIO_DENOISE": "ON", + "ENABLE_SENTRY": "OFF (OpenSensor hosted builds opt in)", + "GO2RTC_BINARY_PATH": "/bin/go2rtc", + "GO2RTC_CONFIG_DIR": "/etc/lightnvr/go2rtc", + "GO2RTC_API_PORT": "1984" + }, + "tests_in_lane": "none (--without-tests); arm/v7 lane only asserts ELF 32-bit ARM via file(1)" + }, + { + "id": "release-deb", + "source": ".github/workflows/debian-package.yml (same Dockerfile, DEB_BUILD=true)", + "targets": [ + "sid amd64/arm64/armhf", + "trixie amd64/arm64/armhf" + ], + "features": "same as release-container-debian", + "tests_in_lane": "none" + }, + { + "id": "release-alpine", + "source": "Dockerfile.alpine (alpine:3.24, scripts/build.sh --release --with-sod); not referenced by any workflow", + "features": { + "ENABLE_SOD": "ON (static)", + "ENABLE_GO2RTC": "build.sh default ON", + "ENABLE_LITERT": "default ON if submodule present", + "ENABLE_MQTT": "default" + }, + "tests_in_lane": "none; not built in CI" + } + ], + "ci_test_profiles": [ + { + "id": "sanitizer/asan-ubsan", + "flags": "Debug, BUILD_TESTS=ON, SOD=OFF, GO2RTC=OFF, MQTT=OFF, LiteRT auto-off (submodule not checked out)", + "arch": "amd64" + }, + { + "id": "integration-test/unity-tests", + "flags": "Debug(+ASan/UBSan), BUILD_TESTS=ON, SOD=OFF, GO2RTC=OFF, MQTT=OFF, --coverage", + "arch": "amd64" + }, + { + "id": "integration-test/system-health-tests", + "flags": "Release, BUILD_TESTS=ON, SOD=OFF, LITERT=OFF, MQTT=ON (go2rtc default ON) + MQTT-OFF variant builds lightnvr & test_system_health_policy only", + "arch": "amd64" + }, + { + "id": "integration-test/go2rtc-unity-tests", + "flags": "Debug, BUILD_TESTS=ON, SOD=OFF, GO2RTC=ON, LITERT=OFF, MQTT=OFF", + "arch": "amd64" + }, + { + "id": "integration-test/playwright-tests", + "flags": "Release, GO2RTC=ON, LITERT=OFF, SOD/MQTT default ON", + "arch": "amd64" + }, + { + "id": "static-analysis/clang-tidy", + "flags": "Release, SOD=OFF, BUILD_TESTS=OFF (compile_commands only)", + "arch": "amd64" + } + ], + "feature_coverage_gaps": [ + "ENABLE_LITERT=ON ships in containers but no CI test lane builds or tests it", + "ENABLE_SOD=ON ships (dynamic) but test_sod_unified/test_sod_voc are never run in CI; Playwright lane builds SOD but tests no detection with it", + "SOD_DYNAMIC_LINK=ON (production) is never built by a test lane", + "arm64 and arm/v7 binaries are built but never execute a test; no QEMU or native test run", + "LIGHTNVR_PROFILE=embedded (16 streams, optional features off) is never built in CI", + "ENABLE_MQTT=ON is only exercised by the system-health job (Release, no sanitizers)", + "libyaml is installed in container/deb builds (Dockerfile libyaml-dev, runtime libyaml-0-2) and in the go2rtc unity job, but not in the sanitizer/unity lanes (YAML stub path there) nor on this host", + "ENABLE_SSL=ON (OpenSSL/mbedTLS/wolfSSL) never built", + "Dockerfile.alpine/musl never built in CI", + "Lean local baseline (this archive) omits SOD, LiteRT, go2rtc, MQTT: those features are NOT covered by the baseline ctest results" + ], + "local_host": { + "toolchain_file": "build/eng-baseline/1b8d4332/native/toolchain.txt", + "os": "Ubuntu 26.04.1 LTS x86_64, kernel 7.0.0-38-generic", + "compiler": "gcc 15.2.0 (Ubuntu 15.2.0-16ubuntu1), binutils 2.46, glibc 2.43", + "cmake": "4.2.3", + "make": "GNU Make 4.4.1", + "container": "none - bare host build (not a container; differs from CI debian:sid-slim)", + "ffmpeg_hazard": "/usr/local/include/libav* and /usr/local/lib/pkgconfig/libav*.pc are stale FFmpeg 7.1 (libavcodec 61.19.101) whose libraries were moved to /usr/local/lib/ffmpeg-local-backup; system libavcodec-dev is 8.0.1 (libavcodec 62.11.100). Default pkg-config + default include order compile against 7.1 headers but link/run against 8.0 .so.62 -> ABI mismatch." + }, + "archived_artifacts": [ + { + "id": "debug-lean-as-specified", + "path": "build/eng-baseline/1b8d4332/native/debug-lean-as-specified", + "command": "cmake -S . -B build/eng-T3 -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTS=ON -DENABLE_SOD=OFF -DENABLE_LITERT=OFF -DENABLE_GO2RTC=OFF -DENABLE_MQTT=OFF && cmake --build build/eng-T3 -j2", + "build_type": "Debug + ASan/UBSan", + "ffmpeg": "headers 7.1 (/usr/local/include) vs runtime libav*.so.62 (FFmpeg 8.0.1) - MISMATCHED", + "feature_flags": { + "BUILD_TESTS": "ON", + "CMAKE_BUILD_TYPE": "Debug", + "CMAKE_C_COMPILER": "/usr/bin/cc", + "CMAKE_C_FLAGS": "", + "CMAKE_CXX_COMPILER": "/usr/bin/c++", + "CMAKE_CXX_FLAGS": "", + "ENABLE_AUDIO_DENOISE": "ON", + "ENABLE_AUDIO_FILTERS": "ON", + "ENABLE_GO2RTC": "OFF", + "ENABLE_LITERT": "OFF", + "ENABLE_MQTT": "OFF", + "ENABLE_S3_ARCHIVE": "ON", + "ENABLE_SENTRY": "OFF", + "ENABLE_SOD": "OFF", + "ENABLE_SSL": "OFF", + "GO2RTC_API_PORT": "1984", + "GO2RTC_BINARY_PATH": "/usr/local/bin/go2rtc", + "GO2RTC_CONFIG_DIR": "/etc/lightnvr/go2rtc", + "HTTP_BACKEND": "libuv", + "LIGHTNVR_MAX_STREAMS": "auto", + "LIGHTNVR_PROFILE": "full", + "LITERT_WITH_GPU": "OFF", + "LITERT_WITH_XNNPACK": "ON", + "SOD_DYNAMIC_LINK": "OFF", + "USE_MBEDTLS": "OFF", + "USE_WOLFSSL": "OFF" + }, + "lightnvr_bytes": 33425768, + "dynamic_libs_needed": [ + "libasan.so.8", + "libuv.so.1", + "libm.so.6", + "libavformat.so.62", + "libavcodec.so.62", + "libswscale.so.9", + "libswresample.so.6", + "libavutil.so.60", + "libsqlite3.so.0", + "libcurl.so.4", + "libz.so.1", + "libmbedtls.so.21", + "libmbedx509.so.7", + "libmbedcrypto.so.16", + "libatomic.so.1", + "libcjson.so.1", + "libavfilter.so.11", + "libubsan.so.1", + "libc.so.6" + ], + "sha256": { + "bin/lightnvr": "021cc7261d2e186cc1575784c69d1d4f1a3d4cad72882854527806fdefa86aeb", + "bin/lightnvr-ffmpeg-guard": "4131fc85142c0462573dc9d325fb2b625258c7608212179b1f05f9aa5fa787db", + "bin/rebuild_recordings": "30977a0449cb65e2c572bc0f5f590efa62d7fed97e1f6d03aa93296455d1763a", + "config/CMakeCache.txt": "18f6884ebe37a4d4bebd2eacd80e35f10d18461b0886ba5e8160fd8632c9be6a", + "config/feature-flags.txt": "04fe85803a7449976b5d4aec810b332c8539a3e87f6df1263f4c851e0602b353" + }, + "runs_on": "this host only (x86_64 glibc 2.43 + Ubuntu FFmpeg 8.0.1 .so.62); --version works, but FFmpeg struct ABI is wrong", + "valid_for": "reproducing the as-specified validation result only; NOT valid for functional, media, or resource measurements", + "ctest": "146/153 passed; 7 failures are FFmpeg ABI mismatch" + }, + { + "id": "debug-lean-system-ffmpeg", + "path": "build/eng-baseline/1b8d4332/native/debug-lean-system-ffmpeg", + "command": "PKG_CONFIG_LIBDIR=/usr/lib/x86_64-linux-gnu/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig cmake -S . -B build/eng-T3/sysffmpeg-debug -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTS=ON -DENABLE_SOD=OFF -DENABLE_LITERT=OFF -DENABLE_GO2RTC=OFF -DENABLE_MQTT=OFF '-DCMAKE_C_FLAGS=-isystem /usr/include/x86_64-linux-gnu' '-DCMAKE_CXX_FLAGS=-isystem /usr/include/x86_64-linux-gnu' && cmake --build build/eng-T3/sysffmpeg-debug -j8", + "build_type": "Debug + ASan/UBSan", + "ffmpeg": "FFmpeg 8.0.1 headers and libraries (libavcodec 62.11.100, libavformat 62.3.100, libavutil 60.8.100, libavfilter 11.4.100) - consistent", + "feature_flags": { + "BUILD_TESTS": "ON", + "CMAKE_BUILD_TYPE": "Debug", + "CMAKE_C_COMPILER": "/usr/bin/cc", + "CMAKE_C_FLAGS": "-isystem /usr/include/x86_64-linux-gnu", + "CMAKE_CXX_COMPILER": "/usr/bin/c++", + "CMAKE_CXX_FLAGS": "-isystem /usr/include/x86_64-linux-gnu", + "ENABLE_AUDIO_DENOISE": "ON", + "ENABLE_AUDIO_FILTERS": "ON", + "ENABLE_GO2RTC": "OFF", + "ENABLE_LITERT": "OFF", + "ENABLE_MQTT": "OFF", + "ENABLE_S3_ARCHIVE": "ON", + "ENABLE_SENTRY": "OFF", + "ENABLE_SOD": "OFF", + "ENABLE_SSL": "OFF", + "GO2RTC_API_PORT": "1984", + "GO2RTC_BINARY_PATH": "/usr/local/bin/go2rtc", + "GO2RTC_CONFIG_DIR": "/etc/lightnvr/go2rtc", + "HTTP_BACKEND": "libuv", + "LIGHTNVR_MAX_STREAMS": "auto", + "LIGHTNVR_PROFILE": "full", + "LITERT_WITH_GPU": "OFF", + "LITERT_WITH_XNNPACK": "ON", + "SOD_DYNAMIC_LINK": "OFF", + "USE_MBEDTLS": "OFF", + "USE_WOLFSSL": "OFF" + }, + "lightnvr_bytes": 33433264, + "dynamic_libs_needed": [ + "libasan.so.8", + "libuv.so.1", + "libm.so.6", + "libavformat.so.62", + "libavcodec.so.62", + "libswscale.so.9", + "libswresample.so.6", + "libavutil.so.60", + "libsqlite3.so.0", + "libcurl.so.4", + "libz.so.1", + "libmbedtls.so.21", + "libmbedx509.so.7", + "libmbedcrypto.so.16", + "libatomic.so.1", + "libcjson.so.1", + "libavfilter.so.11", + "libubsan.so.1", + "libc.so.6" + ], + "sha256": { + "bin/lightnvr": "4f86c1b53621cd7d06c2e30a5c12b355d988301441e3105c4c1965d80937f3d9", + "bin/lightnvr-ffmpeg-guard": "76db7ed8a0a058de654ecf5d566da0b51f7b2f75028b2d3e226d989e4612d63d", + "bin/rebuild_recordings": "67ee484c0b1b0378733813009ad043339cdc9a80c34635fa2acce873948a1278", + "config/CMakeCache.txt": "62c36369a0122abb25e9398172b32e0fc6a0e85b47eab8b0c9305abaa6430c93", + "config/feature-flags.txt": "a4900df173ce8486d1801154953fe6b66b383e236245467c5894fbf7bfe5d608" + }, + "runs_on": "x86_64 Linux with glibc >= 2.43 and Ubuntu 26.04 FFmpeg 8.0.1 sonames (.so.62/.so.60/.so.11); not portable to CI debian:sid-slim without matching sonames; not arm64/armv7", + "valid_for": "functional baseline for the lean feature set; sanitizer runs. NOT valid for performance/RSS/binary-size budgets (Debug, -fno-inline, ASan)", + "ctest": "153/153 passed" + }, + { + "id": "release-full-system-ffmpeg", + "path": "build/eng-baseline/1b8d4332/native/release-full-system-ffmpeg", + "command": "PKG_CONFIG_LIBDIR=/usr/lib/x86_64-linux-gnu/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig cmake -S . -B build/eng-T3/release-full -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTS=OFF -DENABLE_SOD=ON -DSOD_DYNAMIC_LINK=ON -DENABLE_GO2RTC=ON -DGO2RTC_BINARY_PATH=/bin/go2rtc -DGO2RTC_CONFIG_DIR=/etc/lightnvr/go2rtc -DGO2RTC_API_PORT=1984 -DENABLE_MQTT=ON -DENABLE_LITERT=ON -DENABLE_SENTRY=OFF '-DCMAKE_C_FLAGS=-isystem /usr/include/x86_64-linux-gnu' '-DCMAKE_CXX_FLAGS=-isystem /usr/include/x86_64-linux-gnu' && cmake --build build/eng-T3/release-full -j16", + "build_type": "Release (-O3), production feature set of the container image", + "differences_from_container": "host gcc 15.2/glibc 2.43/Ubuntu FFmpeg 8.0.1/system SQLite 3.46.1/libuv 1.51.0/llhttp built by CMake (v9.2.1 ref) vs container debian:sid + SQLite 3.53.4 + libuv 1.52.1 + llhttp 9.3.1; libyaml absent here; go2rtc binary not built/archived; web assets not included (T4 owns web)", + "feature_flags": { + "BUILD_TESTS": "OFF", + "CMAKE_BUILD_TYPE": "Release", + "CMAKE_C_COMPILER": "/usr/bin/cc", + "CMAKE_C_FLAGS": "-isystem /usr/include/x86_64-linux-gnu", + "CMAKE_CXX_COMPILER": "/usr/bin/c++", + "CMAKE_CXX_FLAGS": "-isystem /usr/include/x86_64-linux-gnu", + "ENABLE_AUDIO_DENOISE": "ON", + "ENABLE_AUDIO_FILTERS": "ON", + "ENABLE_GO2RTC": "ON", + "ENABLE_LITERT": "ON", + "ENABLE_MQTT": "ON", + "ENABLE_S3_ARCHIVE": "ON", + "ENABLE_SENTRY": "OFF", + "ENABLE_SOD": "ON", + "ENABLE_SSL": "OFF", + "GO2RTC_API_PORT": "1984", + "GO2RTC_BINARY_PATH": "/bin/go2rtc", + "GO2RTC_CONFIG_DIR": "/etc/lightnvr/go2rtc", + "HTTP_BACKEND": "libuv", + "LIGHTNVR_MAX_STREAMS": "auto", + "LIGHTNVR_PROFILE": "full", + "LITERT_WITH_GPU": "OFF", + "LITERT_WITH_XNNPACK": "ON", + "SOD_BINARY_DIR": "/home/matteius/opensensor/lightNVR/build/eng-T3/release-full/src/sod", + "SOD_DYNAMIC_LINK": "ON", + "SOD_ENABLE_INGENIC_MXU": "OFF", + "SOD_IS_TOP_LEVEL": "OFF", + "SOD_SOURCE_DIR": "/home/matteius/opensensor/lightNVR/src/sod", + "USE_GNU_SOURCE": "OFF", + "USE_MBEDTLS": "OFF", + "USE_SYSTEM_GOOGLEBENCHMARK": "OFF", + "USE_SYSTEM_GOOGLETEST": "OFF", + "USE_SYSTEM_LIBS": "OFF", + "USE_WOLFSSL": "OFF" + }, + "lightnvr_bytes": 10362224, + "dynamic_libs_needed": [ + "libuv.so.1", + "libavformat.so.62", + "libavcodec.so.62", + "libswscale.so.9", + "libswresample.so.6", + "libavutil.so.60", + "libsqlite3.so.0", + "libcurl.so.4", + "libz.so.1", + "libmbedcrypto.so.16", + "libm.so.6", + "libcjson.so.1", + "libsod.so.1", + "libavfilter.so.11", + "libmosquitto.so.1", + "libstdc++.so.6", + "libgcc_s.so.1", + "libc.so.6", + "ld-linux-x86-64.so.2" + ], + "sha256": { + "bin/libsod.so.1.1.9": "4cbb0e4c8da14d567dca4e114660af9a60f099e34ecce55f384764430a8f42ad", + "bin/lightnvr": "a56ce959b256f08dd04fd72e0ad8054669ad300464894d99995efca2928a61d1", + "bin/lightnvr-ffmpeg-guard": "5353deeacf17ce387e3b73e70c9c76a1e920bd3824808bbb533e35bd4f33838f", + "bin/rebuild_recordings": "3da682d3c8ff9e039495f15c3459df812cda4cec338d0c815779ec14d8197db4", + "config/CMakeCache.txt": "97c92507c0058bd2e29f83080bb5182c74c1d52c5b8abd75995a94611491b37f", + "config/feature-flags.txt": "7623cda967e3b9a6a22001d0b060c7816e208e6525cb46c138c9e9497f8260fc" + }, + "runs_on": "this x86_64 Ubuntu 26.04 host (same soname constraints as above). Run with LD_LIBRARY_PATH=/bin: RUNPATH $ORIGIN/../src/sod:$ORIGIN/../lib does not resolve inside the archive and the loader otherwise picks up an unrelated host /usr/local/lib/libsod.so.1 (see ldd.txt vs ldd-archive-libpath.txt). LiteRT/XNNPACK linked statically.", + "valid_for": "approximate amd64 binary-size / idle-RSS reference for T5 on this host only; not the shipped container artifact", + "status": "built OK (exit 0, 3m17s wall, -j16); --version runs" + } + ], + "artifact_target_matrix_note": "No arm64, arm/v7, MIPS, or physical constrained-device artifact was produced or executed by T3. Cross/emulated builds would not be physical performance evidence (PRD 4.5). T5 must build the pinned baseline for additional targets in an isolated checkout." +} diff --git a/quality/operational-coverage.json b/quality/operational-coverage.json new file mode 100644 index 000000000..65b3b6a05 --- /dev/null +++ b/quality/operational-coverage.json @@ -0,0 +1,3136 @@ +{ + "schema_version": 1, + "task": "T3", + "generated": "2026-10-31", + "source_prd": "docs/prd/ENG_01_Safety_Contracts_TypeScript.md#44-operational-and-compatibility-regression-coverage", + "revisions": { + "plan_baseline": "1b8d4332", + "built_tree": "7db92e0d37fda1de77ad1eb74c4cdbf6ea315453", + "built_tree_source_equivalent_to": "8927bc8a", + "difference_from_plan_baseline": "1b8d4332..8927bc8a is PR #692 (SPDX/copyright comment headers, 517 C/H files, +3613/-1; the one deletion is a blank line). 8927bc8a..7db92e0d adds docs/prd/README.md only. No compiled-code, CMake, test or workflow change; built from the working tree rather than a 1b8d4332 worktree. Untracked tests/quality/ (T4) is not part of the native build." + }, + "evidence_kind_legend": { + "pure_logic": "Layer 1: header/static-inline or single source file, no I/O", + "real_sqlite": "Temp-file SQLite created through shipped embedded migrations", + "link-wrap mocks": "-Wl,--wrap replaces named functions; behaviour behind the wrap is NOT exercised", + "synthetic_media_inproc": "Media generated in-process by the FFmpeg library encoder (MPEG-4/G.711); no external ffmpeg, camera, or network", + "fixture_media": "tests/integration/fixtures/recording.mp4 (64x64 lavfi color, 1 fps)", + "fixture_proc": "Captured /proc or /sys snapshots under tests/fixtures/system_health via injected proc_root", + "real_server": "bin/lightnvr process started by Playwright/global-setup or a shell gate", + "real_go2rtc_synthetic_media": "go2rtc from submodule with ffmpeg:virtual test patterns", + "hardware": "No hardware-dependent evidence exists in any lane; no physical device, camera, or constrained target is exercised" + }, + "scenarios": [ + { + "id": "S1-auth-permissions-redaction", + "prd_row": "Authentication, permissions, and redaction", + "required_lane": "PR contract/API tests", + "status": "partial", + "executed_evidence": [ + "C: test_authorization, test_db_auth, test_api_read_isolation, test_yaml_redact (go2rtc job), test_audit_log (unity/sanitizer)", + "Playwright ui project: auth.ui.spec.ts, roles.ui.spec.ts, users.ui.spec.ts, api-tokens.ui.spec.ts (real server)" + ], + "not_executed_in_ci": [ + "Playwright api project (auth.api.spec.ts, comprehensive.api.spec.ts, lightnvr.api.spec.ts, go2rtc.api.spec.ts): integration-test.yml runs only --project=ui", + "test_api_read_isolation is registered but not selected by any CI regex" + ], + "missing_cases": [ + "machine-readable contract per role (T11/T12/T18)", + "denied mutation leaves DB unchanged, asserted at API level for each role" + ], + "owner_tasks": [ + "T11", + "T12", + "T18", + "T39" + ] + }, + { + "id": "S2-stream-edit-async", + "prd_row": "Stream edit and async actions", + "required_lane": "PR API/UI tests", + "status": "partial", + "executed_evidence": [ + "test_db_streams (unity/sanitizer)", + "test_stream_manager", + "Playwright streams.ui.spec.ts (real server, real go2rtc)" + ], + "missing_cases": [ + "invalid input leaves config intact via API contract", + "double-submit/duplicate write", + "pending/error UI states" + ], + "owner_tasks": [ + "T11", + "T18", + "T23" + ] + }, + { + "id": "S3-unified-live-view", + "prd_row": "Unified Live view", + "required_lane": "PR unit/UI; media smoke tests", + "status": "partial", + "executed_evidence": [ + "web Jest incl. liveViewTransportTabs.spec.js (system-health P2P4 job runs npm test)", + "Playwright liveview.ui.spec.ts, substream-fullscreen.ui.spec.ts (real go2rtc synthetic media)" + ], + "not_executed_in_ci": [ + "go2rtc Playwright project" + ], + "missing_cases": [ + "media smoke asserting frames decode in browser for HLS and WebRTC paths" + ], + "owner_tasks": [ + "T23" + ] + }, + { + "id": "S4-disconnect-audio-video-recovery", + "prd_row": "Disconnect and audio/video recovery", + "required_lane": "Targeted PR tests and scheduled media runs", + "status": "partial", + "executed_evidence": [ + "test_mp4_audio_recovery (unity): G.711 A-law/mu-law recovery after interrupted session, input EOF, input error (synthetic_media_inproc + av_read_frame wrap)", + "test_mp4_forced_reconnect (unity): old session discarded, audio resumes (mock-heavy)", + "test_mp4_recovery_watchdog (unity): brief inactivity vs sustained outage restart decision; failed restart cleanup (mocked writer/sleep)", + "test_hls_reconnect_backoff, test_detection_io_recovery, test_onvif_poll_recovery (wrap-based)", + "test_go2rtc_unregister_recovery (go2rtc lean regex does not select it; see ci_jobs)" + ], + "not_executed_in_ci": [ + "test_mp4_writer_watchdog", + "test_mp4_segment_timestamps", + "test_hls_reconnect_backoff", + "test_onvif_poll_recovery", + "test_go2rtc_recovery (tests/CMakeLists.txt)" + ], + "missing_cases": [ + "real RTSP/go2rtc source killed and restored, asserting recording resumes within a declared deadline (no lane does this)", + "playability (ffprobe/decode) of the segment written AFTER recovery; current recovery tests assert state/flags, not output validity", + "timestamp continuity/monotonicity across the reconnect boundary within a declared tolerance", + "video-only and video+AAC recovery (only G.711 A-law/mu-law paths are covered)", + "recovery while storage paused/near-full (storage_should_pause_recording is wrapped away)", + "MAX_SELF_RESTARTS (5) exhaustion -> 300 s cooldown -> retry path; only one restart cycle is exercised", + "scheduled media run: none exists (no schedule: trigger in any workflow)" + ], + "owner_tasks": [ + "T27", + "T30" + ] + }, + { + "id": "S5-segment-boundaries-retention", + "prd_row": "Segment boundaries and retained recordings", + "required_lane": "PR C/SQLite tests and scheduled media runs", + "status": "partial", + "executed_evidence": [ + "test_mp4_segment_boundaries (unity/sanitizer): keyframe at duration closes segment; non-keyframe waits; faststart snapshot", + "test_mp4_faststart (NOT in any CI regex)", + "test_storage_retention_sqlite (unity/sanitizer): time/detection retention, protected never returned, quota order, tiered, pressure scoped to target", + "test_storage_manager_retention (unity): quota oldest-first, delete failure keeps metadata, disabled-stream inherited/unlimited/finite, deleted-stream expiry, transcode cache removal", + "test_storage_deletion_ledger, test_storage_target_pressure_cleanup, test_storage_migration" + ], + "missing_cases": [ + "segment duration within tolerance and ordering across N consecutive segments, verified by ffprobe on the written files", + "recordings table start/end/size metadata matches the produced file (duration/size) for each segment", + "no gap/overlap between consecutive segment timestamps beyond a declared tolerance", + "enabled-stream inherited (-1) vs global retention vs unlimited (0) in apply_retention_policy (only disabled-stream variants are asserted end-to-end)", + "protected recording survives apply_retention_policy file deletion path end-to-end (protection is asserted at query level only)", + "held/locked files (open by playback/export) during cleanup" + ], + "owner_tasks": [ + "T27", + "T28" + ] + }, + { + "id": "S6-full-readonly-unavailable-storage", + "prd_row": "Full/read-only/unavailable storage", + "required_lane": "Isolated fault-injection tests", + "status": "mostly_missing", + "executed_evidence": [ + "test_storage_pressure / _extended: threshold classification only (WARNING 20%, CRITICAL 10%, EMERGENCY 5% free)", + "test_storage_manager_retention: orphan cleanup skipped when mp4 storage inaccessible; delete failure preserves metadata", + "test_db_core_initialization: read-only DB file open cannot write", + "test_mp4_segment_timestamps: ENOSPC classified as not requiring input refresh (classification only; not in CI)" + ], + "missing_cases": [ + "real ENOSPC during an active MP4 write (mp4_segment_recorder.c ENOSPC/EIO branches) on a disposable size-limited filesystem or write wrap; expected: segment closed, metadata consistent, recorder pauses", + "storage_should_pause_recording() pause and resume transition in mp4_writer_thread", + "read-only recordings root (EROFS) at startup and mid-run: failure reported via health/API, no metadata deletion", + "storage root unmounted/unavailable then restored: recovery without erasing protected recordings", + "database on full filesystem (SQLITE_FULL) during recording metadata update", + "storage_target_health timeouts (STORAGE_HEALTH_DEFAULT_TIMEOUT_MS 3000) under a hung mount" + ], + "owner_tasks": [ + "T28" + ] + }, + { + "id": "S7-shutdown-forced-termination-restart", + "prd_row": "Shutdown, forced termination, and restart", + "required_lane": "PR targeted tests and scheduled recovery runs", + "status": "mostly_missing", + "executed_evidence": [ + "test_shutdown_coordinator (unity/sanitizer): register/state transitions/wait_for_all_components_stopped timeout semantics (in-process)", + "sanitizer smoke: start bin/lightnvr 15 s, kill (SIGTERM), wait; passes on any exit after kill (no deadline or clean-exit assertion)", + "test_system_health_restart: restart evidence (boot_id/uptime) parsing from fixture proc_root", + "test_storage_migration: interrupted copy reclaimed on restart" + ], + "missing_cases": [ + "process-level SIGTERM with active recording: exit within declared deadline, separate from SHUTDOWN_WATCHDOG_TIMEOUT_SECONDS (900) force-kill and main.c 5 s component wait", + "SIGKILL mid-segment then restart: storage_reconcile_incomplete_recordings() finalizes/prunes is_complete=0 rows (STALE_WINDOW_SEC 3600, batch 500) - function has NO test", + "committed recordings remain playable and DB passes PRAGMA integrity_check after forced kill", + "PID-file takeover path in main.c (120 s graceful wait then SIGKILL) untested", + "repeated start/stop without fd/thread growth (belongs to T30 soak)" + ], + "owner_tasks": [ + "T29", + "T30" + ] + }, + { + "id": "S8-upgrade-persisted-state", + "prd_row": "Upgrade and persisted state", + "required_lane": "Upgrade fixtures/release qualification", + "status": "missing", + "executed_evidence": [ + "All SQLite tests build the schema from scratch through the embedded migrations (0001..0089); embedded migration header is checked for drift in unity job", + "test_db_streams: legacy ONVIF embedded-credential row repair; test_db_recordings_extended: history index migration" + ], + "missing_cases": [ + "database produced by the previous supported release (0.45.0 / 0.44.x) upgraded in place, with recordings/streams/users/settings asserted after migration", + "legacy schema_version table path (db_migrations.c get_legacy_schema_version) from an old DB fixture", + "previous-release lightnvr.ini parsed with the current config loader (unknown/renamed keys)", + "browser preference/localStorage keys from the previous release still honoured (Live view variant keys etc.)", + "newer-schema DB opened by an older binary (downgrade) - must be described as unsupported, not exercised on real state" + ], + "owner_tasks": [ + "T29" + ] + }, + { + "id": "S9-repeated-lifecycle-soak", + "prd_row": "Repeated lifecycle activity", + "required_lane": "Scheduled soak on declared target/workload", + "status": "missing", + "executed_evidence": [ + "ASan/UBSan on selected unit tests (sanitizer job) and Debug unity job", + "test_system_health_benchmark heap/CPU budget gate (system-health job; health sampler only)" + ], + "missing_cases": [ + "no scheduled workflow exists; no soak or long-running RSS/FD/thread sampling", + "no TSan/race-detection lane", + "no recording-gap measurement over time" + ], + "owner_tasks": [ + "T5", + "T30", + "T36" + ] + } + ], + "seams": { + "media_recovery": { + "production_files": [ + "src/video/mp4_recording_core.c", + "src/video/mp4_writer_thread.c", + "src/video/mp4_segment_recorder.c", + "src/video/mp4_writer_utils.c", + "src/video/hls/hls_unified_thread.c", + "src/video/unified_detection_thread.c" + ], + "tests": [ + "test_mp4_audio_recovery", + "test_mp4_forced_reconnect", + "test_mp4_recovery_watchdog", + "test_mp4_writer_watchdog", + "test_mp4_segment_boundaries", + "test_mp4_segment_timestamps", + "test_hls_reconnect_backoff", + "test_udt_recording" + ], + "notes": "Recovery decisions are tested by wrapping sleep/av_read_frame/writer functions; nothing drives a real RTSP disconnect. Liveness is mp4_writer_is_recording(): 60 s initial grace, inactivity_timeout=max(45, segment_duration+15)." + }, + "storage": { + "production_files": [ + "src/storage/storage_manager.c", + "src/storage/storage_target_health.c", + "src/database/db_recordings.c", + "src/storage/storage_migration*.c" + ], + "tests": [ + "test_storage_retention_sqlite", + "test_storage_manager_retention", + "test_storage_pressure", + "test_storage_pressure_extended", + "test_storage_target_pressure_cleanup", + "test_storage_migration", + "test_storage_deletion_ledger", + "test_db_storage_targets", + "test_db_storage_policies" + ], + "notes": "statvfs() is called directly in storage_manager.c (no injectable seam); storage_target_health.c already takes an ops table with mountinfo_path/proc_root - a ready seam for fault injection." + }, + "shutdown": { + "production_files": [ + "src/core/shutdown_coordinator.c", + "src/core/main.c" + ], + "tests": [ + "test_shutdown_coordinator" + ], + "notes": "main.c: SHUTDOWN_WATCHDOG_TIMEOUT_SECONDS 900 (force-kill process group), wait_for_all_components_stopped(5), forked cleanup watchdog; PID takeover waits 120 s then SIGKILL. None asserted at process level." + }, + "upgrade": { + "production_files": [ + "src/database/db_migrations.c", + "db/migrations/*.sql (87 files, 0001..0089)", + "include/database/db_embedded_migrations.h", + "src/core/config.c" + ], + "tests": [ + "test_embedded_migration_generator.py (unity job step, not ctest)", + "test_db_core_initialization", + "test_config" + ], + "notes": "No previous-release DB/config fixture exists." + }, + "stream_state": { + "production_files": [ + "src/video/stream_state.c", + "include/video/stream_state.h", + "src/video/stream_manager.c" + ], + "tests": [ + "test_stream_state", + "test_stream_manager" + ], + "notes": "6 states (INACTIVE, STARTING, ACTIVE, STOPPING, ERROR, RECONNECTING); test_stream_state references STREAM_STATE_* once (initial INACTIVE). start_stream_with_state, stop_stream_with_state, handle_stream_error, wait_for_stream_stop(timeout_ms) and transition validity are untested." + }, + "proc": { + "production_files_injectable": [ + "src/telemetry/collectors/linux_proc.c", + "linux_process.c", + "linux_filesystem.c", + "linux_network.c", + "linux_restart.c", + "linux_cgroup.c (proc_root/sys_root via context)", + "src/storage/storage_target_health.c" + ], + "production_files_hardcoded": [ + "src/web/api_handlers_system.c: /proc scan for light-object-detect (cmdline/status VmRSS) and /sys/fs/cgroup cpu.max / cpu.cfs_* parsing duplicated from linux_cgroup collector", + "src/video/go2rtc/go2rtc_process.c: 8 sites (/proc//cmdline, /proc scan, /proc/net/tcp{,6} port owner, /proc//fd, /proc//stat x2, /proc//status)", + "src/core/main.c: /proc//comm, /proc/1/cgroup, /proc/self/exe", + "src/tools/ffmpeg_rss_guard.c: /proc//statm" + ], + "tests": [ + "test_system_health_proc", + "test_system_health_process", + "test_system_health_cgroup", + "test_system_health_filesystem", + "test_system_health_network", + "test_system_health_restart", + "test_ffmpeg_guard (go2rtc job)" + ], + "notes": "Telemetry collectors are sound and fixture-tested. Hard-coded parsers in api_handlers_system.c and go2rtc_process.c have no tests and duplicate collector logic." + } + }, + "calibration_limits": [ + { + "name": "DEAD_RESTART_THRESHOLD_SECS", + "value": 5, + "unit": "s", + "source": "src/video/mp4_recording_core.c:472", + "use": "inner RTSP thread dead before restart" + }, + { + "name": "MAX_SELF_RESTARTS", + "value": 5, + "unit": "count", + "source": "src/video/mp4_recording_core.c:473" + }, + { + "name": "COOLDOWN_SECS", + "value": 300, + "unit": "s", + "source": "src/video/mp4_recording_core.c:478" + }, + { + "name": "healthy reset window", + "value": 120, + "unit": "s", + "source": "src/video/mp4_recording_core.c (~line 596)" + }, + { + "name": "recording thread join timeout", + "value": 15, + "unit": "s", + "source": "src/video/mp4_recording_core.c pthread_join_with_timeout" + }, + { + "name": "mp4 writer inactivity_timeout", + "value": "max(45, segment_duration+15)", + "unit": "s", + "source": "src/video/mp4_writer_thread.c:1011" + }, + { + "name": "mp4 writer initial grace", + "value": 60, + "unit": "s", + "source": "src/video/mp4_writer_thread.c (~line 1020)" + }, + { + "name": "KEYFRAME_WAIT_TIMEOUT_S / SHUTDOWN_KEYFRAME_WAIT_TIMEOUT_S", + "value": "5 / 1", + "unit": "s", + "source": "src/video/mp4_segment_recorder.c:81-82" + }, + { + "name": "DIMENSION_PROBE_TIMEOUT_US", + "value": 60000000, + "unit": "us", + "source": "src/video/mp4_segment_recorder.c:74" + }, + { + "name": "HLS/UDT reconnect backoff", + "value": "500..30000", + "unit": "ms", + "source": "hls_unified_thread.c:122-125, unified_detection_thread.c:78-79" + }, + { + "name": "HLS MAX_PACKET_TIMEOUT / UDT MAX_PACKET_TIMEOUT_SEC", + "value": "5 / 10", + "unit": "s" + }, + { + "name": "HLS watchdog check / restart cooldown", + "value": "30 / 300", + "unit": "s", + "source": "hls_unified_thread.c:159-161" + }, + { + "name": "SHUTDOWN_WATCHDOG_TIMEOUT_SECONDS", + "value": 900, + "unit": "s", + "source": "src/core/main.c:224" + }, + { + "name": "component stop wait", + "value": 5, + "unit": "s", + "source": "src/core/main.c:1774" + }, + { + "name": "PID takeover graceful wait", + "value": 120, + "unit": "s", + "source": "src/core/main.c:432" + }, + { + "name": "Disk pressure thresholds (free %)", + "value": "20 / 10 / 5", + "source": "include/storage/storage_manager.h:55-57" + }, + { + "name": "RETENTION_TIME_BUDGET_SEC", + "value": 300, + "unit": "s", + "source": "src/storage/storage_manager.c:61" + }, + { + "name": "storage heartbeat / standard / deep", + "value": "60 / 900 / 21600", + "unit": "s", + "source": "src/storage/storage_manager.c:926-928" + }, + { + "name": "reconcile STALE_WINDOW_SEC / batch", + "value": "3600 / 500", + "source": "src/storage/storage_manager.c:2001-2002" + }, + { + "name": "STORAGE_HEALTH_DEFAULT_TIMEOUT_MS / STALE_MS", + "value": "3000 / 900000", + "unit": "ms", + "source": "include/storage/storage_target_health.h:20-21" + }, + { + "name": "system health benchmark gate", + "value": "360 samples, heap <= 524288 B, cpu ratio <= 0.005", + "source": ".github/workflows/integration-test.yml" + }, + { + "name": "ctest TIMEOUTs", + "value": "mp4_forced_reconnect/recovery_watchdog 10 s, hls_reconnect_backoff 10 s, hls_cleanup 30 s, udt_recording 60 s, detection_io_recovery 30 s", + "source": "tests/unit/CMakeLists.txt" + } + ], + "calibration_note": "These are production constants, not acceptance limits. A scenario deadline must be derived from them (e.g. recovery deadline >= DEAD_RESTART_THRESHOLD_SECS + reconnect backoff + first keyframe) and measured on the T5 target before it gates. T27-T30 must declare fixture-specific deadlines; real-time values like 300 s cooldown and 900 s shutdown watchdog need clock/sleep injection or a scheduled lane.", + "c_improvement_candidates": [ + { + "id": "C1-stream-state-transitions", + "boundary": "include/video/stream_state.h / src/video/stream_state.c", + "problem": "6-state enum with start/stop/error/reconnect entry points but no explicit transition table and no test of transitions or wait_for_stream_stop timeout", + "bounded_change": "extract a pure stream_state_transition(from, event) -> to|invalid function; add precondition tests for each entry point; keep public API", + "precondition_tests": "extend test_stream_state (owned by T31.* child); serialize with T29 lifecycle work", + "risk": "medium - state is shared by recording, HLS, detection threads; lock order must be documented" + }, + { + "id": "C2-proc-parsers-system-api", + "boundary": "src/web/api_handlers_system.c get_detector_memory_usage/get_effective_cpu_cores", + "problem": "hard-coded /proc and /sys/fs/cgroup parsing duplicates src/telemetry/collectors/linux_cgroup.c and linux_process.c; not fixture-testable", + "bounded_change": "route through the existing injectable collectors (proc_root/sys_root) or extract pure parsers with fixture tests", + "precondition_tests": "new fixture tests under tests/fixtures/system_health; test_api_handlers_system already exists (Layer 3)", + "risk": "low - read-only reporting path; PRD names /proc parsers as candidates" + }, + { + "id": "C3-go2rtc-process-proc-probes", + "boundary": "src/video/go2rtc/go2rtc_process.c (8 hard-coded /proc sites: pid/port ownership, fd scan, stat, status)", + "problem": "port-owner detection via /proc/net/tcp and pid scans untestable without a live system; heavily changed file (32 commits since 2026-04)", + "bounded_change": "extract pure parsers for /proc/net/tcp line -> inode/port and /proc//stat fields taking a proc_root", + "precondition_tests": "fixture tests; requires ENABLE_GO2RTC=ON lane (go2rtc unity job)", + "risk": "medium - affects go2rtc takeover/restart" + }, + { + "id": "C4-incomplete-recording-reconcile", + "boundary": "src/storage/storage_manager.c storage_reconcile_incomplete_recordings()", + "problem": "startup reconciliation of is_complete=0 rows after crash has no test; mixes DB query, file stat and deletion", + "bounded_change": "separate pure finalize/prune decision (row + file stat -> action) from I/O; test with real SQLite and temp files", + "precondition_tests": "T29 forced-kill fixture", + "risk": "low-medium - persistence behaviour must stay identical" + }, + { + "id": "C5-storage-statvfs-seam", + "boundary": "src/storage/storage_manager.c statvfs() calls (3 sites)", + "problem": "disk pressure and pause decisions cannot be fault-injected without a real full filesystem", + "bounded_change": "inject a statvfs provider (pattern already used by storage_target_health ops) so T28 can drive ENOSPC/pressure transitions", + "precondition_tests": "test_storage_pressure*, T28 scenarios", + "risk": "low" + } + ], + "ci_jobs": [ + { + "id": "sanitizer/asan-ubsan", + "workflow": ".github/workflows/sanitizer.yml", + "trigger": "push main, PR to main, manual", + "runner": "ubuntu-latest container debian:sid-slim (amd64)", + "cmake": "-DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTS=ON -DENABLE_SOD=OFF -DENABLE_GO2RTC=OFF -DENABLE_MQTT=OFF (LiteRT left at default ON but submodule not checked out -> auto-disabled)", + "sanitizers": "ASan+UBSan (Debug build type adds -fsanitize=address,undefined); detect_leaks=1", + "ctest_regex": "test_config|test_logger|test_strings|test_memory|test_request_response|test_shutdown_coordinator|test_detection_config|test_detection_model_motion|test_db_streams|test_db_recordings_extended|test_db_detections|test_db_zones|test_db_events|test_db_auth|test_db_transactions|test_db_maintenance|test_db_query_builder|test_logger_json|test_batch_delete_progress|test_db_recordings_sync|test_httpd_utils|test_zone_filter|test_faac_encoder|test_audio_transcoder|test_audio_voice_enhancement|test_audio_voice_filter_faults|test_udt_recording|test_detection_current_frame|test_detection_io_recovery|test_stream_manager|test_stream_state|test_packet_buffer|test_timestamp_manager|test_storage_pressure$|test_storage_pressure_extended|test_detection_result_structures|test_stream_frame_rate|test_recording_video_params|test_mp4_segment_boundaries|test_storage_retention_sqlite|test_audit_log|test_audit_summary", + "built": "all", + "extra": "15 s start/stop smoke of bin/lightnvr with curl /api/system; no deadline or exit-code assertion on SIGTERM path", + "selected_tests": [ + "test_audio_transcoder", + "test_audio_voice_enhancement", + "test_audio_voice_filter_faults", + "test_audit_log", + "test_audit_summary", + "test_batch_delete_progress", + "test_config", + "test_db_auth", + "test_db_detections", + "test_db_events", + "test_db_maintenance", + "test_db_query_builder", + "test_db_recordings_extended", + "test_db_recordings_sync", + "test_db_streams", + "test_db_transactions", + "test_db_zones", + "test_detection_config", + "test_detection_current_frame", + "test_detection_io_recovery", + "test_detection_model_motion", + "test_detection_result_structures", + "test_faac_encoder", + "test_httpd_utils", + "test_logger", + "test_logger_json", + "test_memory", + "test_mp4_segment_boundaries", + "test_packet_buffer", + "test_recording_video_params", + "test_request_response", + "test_shutdown_coordinator", + "test_storage_pressure", + "test_storage_pressure_extended", + "test_storage_retention_sqlite", + "test_stream_frame_rate", + "test_stream_manager", + "test_stream_state", + "test_strings", + "test_timestamp_manager", + "test_udt_recording", + "test_zone_filter" + ], + "selected_count": 42 + }, + { + "id": "integration-test/unity-tests", + "workflow": ".github/workflows/integration-test.yml", + "trigger": "push main|feature/**, PR to main, manual", + "runner": "ubuntu-latest container debian:sid-slim (amd64)", + "cmake": "-DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTS=ON -DENABLE_SOD=OFF -DENABLE_GO2RTC=OFF -DENABLE_MQTT=OFF --coverage", + "sanitizers": "ASan+UBSan via Debug", + "ctest_regex": "test_storage_pressure$|test_storage_pressure_extended|test_detection_result_structures|test_stream_frame_rate|test_recording_video_params|test_mp4_segment_boundaries|test_storage_retention_sqlite|test_storage_manager_retention|test_storage_target_pressure_cleanup|test_storage_migration|test_storage_archive_s3|test_storage_archive_operator|test_authorization|test_api_handlers_recordings_playback|test_db_storage_targets|test_db_storage_policies|test_api_handlers_storage_targets|test_api_handlers_storage_policies|test_config|test_logger|test_strings|test_memory|test_request_response|test_shutdown_coordinator|test_detection_config|test_detection_model_motion|test_db_streams|test_db_camera_favorites|test_api_handlers_camera_favorites|test_db_backup|test_mp4_failed_open_memory|test_db_recordings_extended|test_db_detections|test_db_zones|test_db_events|test_db_auth|test_db_transactions|test_db_maintenance|test_db_query_builder|test_logger_json|test_batch_delete_progress|test_db_recordings_sync|test_httpd_utils|test_zone_filter|test_onvif_soap_fault|test_faac_encoder|test_audio_transcoder|test_mp4_audio_recovery|test_mp4_forced_reconnect|test_mp4_recovery_watchdog|test_audio_voice_enhancement|test_audio_voice_filter_faults|test_udt_recording|test_detection_current_frame|test_detection_io_recovery|test_hls_cleanup|test_stream_manager|test_stream_state|test_packet_buffer|test_timestamp_manager|test_motion_trigger_parse|test_motion_max_area|test_url_utils", + "built": [ + "test_api_handlers_camera_favorites", + "test_api_handlers_recordings_playback", + "test_api_handlers_storage_policies", + "test_api_handlers_storage_targets", + "test_audio_transcoder", + "test_audio_voice_enhancement", + "test_audio_voice_filter_faults", + "test_authorization", + "test_batch_delete_progress", + "test_config", + "test_db_auth", + "test_db_backup", + "test_db_camera_favorites", + "test_db_detections", + "test_db_events", + "test_db_maintenance", + "test_db_query_builder", + "test_db_recordings_extended", + "test_db_recordings_sync", + "test_db_storage_policies", + "test_db_storage_targets", + "test_db_streams", + "test_db_transactions", + "test_db_zones", + "test_detection_config", + "test_detection_current_frame", + "test_detection_io_recovery", + "test_detection_model_motion", + "test_detection_result_structures", + "test_faac_encoder", + "test_hls_cleanup", + "test_httpd_utils", + "test_logger", + "test_logger_json", + "test_memory", + "test_motion_max_area", + "test_motion_trigger_parse", + "test_mp4_audio_recovery", + "test_mp4_failed_open_memory", + "test_mp4_forced_reconnect", + "test_mp4_recovery_watchdog", + "test_mp4_segment_boundaries", + "test_onvif_soap_fault", + "test_packet_buffer", + "test_recording_video_params", + "test_request_response", + "test_shutdown_coordinator", + "test_storage_archive", + "test_storage_manager_retention", + "test_storage_migration", + "test_storage_pressure", + "test_storage_pressure_extended", + "test_storage_retention_sqlite", + "test_storage_target_pressure_cleanup", + "test_stream_frame_rate", + "test_stream_manager", + "test_stream_state", + "test_strings", + "test_timestamp_manager", + "test_udt_recording", + "test_url_utils", + "test_zone_filter" + ], + "extra": "embedded migration generator check (python3 tests/unit/test_embedded_migration_generator.py + --check)", + "selected_tests": [ + "test_api_handlers_camera_favorites", + "test_api_handlers_recordings_playback", + "test_api_handlers_storage_policies", + "test_api_handlers_storage_targets", + "test_audio_transcoder", + "test_audio_voice_enhancement", + "test_audio_voice_filter_faults", + "test_authorization", + "test_batch_delete_progress", + "test_config", + "test_db_auth", + "test_db_backup", + "test_db_camera_favorites", + "test_db_detections", + "test_db_events", + "test_db_maintenance", + "test_db_query_builder", + "test_db_recordings_extended", + "test_db_recordings_sync", + "test_db_storage_policies", + "test_db_storage_targets", + "test_db_streams", + "test_db_transactions", + "test_db_zones", + "test_detection_config", + "test_detection_current_frame", + "test_detection_io_recovery", + "test_detection_model_motion", + "test_detection_result_structures", + "test_faac_encoder", + "test_hls_cleanup", + "test_httpd_utils", + "test_logger", + "test_logger_json", + "test_memory", + "test_motion_max_area", + "test_motion_trigger_parse", + "test_mp4_audio_recovery", + "test_mp4_failed_open_memory", + "test_mp4_forced_reconnect", + "test_mp4_recovery_watchdog", + "test_mp4_segment_boundaries", + "test_onvif_soap_fault", + "test_packet_buffer", + "test_recording_video_params", + "test_request_response", + "test_shutdown_coordinator", + "test_storage_archive_operator", + "test_storage_archive_s3", + "test_storage_manager_retention", + "test_storage_migration", + "test_storage_pressure", + "test_storage_pressure_extended", + "test_storage_retention_sqlite", + "test_storage_target_pressure_cleanup", + "test_stream_frame_rate", + "test_stream_manager", + "test_stream_state", + "test_strings", + "test_timestamp_manager", + "test_udt_recording", + "test_url_utils", + "test_zone_filter" + ], + "selected_count": 63 + }, + { + "id": "integration-test/system-health-tests:P0P1", + "workflow": ".github/workflows/integration-test.yml", + "trigger": "same as unity-tests", + "runner": "ubuntu-latest container debian:sid-slim (amd64)", + "cmake": "-DCMAKE_BUILD_TYPE=Release -DBUILD_TESTS=ON -DENABLE_SOD=OFF -DENABLE_LITERT=OFF -DENABLE_MQTT=ON --coverage (go2rtc default ON)", + "sanitizers": "none (Release)", + "ctest_regex": "test_system_health_(types|proc|cgroup|filesystem|process|thermal|network|clock|policy|sampler|evaluator|storage)$|test_recording_io_metrics$|test_health_helper_runner$", + "built": "all", + "selected_tests": [ + "test_health_helper_runner", + "test_recording_io_metrics", + "test_system_health_cgroup", + "test_system_health_clock", + "test_system_health_evaluator", + "test_system_health_filesystem", + "test_system_health_network", + "test_system_health_policy", + "test_system_health_proc", + "test_system_health_process", + "test_system_health_sampler", + "test_system_health_storage", + "test_system_health_thermal", + "test_system_health_types" + ], + "selected_count": 14 + }, + { + "id": "integration-test/system-health-tests:P2P4", + "workflow": ".github/workflows/integration-test.yml", + "trigger": "same", + "runner": "same", + "cmake": "same as P0P1", + "sanitizers": "none", + "ctest_regex": "test_db_system_health_incidents$|test_mqtt_presence$|test_mqtt_destination_client$|test_api_handlers_(system_health|metrics)$|test_system_health_(self_observability|restart)$", + "built": "all", + "extra": "web Jest (TZ=America/New_York) + vite build; Playwright system-health api/ui specs with LIGHTNVR_SKIP_GO2RTC=1; test_system_health_benchmark run directly with --samples 360 --heap-limit-bytes 524288 --cpu-ratio-limit 0.005; real mosquitto broker LWT gate", + "selected_tests": [ + "test_api_handlers_metrics", + "test_api_handlers_system_health", + "test_db_system_health_incidents", + "test_mqtt_destination_client", + "test_mqtt_presence", + "test_system_health_restart", + "test_system_health_self_observability" + ], + "selected_count": 7 + }, + { + "id": "integration-test/system-health-tests:P3", + "workflow": ".github/workflows/integration-test.yml", + "trigger": "same", + "runner": "same", + "cmake": "same as P0P1", + "sanitizers": "none", + "ctest_regex": "test_system_health_hardware$|test_smartctl_provider$|test_kernel_log_provider$", + "built": "all", + "selected_tests": [ + "test_kernel_log_provider", + "test_smartctl_provider", + "test_system_health_hardware" + ], + "selected_count": 3 + }, + { + "id": "integration-test/go2rtc-unity-tests", + "workflow": ".github/workflows/integration-test.yml", + "trigger": "same", + "runner": "ubuntu-latest container (amd64), go2rtc built from submodule", + "cmake": "-DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTS=ON -DENABLE_SOD=OFF -DENABLE_GO2RTC=ON -DENABLE_LITERT=OFF -DENABLE_MQTT=OFF --coverage", + "sanitizers": "ASan+UBSan via Debug", + "ctest_regex": "test_yaml_validate|test_yaml_redact|test_db_system_settings|test_go2rtc_process_detection|test_go2rtc_proxy_thread|test_go2rtc_proxy_routing|test_go2rtc_process_config_generation|test_go2rtc_substream_registration|test_go2rtc_live_transcode|test_go2rtc_binary_detection|test_go2rtc_two_config_merge|test_ffmpeg_guard", + "built": [ + "test_db_system_settings", + "test_ffmpeg_guard", + "test_ffmpeg_guard_probe", + "test_go2rtc_binary_detection", + "test_go2rtc_live_transcode", + "test_go2rtc_process_config_generation", + "test_go2rtc_process_detection", + "test_go2rtc_proxy_routing", + "test_go2rtc_proxy_thread", + "test_go2rtc_substream_registration", + "test_go2rtc_two_config_merge", + "test_yaml_redact", + "test_yaml_validate" + ], + "selected_tests": [ + "test_db_system_settings", + "test_ffmpeg_guard", + "test_go2rtc_binary_detection", + "test_go2rtc_live_transcode", + "test_go2rtc_process_config_generation", + "test_go2rtc_process_detection", + "test_go2rtc_proxy_routing", + "test_go2rtc_proxy_thread", + "test_go2rtc_substream_registration", + "test_go2rtc_two_config_merge", + "test_yaml_redact", + "test_yaml_validate" + ], + "selected_count": 12 + } + ], + "playwright_lanes": [ + { + "id": "integration-test/playwright-tests", + "trigger": "same as unity-tests", + "build": "Release, ENABLE_GO2RTC=ON, ENABLE_LITERT=OFF, SOD/MQTT default ON (full profile), real go2rtc from submodule", + "projects_run": [ + "ui (2 shards)" + ], + "projects_not_run_in_ci": [ + "api (*.api.spec.ts except system-health)", + "go2rtc (*.go2rtc.spec.ts)" + ], + "media": "go2rtc ffmpeg:virtual test patterns (real server + real go2rtc + synthetic media); tests/integration/fixtures/recording.mp4 (64x64 lavfi color, 1 fps)" + } + ], + "tests": [ + { + "name": "test_annotation_writer_registry", + "registered": true, + "layer": 3, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib + FFmpeg in-process", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_api_detection", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_api_handlers_camera_collections", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_api_handlers_camera_favorites", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_api_handlers_camera_tags", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_api_handlers_detection_engines", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_api_handlers_event_destinations", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_api_handlers_event_routes", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_api_handlers_fleet", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_api_handlers_investigation_bookmarks", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_api_handlers_investigations", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_api_handlers_live_layouts", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_api_handlers_locations", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_api_handlers_lpr", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_api_handlers_metrics", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/cmake/system_health/t20-metrics.cmake", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/system-health-tests:P2P4" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_api_handlers_operator_floor_plans", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_api_handlers_recordings_list", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_api_handlers_recordings_playback", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "mock: wraps storage_source_*, metadata lookup, authorization, transcode, http_serve_file", + "link_wraps": [ + "storage_source_resolve", + "storage_source_remote", + "get_recording_metadata_by_id", + "httpd_authorize_camera_identity_action_with_context", + "recording_needs_hevc_transcode", + "request_recording_transcode_cache", + "http_serve_file" + ], + "ci_jobs": [ + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_api_handlers_storage_policies", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_api_handlers_storage_targets", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_api_handlers_system", + "registered": true, + "layer": 3, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib + FFmpeg in-process", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_api_handlers_system_health", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/cmake/system_health/t19-api.cmake", + "evidence_kind": "lightnvr_lib (real SQLite where used); link-wrap mocks: metrics_get_max_streams,metrics_snapshot_all,get_storage_health", + "link_wraps": [ + "metrics_get_max_streams", + "metrics_snapshot_all", + "get_storage_health" + ], + "ci_jobs": [ + "integration-test/system-health-tests:P2P4" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_api_handlers_workspaces", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_api_read_isolation", + "registered": true, + "layer": 3, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib + FFmpeg in-process", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_audio_transcoder", + "registered": true, + "layer": 3, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib + FFmpeg in-process", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Failed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_audio_voice_enhancement", + "registered": true, + "layer": 3, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib + FFmpeg in-process", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_audio_voice_filter_faults", + "registered": true, + "layer": 3, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib + FFmpeg in-process; link-wrap mocks: avfilter_inout_alloc,av_strdup,avfilter_graph_config,av_buffersrc_add_frame_flags,av_buffersink_get_frame,av_audio_fifo_write", + "link_wraps": [ + "avfilter_inout_alloc", + "av_strdup", + "avfilter_graph_config", + "av_buffersrc_add_frame_flags", + "av_buffersink_get_frame", + "av_audio_fifo_write" + ], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Failed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_audit_log", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_audit_summary", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_authorization", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_batch_delete_progress", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_camera_selector", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_config", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_cross_stream_motion_trigger", + "registered": true, + "layer": 3, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib + FFmpeg in-process", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_db_auth", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_db_backup", + "registered": true, + "layer": null, + "source_registration": "tests/CMakeLists.txt", + "evidence_kind": "real_sqlite backup/verify", + "link_wraps": [], + "ci_jobs": [ + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_db_camera_collections", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_db_camera_favorites", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_db_camera_tags", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_db_core_initialization", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "real_sqlite; read-only DB file (chmod 0400) open path", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_db_detection_engines", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_db_detections", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_db_event_destinations", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_db_event_routes", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_db_events", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_db_investigation_bookmarks", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_db_live_saved_layouts", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_db_locations", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_db_lpr_reads", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_db_maintenance", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_db_onvif_discovery_inventory", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_db_operator_floor_plans", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_db_query_builder", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_db_recordings_extended", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_db_recordings_sync", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_db_storage_policies", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_db_storage_targets", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_db_streams", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_db_system_health_incidents", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/cmake/system_health/t8-incidents-db.cmake", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/system-health-tests:P2P4" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_db_system_settings", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/go2rtc-unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_db_transactions", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_db_zones", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_detection_config", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_detection_current_frame", + "registered": true, + "layer": 3, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib + FFmpeg in-process; link-wrap mocks: detect_objects_api_snapshot_with_options,detect_objects_api_with_options,filter_detections_by_zones,filter_detections_by_stream_objects", + "link_wraps": [ + "detect_objects_api_snapshot_with_options", + "detect_objects_api_with_options", + "filter_detections_by_zones", + "filter_detections_by_stream_objects" + ], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_detection_io_recovery", + "registered": true, + "layer": 3, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "fixture_media + wraps avformat_open_input/find_stream_info/av_read_frame/av_gettime_relative (I/O fault injection)", + "link_wraps": [ + "avformat_open_input", + "avformat_find_stream_info", + "av_read_frame", + "av_gettime_relative", + "_log_message_ctx" + ], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_detection_model_motion", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_detection_result_structures", + "registered": true, + "layer": 1, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "pure_logic", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_detection_system_onvif", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_event_bus", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_event_detection_adapter", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_event_envelope", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_event_outbox", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_event_route_suppression", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_event_router", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_external_motion_trigger", + "registered": true, + "layer": 1, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "pure_logic", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_faac_encoder", + "registered": true, + "layer": 3, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib + FFmpeg in-process", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_ffmpeg_guard", + "registered": true, + "layer": null, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "custom harness", + "link_wraps": [], + "ci_jobs": [ + "integration-test/go2rtc-unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_ffmpeg_rgb24_padding", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_go2rtc_base_path", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_go2rtc_binary_detection", + "registered": false, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/go2rtc-unity-tests" + ], + "baseline_as_specified": "not built (feature omitted)", + "baseline_system_ffmpeg": "not built (feature omitted)", + "feature_gate": "ENABLE_GO2RTC=ON" + }, + { + "name": "test_go2rtc_lifecycle", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_go2rtc_live_transcode", + "registered": false, + "layer": null, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "custom harness", + "link_wraps": [], + "ci_jobs": [ + "integration-test/go2rtc-unity-tests" + ], + "baseline_as_specified": "not built (feature omitted)", + "baseline_system_ffmpeg": "not built (feature omitted)", + "feature_gate": "ENABLE_GO2RTC=ON" + }, + { + "name": "test_go2rtc_process_config_generation", + "registered": false, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/go2rtc-unity-tests" + ], + "baseline_as_specified": "not built (feature omitted)", + "baseline_system_ffmpeg": "not built (feature omitted)", + "feature_gate": "ENABLE_GO2RTC=ON" + }, + { + "name": "test_go2rtc_process_detection", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/go2rtc-unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_go2rtc_process_lifecycle", + "registered": false, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "not built (feature omitted)", + "baseline_system_ffmpeg": "not built (feature omitted)", + "feature_gate": "ENABLE_GO2RTC=ON" + }, + { + "name": "test_go2rtc_proxy_query", + "registered": false, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "not built (feature omitted)", + "baseline_system_ffmpeg": "not built (feature omitted)", + "feature_gate": "ENABLE_GO2RTC=ON" + }, + { + "name": "test_go2rtc_proxy_routing", + "registered": false, + "layer": 3, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib + FFmpeg in-process", + "link_wraps": [], + "ci_jobs": [ + "integration-test/go2rtc-unity-tests" + ], + "baseline_as_specified": "not built (feature omitted)", + "baseline_system_ffmpeg": "not built (feature omitted)", + "feature_gate": "ENABLE_GO2RTC=ON" + }, + { + "name": "test_go2rtc_proxy_thread", + "registered": false, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used); link-wrap mocks: go2rtc_proxy_authorize_request,libuv_send_response_ex,curl_easy_perform", + "link_wraps": [ + "go2rtc_proxy_authorize_request", + "libuv_send_response_ex", + "curl_easy_perform" + ], + "ci_jobs": [ + "integration-test/go2rtc-unity-tests" + ], + "baseline_as_specified": "not built (feature omitted)", + "baseline_system_ffmpeg": "not built (feature omitted)", + "feature_gate": "ENABLE_GO2RTC=ON" + }, + { + "name": "test_go2rtc_publish_async", + "registered": false, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "not built (feature omitted)", + "baseline_system_ffmpeg": "not built (feature omitted)", + "feature_gate": "ENABLE_GO2RTC=ON" + }, + { + "name": "test_go2rtc_recovery", + "registered": true, + "layer": null, + "source_registration": "tests/CMakeLists.txt", + "evidence_kind": "process-level go2rtc recovery harness (tests/test_go2rtc_recovery.c)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_go2rtc_stream_activity", + "registered": false, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "not built (feature omitted)", + "baseline_system_ffmpeg": "not built (feature omitted)", + "feature_gate": "ENABLE_GO2RTC=ON" + }, + { + "name": "test_go2rtc_substream_registration", + "registered": false, + "layer": 3, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib + FFmpeg in-process; link-wrap mocks: go2rtc_api_add_stream,go2rtc_api_add_stream_multi,get_stream_config_by_name", + "link_wraps": [ + "go2rtc_api_add_stream", + "go2rtc_api_add_stream_multi", + "get_stream_config_by_name" + ], + "ci_jobs": [ + "integration-test/go2rtc-unity-tests" + ], + "baseline_as_specified": "not built (feature omitted)", + "baseline_system_ffmpeg": "not built (feature omitted)", + "feature_gate": "ENABLE_GO2RTC=ON" + }, + { + "name": "test_go2rtc_two_config_merge", + "registered": false, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/go2rtc-unity-tests" + ], + "baseline_as_specified": "not built (feature omitted)", + "baseline_system_ffmpeg": "not built (feature omitted)", + "feature_gate": "ENABLE_GO2RTC=ON" + }, + { + "name": "test_go2rtc_unregister_recovery", + "registered": false, + "layer": 3, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib + FFmpeg in-process; link-wrap mocks: go2rtc_api_delete_preload,go2rtc_api_remove_stream", + "link_wraps": [ + "go2rtc_api_delete_preload", + "go2rtc_api_remove_stream" + ], + "ci_jobs": [], + "baseline_as_specified": "not built (feature omitted)", + "baseline_system_ffmpeg": "not built (feature omitted)", + "feature_gate": "ENABLE_GO2RTC=ON" + }, + { + "name": "test_go2rtc_websocket", + "registered": false, + "layer": 3, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib + FFmpeg in-process", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "not built (feature omitted)", + "baseline_system_ffmpeg": "not built (feature omitted)", + "feature_gate": "ENABLE_GO2RTC=ON" + }, + { + "name": "test_health_helper_runner", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/cmake/system_health/t9-sampler.cmake", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/system-health-tests:P0P1" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_hls_cache_cleanup", + "registered": true, + "layer": 1, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "pure_logic", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_hls_cleanup", + "registered": true, + "layer": 3, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "fixture_media + wraps alarm/sigaction/av_read_frame", + "link_wraps": [ + "alarm", + "sigaction", + "av_read_frame" + ], + "ci_jobs": [ + "integration-test/unity-tests" + ], + "baseline_as_specified": "Failed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_hls_reconnect_backoff", + "registered": true, + "layer": 3, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib + FFmpeg in-process; link-wrap mocks: av_usleep", + "link_wraps": [ + "av_usleep" + ], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_httpd_utils", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_interruptible_sleep", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_kernel_log_provider", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/cmake/system_health/t17-hardware.cmake", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/system-health-tests:P3" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_logger", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_logger_json", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_memory", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_motion_max_area", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_motion_trigger_parse", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_mp4_audio_recovery", + "registered": true, + "layer": 3, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "synthetic_media_inproc + link-wrap fault injection (av_read_frame EOF/error, cleanup_audio_transcoder); in-process MPEG-4+G.711 Matroska source, real mp4 writer", + "link_wraps": [ + "av_read_frame", + "cleanup_audio_transcoder" + ], + "ci_jobs": [ + "integration-test/unity-tests" + ], + "baseline_as_specified": "Failed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_mp4_failed_open_memory", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_mp4_faststart", + "registered": true, + "layer": 3, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "fixture_media (tests/integration/fixtures/recording.mp4) -> TS -> MP4 faststart", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_mp4_forced_reconnect", + "registered": true, + "layer": 3, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "mock-heavy: wraps record_segment/av_usleep/get_stream_config_by_name/storage_should_pause_recording/prepare_placed_mp4_recording_path; real audio transcoder + reconnect signaling", + "link_wraps": [ + "record_segment", + "av_usleep", + "get_stream_config_by_name", + "storage_should_pause_recording", + "prepare_placed_mp4_recording_path" + ], + "ci_jobs": [ + "integration-test/unity-tests" + ], + "baseline_as_specified": "Failed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_mp4_recovery_watchdog", + "registered": true, + "layer": 3, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "mock: wraps sleep, writer start/stop/is_recording, go2rtc check, logging; real mp4_recording_core restart decisions; no media", + "link_wraps": [ + "sleep", + "mp4_writer_start_recording_thread", + "mp4_writer_stop_recording_thread", + "mp4_writer_is_recording", + "go2rtc_integration_is_using_go2rtc_for_recording", + "_log_message_ctx" + ], + "ci_jobs": [ + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_mp4_segment_boundaries", + "registered": true, + "layer": 3, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "synthetic_media_inproc: MPEG-4 encoder -> temp file -> real segment recorder; asserts keyframe-aligned rollover", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Failed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_mp4_segment_timestamps", + "registered": true, + "layer": 3, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "synthetic_media_inproc to dyn buffer; timestamp rescale + AAC cadence + EINVAL/ENOSPC classification", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_mp4_writer_watchdog", + "registered": true, + "layer": 3, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "pure state/timing logic on mp4_writer_t (no media, no wraps); exercises inactivity_timeout = max(45, segment_duration+15)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_mqtt_delivery_worker", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_mqtt_destination_client", + "registered": false, + "layer": null, + "source_registration": "tests/unit/cmake/system_health/t16-managed-presence.cmake", + "evidence_kind": "custom harness; link-wrap mocks: db_event_destination_validate,db_event_destination_get_password,event_identity_get_source,system_health_evaluator_service_copy_run,system_health_snapshot_copy,system_health_evaluator_service_active_copy,_log_message_ctx,lightnvr_uuid_is_valid,secure_zero_memory,mosquitto_new,mosquitto_destroy,mosquitto_connect_callback_set,mosquitto_disconnect_callback_set,mosquitto_publish_callback_set,mosquitto_log_callback_set,mosquitto_username_pw_set,mosquitto_int_option,mosquitto_tls_set,mosquitto_tls_opts_set,mosquitto_reconnect_delay_set,mosquitto_will_set,mosquitto_connect_async,mosquitto_loop_start,mosquitto_disconnect,mosquitto_loop_stop,mosquitto_publish,mosquitto_connack_string,mosquitto_strerror", + "link_wraps": [ + "db_event_destination_validate", + "db_event_destination_get_password", + "event_identity_get_source", + "system_health_evaluator_service_copy_run", + "system_health_snapshot_copy", + "system_health_evaluator_service_active_copy", + "_log_message_ctx", + "lightnvr_uuid_is_valid", + "secure_zero_memory", + "mosquitto_new", + "mosquitto_destroy", + "mosquitto_connect_callback_set", + "mosquitto_disconnect_callback_set", + "mosquitto_publish_callback_set", + "mosquitto_log_callback_set", + "mosquitto_username_pw_set", + "mosquitto_int_option", + "mosquitto_tls_set", + "mosquitto_tls_opts_set", + "mosquitto_reconnect_delay_set", + "mosquitto_will_set", + "mosquitto_connect_async", + "mosquitto_loop_start", + "mosquitto_disconnect", + "mosquitto_loop_stop", + "mosquitto_publish", + "mosquitto_connack_string", + "mosquitto_strerror" + ], + "ci_jobs": [ + "integration-test/system-health-tests:P2P4" + ], + "baseline_as_specified": "not built (feature omitted)", + "baseline_system_ffmpeg": "not built (feature omitted)", + "feature_gate": "ENABLE_MQTT=ON (+libmosquitto)" + }, + { + "name": "test_mqtt_presence", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/cmake/system_health/t15-mqtt-presence.cmake", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/system-health-tests:P2P4" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_onvif_discovery_response", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_onvif_lpr_event", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_onvif_poll_recovery", + "registered": true, + "layer": 3, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib + FFmpeg in-process; link-wrap mocks: detect_motion_onvif,av_usleep", + "link_wraps": [ + "detect_motion_onvif", + "av_usleep" + ], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_onvif_soap_fault", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_packet_buffer", + "registered": true, + "layer": 3, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib + FFmpeg in-process", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_path_utils", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_recording_io_metrics", + "registered": true, + "layer": null, + "source_registration": "tests/unit/cmake/system_health/t12-recording-io.cmake", + "evidence_kind": "custom harness", + "link_wraps": [], + "ci_jobs": [ + "integration-test/system-health-tests:P0P1" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_recording_transcode", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_recording_video_params", + "registered": true, + "layer": 3, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib + FFmpeg in-process; link-wrap mocks: update_stream_video_params", + "link_wraps": [ + "update_stream_video_params" + ], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_request_response", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_shutdown_coordinator", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "real coordinator, synthetic components; no process-level signal/deadline", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_smartctl_provider", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/cmake/system_health/t18-smartctl.cmake", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/system-health-tests:P3" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_sod_unified", + "registered": false, + "layer": null, + "source_registration": "tests/CMakeLists.txt", + "evidence_kind": "custom harness", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "not built (feature omitted)", + "baseline_system_ffmpeg": "not built (feature omitted)", + "feature_gate": "ENABLE_SOD=ON" + }, + { + "name": "test_sod_voc", + "registered": false, + "layer": null, + "source_registration": "tests/CMakeLists.txt", + "evidence_kind": "custom harness", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "not built (feature omitted)", + "baseline_system_ffmpeg": "not built (feature omitted)", + "feature_gate": "ENABLE_SOD=ON" + }, + { + "name": "test_storage_archive_operator", + "registered": true, + "layer": null, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "custom harness", + "link_wraps": [], + "ci_jobs": [ + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_storage_archive_s3", + "registered": true, + "layer": null, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "python S3 fixture server (local), real curl", + "link_wraps": [], + "ci_jobs": [ + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_storage_deletion_ledger", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_storage_manager_retention", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "real_sqlite + real temp filesystem files; delete-failure path; inaccessible mp4 root", + "link_wraps": [], + "ci_jobs": [ + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_storage_migration", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "real_sqlite + temp dirs; interrupted-copy restart reclaim", + "link_wraps": [], + "ci_jobs": [ + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_storage_pressure", + "registered": true, + "layer": 1, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "pure logic (static inline thresholds)", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_storage_pressure_extended", + "registered": true, + "layer": 1, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "pure logic (boundary values)", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_storage_retention_sqlite", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "real_sqlite (temp file, embedded migrations); query-level only, no files", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_storage_target_pressure_cleanup", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "real_sqlite + temp roots; pressure synthesized, no real full disk", + "link_wraps": [], + "ci_jobs": [ + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_stream_detection", + "registered": true, + "layer": null, + "source_registration": "tests/CMakeLists.txt", + "evidence_kind": "tests/test_stream_detection.c", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_stream_frame_rate", + "registered": true, + "layer": 1, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "pure_logic", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_stream_manager", + "registered": true, + "layer": 3, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib + FFmpeg in-process", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_stream_metrics", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_stream_state", + "registered": true, + "layer": 3, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "real stream_state manager; lifecycle/refcount/flags only (no start/stop/error/reconnect transitions)", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_strings", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_system_health_benchmark", + "registered": true, + "layer": null, + "source_registration": "tests/unit/cmake/system_health/t24-benchmark.cmake", + "evidence_kind": "custom harness", + "link_wraps": [], + "ci_jobs": [], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_system_health_cgroup", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/cmake/system_health/t2-collectors.cmake", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/system-health-tests:P0P1" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_system_health_clock", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/cmake/system_health/t5-clock-restart.cmake", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/system-health-tests:P0P1" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_system_health_evaluator", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/cmake/system_health/t10-evaluator.cmake", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/system-health-tests:P0P1" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_system_health_filesystem", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/cmake/system_health/t3-resources.cmake", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/system-health-tests:P0P1" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_system_health_hardware", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/cmake/system_health/t17-hardware.cmake", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/system-health-tests:P3" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_system_health_network", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/cmake/system_health/t4-thermal-network.cmake", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/system-health-tests:P0P1" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_system_health_policy", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/cmake/system_health/t6-policy.cmake", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/system-health-tests:P0P1" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_system_health_proc", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/cmake/system_health/t2-collectors.cmake", + "evidence_kind": "fixture /proc snapshots via injected proc_root (tests/fixtures/system_health/proc)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/system-health-tests:P0P1" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_system_health_process", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/cmake/system_health/t3-resources.cmake", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/system-health-tests:P0P1" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_system_health_restart", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/cmake/system_health/t5-clock-restart.cmake", + "evidence_kind": "fixture proc_root (boot_id/uptime)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/system-health-tests:P2P4" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_system_health_sampler", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/cmake/system_health/t9-sampler.cmake", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/system-health-tests:P0P1" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_system_health_self_observability", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/cmake/system_health/t23-self-observability.cmake", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/system-health-tests:P2P4" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_system_health_storage", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/cmake/system_health/t11-storage.cmake", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/system-health-tests:P0P1" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_system_health_thermal", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/cmake/system_health/t4-thermal-network.cmake", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/system-health-tests:P0P1" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_system_health_types", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/cmake/system_health/t1-types.cmake", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/system-health-tests:P0P1" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_timestamp_manager", + "registered": true, + "layer": 3, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib + FFmpeg in-process", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_udt_recording", + "registered": true, + "layer": 3, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "fixture_media (recording.mp4) + synthetic G.711 through real process_packet against temp catalog/SQLite", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Failed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_url_utils", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_yaml_redact", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/go2rtc-unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_yaml_validate", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "integration-test/go2rtc-unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + }, + { + "name": "test_zone_filter", + "registered": true, + "layer": 2, + "source_registration": "tests/unit/CMakeLists.txt", + "evidence_kind": "lightnvr_lib (real SQLite where used)", + "link_wraps": [], + "ci_jobs": [ + "sanitizer/asan-ubsan", + "integration-test/unity-tests" + ], + "baseline_as_specified": "Passed", + "baseline_system_ffmpeg": "Passed" + } + ], + "registered_in_lean_build_but_never_executed_in_ci": [ + "test_annotation_writer_registry", + "test_api_detection", + "test_api_handlers_camera_collections", + "test_api_handlers_camera_tags", + "test_api_handlers_detection_engines", + "test_api_handlers_event_destinations", + "test_api_handlers_event_routes", + "test_api_handlers_fleet", + "test_api_handlers_investigation_bookmarks", + "test_api_handlers_investigations", + "test_api_handlers_live_layouts", + "test_api_handlers_locations", + "test_api_handlers_lpr", + "test_api_handlers_operator_floor_plans", + "test_api_handlers_recordings_list", + "test_api_handlers_system", + "test_api_handlers_workspaces", + "test_api_read_isolation", + "test_camera_selector", + "test_cross_stream_motion_trigger", + "test_db_camera_collections", + "test_db_camera_tags", + "test_db_core_initialization", + "test_db_detection_engines", + "test_db_event_destinations", + "test_db_event_routes", + "test_db_investigation_bookmarks", + "test_db_live_saved_layouts", + "test_db_locations", + "test_db_lpr_reads", + "test_db_onvif_discovery_inventory", + "test_db_operator_floor_plans", + "test_detection_system_onvif", + "test_event_bus", + "test_event_detection_adapter", + "test_event_envelope", + "test_event_outbox", + "test_event_route_suppression", + "test_event_router", + "test_external_motion_trigger", + "test_ffmpeg_rgb24_padding", + "test_go2rtc_base_path", + "test_go2rtc_lifecycle", + "test_go2rtc_recovery", + "test_hls_cache_cleanup", + "test_hls_reconnect_backoff", + "test_interruptible_sleep", + "test_mp4_faststart", + "test_mp4_segment_timestamps", + "test_mp4_writer_watchdog", + "test_mqtt_delivery_worker", + "test_onvif_discovery_response", + "test_onvif_lpr_event", + "test_onvif_poll_recovery", + "test_path_utils", + "test_recording_transcode", + "test_storage_deletion_ledger", + "test_stream_detection", + "test_stream_metrics" + ], + "feature_gated_tests_never_executed_in_ci": [ + "test_go2rtc_process_lifecycle", + "test_go2rtc_proxy_query", + "test_go2rtc_publish_async", + "test_go2rtc_stream_activity", + "test_go2rtc_unregister_recovery", + "test_go2rtc_websocket", + "test_sod_unified", + "test_sod_voc" + ], + "ci_selection_note": "ctest -R regexes are unanchored searches; selection computed by re.search over the registered names of each job's configuration. Tests registered but unselected still build in sanitizer/health jobs but never run.", + "baseline_summary": { + "as_specified": { + "total": 153, + "passed": 146, + "failed": [ + "test_audio_transcoder", + "test_audio_voice_filter_faults", + "test_hls_cleanup", + "test_mp4_audio_recovery", + "test_mp4_forced_reconnect", + "test_mp4_segment_boundaries", + "test_udt_recording" + ] + }, + "system_ffmpeg": { + "total": 153, + "passed": 153, + "failed": [] + } + } +} From 29eef1899daf0a3cbaeecf723828d2c3b849fac0 Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Sat, 31 Oct 2026 03:14:30 -0400 Subject: [PATCH 006/230] T6: Implement finding identity and exception policy checks Add scripts/quality/findings.py (stdlib only) that normalizes CodeQL/Trivy SARIF, clang-tidy, cppcheck XML, eslint JSON/job log, npm audit and GitHub REST reports into the T1 line-independent fingerprints and compares them by identity against quality/findings.json. New findings and bucket increases fail regardless of disappearances; expired/unbounded exceptions, missing, ambiguous, crashed, truncated, empty-scope and invalid reports fail; the checker's exit code (0/1/2/3) reflects report status, never scanner exit codes. Known coverage gaps are explicit, owned, expiring policy entries shown as NOT SCANNED. --check never writes; --update-baseline --reason is the only explicit writer. Co-Authored-By: Claude Opus 5.5 --- quality/evidence/T6.md | 187 +++ quality/findings-policy.json | 84 ++ scripts/quality/findings.py | 1123 +++++++++++++++++ .../fixtures/findings/base/inventory.json | 153 +++ .../fixtures/findings/base/policy.json | 35 + .../container-scan-200/trivy-results.sarif | 22 + .../clang-tidy-report/clang-tidy-report.txt | 8 + .../cppcheck-reports/cppcheck-report.xml | 16 + .../static-analysis-100/eslint-web.json | 36 + .../base/reports/github/codeql-abcdef12.sarif | 83 ++ .../base/reports/github/dependabot-open.json | 24 + .../base/reports/npm/web-audit-all.json | 61 + .../base/reports/npm/web-audit-prod.json | 22 + .../fixtures/findings/base/scanners.json | 71 ++ tests/quality/test_findings.py | 559 ++++++++ 15 files changed, 2484 insertions(+) create mode 100644 quality/evidence/T6.md create mode 100644 quality/findings-policy.json create mode 100644 scripts/quality/findings.py create mode 100644 tests/quality/fixtures/findings/base/inventory.json create mode 100644 tests/quality/fixtures/findings/base/policy.json create mode 100644 tests/quality/fixtures/findings/base/reports/actions/container-scan-200/trivy-results.sarif create mode 100644 tests/quality/fixtures/findings/base/reports/actions/static-analysis-100/clang-tidy-report/clang-tidy-report.txt create mode 100644 tests/quality/fixtures/findings/base/reports/actions/static-analysis-100/cppcheck-reports/cppcheck-report.xml create mode 100644 tests/quality/fixtures/findings/base/reports/actions/static-analysis-100/eslint-web.json create mode 100644 tests/quality/fixtures/findings/base/reports/github/codeql-abcdef12.sarif create mode 100644 tests/quality/fixtures/findings/base/reports/github/dependabot-open.json create mode 100644 tests/quality/fixtures/findings/base/reports/npm/web-audit-all.json create mode 100644 tests/quality/fixtures/findings/base/reports/npm/web-audit-prod.json create mode 100644 tests/quality/fixtures/findings/base/scanners.json create mode 100644 tests/quality/test_findings.py diff --git a/quality/evidence/T6.md b/quality/evidence/T6.md new file mode 100644 index 000000000..a2dd47d9d --- /dev/null +++ b/quality/evidence/T6.md @@ -0,0 +1,187 @@ +# T6 evidence: finding identity and exception policy checks + +Date: 2026-10-31. Branch `feat/engineering-foundation`. Python 3.14.4, stdlib only. +Raw outputs: `build/eng-artifacts/T6/` (gitignored): `red.txt`, `green.txt`, `t1-check.txt`, +`t1-check.json`, `t1-check-2026-12-01.txt`, `t1-check-2027-05-01.txt`, `t1-release.txt`. + +## Files + +| File | Purpose | +|---|---| +| `scripts/quality/findings.py` | checker: report normalizers, identity comparison, exception/gap policy, explicit baseline edit | +| `quality/findings-policy.json` | dispositions table, accepted exit codes, scope minimums, rename map, report pins, accepted coverage gaps | +| `tests/quality/test_findings.py` | 58 unittest cases | +| `tests/quality/fixtures/findings/base/` | synthetic scanners/inventory/policy/reports. The fixture inventory fingerprints were computed with the T1 generator formulas, independently of `findings.py` | +| `tests/quality/fixtures/findings/eslint-log/` | GitHub Actions job-log (stylish) fixture | + +## Design + +**Expected reports.** Every scanner in `quality/scanners.json` must be accounted for. The report path is resolved in this order: +1. `report_pins` in the policy (scoped to one reports dir) +2. `run-manifest.json` `reports` in the reports dir +3. `report_path_convention`. `` matches hex only and `` matches digits only. `{all,prod}` expands to several required files. Trailing ` (...)` notes are ignored. + +A pattern with 0 matches gives `missing-report`. If the scanner's `access_status` is `not-configured` or `disabled`, it gives `not-scanned` instead. A pattern with more than 1 match gives `ambiguous-report`; the checker never picks one. + +**Normalizers.** Each one reproduces the T1 fingerprint scheme exactly (`scanners.json#fingerprint_schemes`): + +| Scanner/format | Identity | Health/scope checks | +|---|---|---| +| CodeQL SARIF | `codeql:::` | `executionSuccessful=false` or an error notification gives `scanner-error`. A wrong `automationDetails` category gives `scope-mismatch`. Zero results need scope evidence. | +| Trivy SARIF | `trivy:::` | Missing `imageName`/`imageID` gives `empty-scope`. A different image gives `scope-mismatch`. | +| clang-tidy text | `line-tool` (rule\|path\|digit-normalized msg\|occurrence) | `[i/N] Processing` progress: no files gives `empty-scope`, and `i:` counts for style/information | Not XML v2 or no version gives `invalid-report`. Zero `` entries gives `empty-scope`. `internalError`, or a `checkersReport` saying "critical errors", gives `scanner-error` (marker `critical-errors`). | +| eslint JSON or stylish job log | `eslint-bucket::` counts | JSON `[]` gives `empty-scope`. A fatal parse message gives `scanner-error`. For the log, a parsed count different from the `✖ N problems` summary gives `invalid-report` (no partial parse). "Oops! Something went wrong" gives `scanner-error`. | +| npm audit JSON (all + prod) | `npm-audit:::` | An `error` key gives `scanner-error`. `dependencies.total==0` gives `empty-scope`. A build-only finding seen in the prod audit gives `exposure-escalation`. | +| Dependabot / Code Quality / advisories / secret scanning REST JSON | T1 sca / code-quality / `repo-advisory:sha256(GHSA)` / `secret::alert-` | An API error body (`{"message","status"}`, such as the 404 for disabled secret scanning) gives `scanner-error`, never an empty result. | +| Sanitizer ctest log | gate | Sanitizer marker or failed tests gives `gate-failed`. 0 tests gives `empty-scope`. No summary gives `invalid-report`. | + +**Comparison.** Findings are compared by identity, never by net counts: +- Any observed fingerprint missing from the inventory gives `new-finding`. +- Any bucket count above its baseline gives `bucket-increase`, and an unknown bucket gives `bucket-new`. +- These failures are reported even when other findings disappear or other buckets shrink. +- Disappearances are informational only: `resolved` / `bucket-decrease`. If the scan was partial, the label is `unobservable-partial-scan`. T1 `codeql-alert:` identities are labelled `unobservable-identity`. + +**Exceptions.** +- Inventory dispositions must exist in the policy `dispositions` table, otherwise `inventory-error`. +- Exception dispositions (`baseline-debt`, `exception-dismissed-false-positive`) must have `exception_expiry`; unbounded exceptions are an `inventory-error`. +- `today > expiry` gives `expired-exception`, whether or not the finding is still present. The expiry date is the last valid day. +- `--today` makes the date injectable. +- Duplicate fingerprints and unknown `scanner_id`s are also `inventory-error`. + +**Exit status.** +- If `run-manifest.json` exists, a recorded `status` other than success gives `scanner-error`. So does an `exit_code` outside `accepted_exit_codes` (default `[0]`; `[0,1]` for npm audit, because exit 1 only means findings exist). +- The manifest also supplies `files_scanned` (0 gives `empty-scope`), `tool_version`, `db_version` and `revision`. +- Report contents are always checked too, so neither an exit-code mistake nor a "success" status can override an error recorded in a report. +- The checker's own exit codes: + + | Code | Meaning | + |---|---| + | 0 | pass | + | 1 | policy failure | + | 2 | usage error or unreadable input (argparse, missing reports dir/inventory/policy) | + | 3 | internal error; traceback printed, plus `RESULT: ERROR - internal checker failure` | + +- Malformed report structure becomes an `invalid-report` failure for that scanner, not a crash. Nothing is caught and turned into exit 0. + +**Provenance.** +- Each scanner line prints tool name, version, query packs, DB version and revision. Values come from the SARIF driver/extensions/versionControlProvenance, the cppcheck version attribute, Trivy imageID, or the run manifest. +- A version different from `scanners.json` `tool_version` (or `db_version`) is listed under `PROVENANCE CHANGED : tool_version A -> B`. It is visible but does not fail. +- If no version is available, the output says `version not recorded in report`. That currently applies to clang-tidy, and to the Trivy DB version until T14 records it. + +**Renames.** +- Identity does not depend on line numbers. Real-data check: CodeQL analyses at `1b8d4332` and `8927bc8a` have 34/35 results shifted +7 lines by the SPDX headers, and fingerprints are identical. Both pass. +- Paths are part of identity. A path rename only keeps identity through an explicit, reviewed `path_renames` entry in the policy: `{from: inventoried path or dir/, to: current path or dir/, reason, approved_by}`. +- Observed paths are mapped back to `from` before fingerprinting, and every mapping is printed as `renamed`. +- Without an entry, a renamed file produces new findings, while the old ones show as resolved. +- After an explicit baseline edit rewrites the inventory paths, remove the map entry. +- The prefixes `/__w/lightNVR/lightNVR/` and `/home/runner/work/lightNVR/lightNVR/` are stripped. + +**Accepted coverage gaps.** +- A gap is an entry in `accepted_gaps`: `{scanner, condition, [marker], [reports_dirs], owner, expires, reason, coverage_gap_ref, status}`. +- It downgrades one specific coverage issue to `ACCEPTED GAP : NOT SCANNED|REPORT MISSING|SCANNER ERROR ...`, which is printed separately and never reported as a clean or valid-empty result. +- A gap without owner or expiry gives `policy-error`. An expired gap fails as the original condition with `[accepted gap expired ...]`. +- `--release` ignores all gaps. It also fails present findings whose disposition is `release_blocking`: `needs-triage`, `private-triage-pending`, `fixed-upstream-verify-regression`. +- All 4 gaps and their owners/expiries are `proposed-by-T6` and need maintainer confirmation. + +**Baseline edits.** +- `--check` never writes. A test verifies the inventory sha256 is unchanged after a failing check. +- `--update-baseline --reason TEXT` is the only writer. It refuses while any coverage/config failure exists, so a missing or crashed report cannot be baselined. +- It adds new findings as `needs-triage` with no expiry, adjusts bucket counts, and removes resolved records only for fully observed scanners. It does not touch expired exceptions. +- It appends a `baseline_edits` record (date, reason, reports dir, added, removed, bucket changes) and writes in the T1 one-record-per-line layout. +- `--check` and `--update-baseline` are mutually exclusive (exit 2). + +**Known limits.** +- With occurrence-index identity, if one of two diagnostics with the same rule, path and normalized message moves within a file, nothing new is reported. That is equivalent to a per-file bucket. +- For CodeQL SARIF from the REST API, a non-empty scope cannot be proven when there are zero results unless the run manifest provides `files_scanned`; the checker therefore fails such a report as `empty-scope`. +- GitHub REST alert lists cannot prove scope. An empty list is accepted as a valid empty result when the API returned 200. + +## RED → GREEN + +RED, before `findings.py` existed: `python3 -m unittest discover -s tests/quality -p test_findings.py` +``` +ModuleNotFoundError: No module named 'findings' +Ran 1 test in 0.000s +FAILED (errors=1) +``` +During GREEN, one intermediate failure (`test_expired_gap_fails`: the detail text casing) was fixed. Final run: +``` +Ran 58 tests in 0.633s +OK +``` +The tests cover these cases: +- a new finding plus a disappeared one (CodeQL, clang-tidy) +- bucket increase while another bucket decreases, and a new bucket +- valid empty Trivy result +- missing report, including a missing brace variant +- ambiguous and pinned reports +- clang-tidy crash markers, truncation, `clang-diagnostic-error`, and an empty report +- Trivy with no target; eslint `[]` and fatal messages; npm with 0 dependencies; empty cppcheck; cppcheck critical errors +- unparseable SARIF; SARIF execution failure; wrong SARIF category +- an API error body used as a report +- disabled scanner reported as `not-scanned` +- npm `error` key with exit 0; npm exit 1 with findings; manifest `status=failure`; manifest exit 139; `files_scanned=0`; required manifest missing +- internal error returns 3; missing reports dir is non-zero +- unexpired exception on its expiry day passes; expired exception fails (API and CLI) +- unbounded exception, unknown disposition, and duplicate fingerprint are inventory errors +- release-mode blockers +- gaps: accepted and visible, expired, ignored in release mode, missing owner, scoped to another dir +- tool version change surfaced; DB version taken from the manifest +- eslint log parity with JSON; eslint summary mismatch +- npm prod exposure escalation +- file and directory renames require a policy map +- line shift keeps fingerprints; the T1 scheme hash is reproduced +- `--check` does not modify the inventory; `--update-baseline` requires a reason, is recorded, and refuses on coverage failure; the two modes are mutually exclusive + +## Real-report check (T1 reports) + +Command: `python3 scripts/quality/findings.py --check --reports build/eng-artifacts/T1 --inventory quality/findings.json` → **exit 0**, `RESULT: PASS (0 policy failures; 4 accepted coverage gap(s) listed above are not clean results)`. The inventory sha256 was unchanged. + +Every itemized and bucketed identity reproduced exactly from the raw reports, so there were 0 new findings and 0 bucket increases: + +| Scanner | Status | Observed | +|---|---|---| +| codeql-cpp | OK | 35 items, CodeQL 2.27.3 @8927bc8a (pinned) | +| github-code-quality | OK | 1 | +| clang-tidy | OK | 296 items, 258 files processed; tool version not recorded in report | +| cppcheck | ACCEPTED GAP (SCANNER ERROR `critical-errors`) | 32 items + 143 buckets / 573, cppcheck 2.13.0 | +| eslint-web | OK | 216 buckets / 897 (summary-line parity verified) | +| trivy-container | OK, valid empty | image lightnvr:scan sha256:edd76f014512, Trivy 0.76.1 | +| dependabot | OK | 1 | +| npm-audit-root | OK, valid empty | 36 dependencies audited | +| npm-audit-web | OK | 3 | +| repo-security-advisories | OK | 6 (sanitized identities) | +| codeql-javascript-typescript | ACCEPTED GAP: NOT SCANNED (not-configured) | until 2027-01-31, owner T14 | +| secret-scanning | ACCEPTED GAP: NOT SCANNED (disabled, 404) | until 2026-12-31, owner maintainers/security | +| sanitizer-asan-ubsan | ACCEPTED GAP: REPORT MISSING, scoped to `build/eng-artifacts/T1` only | until 2026-11-30 | + +Info: 10 `unobservable-identity` records. These are the dismissed go2rtc `codeql-alert:` alerts; they are not in the analysed scope (`ENABLE_GO2RTC=OFF`), so their absence is not counted as a fix. + +Without the policy, the same reports fail with 12 failures. `t1-check` was run against the fixture policy during development: +- `ambiguous-report` for codeql-cpp: there are two SARIFs, so a pin is required. +- `not-scanned` for secret-scanning and JS CodeQL. +- `missing-report` for the sanitizer. +- `scanner-error` for cppcheck. +- 6 `inventory-error`s for advisory dispositions missing from that minimal policy. + +This shows the gate does not treat absence as clean. + +The same reports were checked under other dates and modes: + +| Run | Exit | Result | Why | +|---|---|---|---| +| `--today 2026-12-01` | 1 | 1 coverage failure; output says "all failures are report-coverage gaps, not new findings" | The sanitizer gap expired; gap expiry is enforced. | +| `--today 2027-05-01` | 1 | 575 expired exceptions + 4 coverage failures | T1's proposed 2027-04-30 expiries lapsed. | +| `--release` | 1 | 146 release-blockers (needs-triage / private-triage-pending / fixed-upstream-verify-regression) + 4 coverage | Release mode ignores accepted gaps. This is the T33 posture. | + +Reading the output: +- A crash prints `RESULT: ERROR` and exits 3. +- A known-gap-only failure prints `RESULT: FAIL ... (coverage N, findings 0, ...); all failures are report-coverage gaps, not new findings` and exits 1. + +## Notes for T14 / T33 + +- T14 should write `run-manifest.json` per report dir (exit_code, status, files_scanned, tool_version, db_version) and then set `require_run_manifest: true`. +- T14 should also emit eslint `-f json` and record the clang-tidy version and the Trivy DB version. +- T14 needs to run the sanitizer log retrieval, or remove the expectation from `scanners.json`. +- T14 changes to `scanners.json` (for example adding codeql-js) automatically turn the matching gap into `unused-gap` info; delete the gap entry then. +- T33 should run `--check` and also `--release`. Accepted gaps do not satisfy release. diff --git a/quality/findings-policy.json b/quality/findings-policy.json new file mode 100644 index 000000000..bf6e24efb --- /dev/null +++ b/quality/findings-policy.json @@ -0,0 +1,84 @@ +{ + "schema_version": 1, + "producer": "T6", + "checker": "scripts/quality/findings.py", + "notes": [ + "--check never edits quality/findings.json; --update-baseline --reason is the only writer and appends a baseline_edits record.", + "Identity is the line-independent T1 fingerprint (quality/scanners.json#fingerprint_schemes). New fingerprints fail even when others disappear; bucket counts fail on any increase.", + "Expiry dates are the last valid day: an exception or gap fails when today > expires.", + "Accepted gaps are known coverage holes, printed as ACCEPTED GAP / NOT SCANNED and never counted as clean results. --release ignores all accepted gaps.", + "All owners/expiries below with status proposed-by-T6 need maintainer confirmation (no CODEOWNERS exists; see GAP-no-codeowners)." + ], + "dispositions": { + "needs-triage": {"exception": false, "release_blocking": true, "meaning": "open, unreviewed; tolerated by --check only because it is inventoried"}, + "baseline-debt": {"exception": true, "release_blocking": false, "meaning": "accepted low-severity debt; requires exception_expiry"}, + "exception-dismissed-false-positive": {"exception": true, "release_blocking": false, "meaning": "dismissed upstream; requires exception_expiry"}, + "fixed-upstream-verify-regression": {"exception": false, "release_blocking": true, "meaning": "published advisory; release needs regression evidence"}, + "fixed-verified": {"exception": false, "release_blocking": false, "meaning": "fix and regression evidence recorded"}, + "private-triage-pending": {"exception": false, "release_blocking": true, "meaning": "private advisory awaiting maintainer status"}, + "closed-upstream": {"exception": false, "release_blocking": false, "meaning": "private advisory closed upstream"}, + "informational": {"exception": false, "release_blocking": false, "meaning": "tool diagnostics about analysis coverage, not code findings"} + }, + "expiry_warning_days": 30, + "accepted_exit_codes": { + "default": [0], + "npm-audit-root": [0, 1], + "npm-audit-web": [0, 1], + "_note": "Only consulted when run-manifest.json records exit_code. npm audit exits 1 whenever vulnerabilities exist; its failures are detected from the JSON 'error' key. clang-tidy/cppcheck/trivy are forced to exit 0 in CI, so their health comes from report contents (progress lines, crash markers, checkersReport, scan target)." + }, + "require_run_manifest": false, + "require_run_manifest_note": "T14 should emit build/eng-artifacts//run-manifest.json (exit_code, status, files_scanned, tool_version, db_version per scanner) and then set this to true.", + "scope_minimums": { + "clang-tidy": {"files": 250, "basis": "T1 run 41176542849 declared 258 source files"} + }, + "strip_path_prefixes": ["/__w/lightNVR/lightNVR/", "/home/runner/work/lightNVR/lightNVR/"], + "path_renames": [], + "path_renames_format": "{\"from\": \"\", \"to\": \"\", \"reason\": \"...\", \"approved_by\": \"...\"}. Observed paths equal to 'to' (or under a 'to' directory ending in '/') are fingerprinted with the 'from' path, so a reviewed rename keeps inventory identity. Remove the entry after an explicit --update-baseline rewrites the inventory with the new paths.", + "report_pins": [ + { + "reports_dir": "build/eng-artifacts/T1", + "scanner": "codeql-cpp", + "paths": ["github/codeql-8927bc8a.sarif"], + "reason": "T1 retrieved two CodeQL analyses; the inventory was built from analysis 2067529268 @8927bc8a (1b8d4332 has identical rule/path/lineHash keys)." + } + ], + "accepted_gaps": [ + { + "scanner": "secret-scanning", + "condition": "not-scanned", + "owner": "maintainers/security", + "expires": "2026-12-31", + "coverage_gap_ref": "GAP-secret-scanning-disabled", + "status": "proposed-by-T6", + "reason": "GitHub secret scanning is disabled (HTTP 404) and no local secret scanner exists. NOT a clean result; enable it or add a scanner before expiry." + }, + { + "scanner": "codeql-javascript-typescript", + "condition": "not-scanned", + "owner": "T14", + "expires": "2027-01-31", + "coverage_gap_ref": "GAP-no-js-ts-sast", + "status": "proposed-by-T6", + "reason": "No JS/TS security SAST is configured yet; T14 adds it." + }, + { + "scanner": "cppcheck", + "condition": "scanner-error", + "marker": "critical-errors", + "owner": "T14", + "expires": "2027-01-31", + "coverage_gap_ref": "GAP-cppcheck-config-coverage", + "status": "proposed-by-T6", + "reason": "cppcheck runs without a compile database; checkersReport reports critical errors (partial analysis). Findings are still compared; resolved items are reported as unobserved, not fixed." + }, + { + "scanner": "sanitizer-asan-ubsan", + "condition": "missing-report", + "reports_dirs": ["build/eng-artifacts/T1"], + "owner": "coordinator", + "expires": "2026-11-30", + "status": "proposed-by-T6", + "reason": "T1 recorded only the job conclusion (success at 1b8d4332 and 8927bc8a) and did not download the ctest log. Scoped to the T1 report directory only; later report directories must include the log." + } + ] +} diff --git a/scripts/quality/findings.py b/scripts/quality/findings.py new file mode 100644 index 000000000..997feb07c --- /dev/null +++ b/scripts/quality/findings.py @@ -0,0 +1,1123 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: GPL-3.0-or-later +# Copyright (C) 2025-2026 OpenSensor Engineering and LightNVR contributors +"""Finding identity and exception policy checker (engineering-foundation T6). + +Normalizes raw scanner reports (SARIF from CodeQL/Trivy, clang-tidy text, +cppcheck XML v2, eslint JSON or stylish job log, npm audit JSON, GitHub +Dependabot / Code Quality / security-advisory / secret-scanning REST JSON, +sanitizer ctest log) into line-independent fingerprints, then compares them with +the reviewed inventory (quality/findings.json) under quality/findings-policy.json. + +Usage (from the repo root; Python 3 stdlib only): + python3 scripts/quality/findings.py --check --reports build/eng-artifacts/ \ + [--inventory quality/findings.json] [--scanners quality/scanners.json] \ + [--policy quality/findings-policy.json] [--today YYYY-MM-DD] [--release] \ + [--json-out FILE] + python3 scripts/quality/findings.py --update-baseline --reason "why" --reports ... + +Expected scanners come from quality/scanners.json (report_path_convention, +report_format, scope, access_status). A reports directory may also contain +run-manifest.json written by the pipeline: + {"schema_version": 1, "revision": "", + "scanners": {"": {"exit_code": 0, "status": "success", + "reports": ["relative/path"], "tool_version": "...", "db_version": "...", + "files_scanned": 123}}} +Recorded non-success status or an exit code outside the policy's +accepted_exit_codes is a scanner error even when a report file exists. + +Exit codes (the checker's own status, independent of any scanner exit code): + 0 pass: every expected report present, valid, in scope, and no policy failure + 1 policy failure (new finding, bucket increase, expired exception, missing / + crashed / empty-scope / invalid report, inventory or policy error) + 2 usage or unreadable input (bad arguments, missing inventory/policy/reports dir) + 3 internal checker error (traceback printed; never treated as a verdict) +--check never writes the inventory. --update-baseline is the only writer, and it +requires --reason, refuses while any coverage/config failure exists, and appends +an auditable baseline_edits record. +""" +import argparse +import collections +import datetime as dt +import hashlib +import json +import os +import re +import sys +import traceback +import xml.etree.ElementTree as ET +from pathlib import Path + +EXIT_PASS, EXIT_FAIL, EXIT_USAGE, EXIT_INTERNAL = 0, 1, 2, 3 + +KIND_CLASS = { + # coverage: the scan itself cannot be trusted as a complete result + "missing-report": "coverage", "not-scanned": "coverage", "ambiguous-report": "coverage", + "invalid-report": "coverage", "scanner-error": "coverage", "truncated-report": "coverage", + "empty-scope": "coverage", "scope-mismatch": "coverage", "missing-run-manifest": "coverage", + "invalid-run-manifest": "coverage", + # findings: the scan is valid and reports something not accepted by the inventory + "new-finding": "finding", "bucket-new": "finding", "bucket-increase": "finding", + "exposure-escalation": "finding", "release-blocker": "finding", "gate-failed": "finding", + # exceptions + "expired-exception": "exception", + # configuration of the gate itself + "inventory-error": "config", "policy-error": "config", +} +GAP_LABEL = { + "not-scanned": "NOT SCANNED", "missing-report": "REPORT MISSING", "scanner-error": "SCANNER ERROR", + "empty-scope": "EMPTY SCOPE", "truncated-report": "TRUNCATED REPORT", "invalid-report": "INVALID REPORT", + "ambiguous-report": "AMBIGUOUS REPORT", "scope-mismatch": "SCOPE MISMATCH", + "missing-run-manifest": "NO RUN MANIFEST", +} +FATAL_KINDS = {"missing-report", "not-scanned", "ambiguous-report", "invalid-report", "empty-scope", "scope-mismatch"} +DEFAULT_STRIP_PREFIXES = ["/__w/lightNVR/lightNVR/", "/home/runner/work/lightNVR/lightNVR/"] +SUCCESS_STATUSES = {"success", "succeeded", "ok", "passed", "completed"} + + +# -------------------------------------------------------------------------- +# identity helpers (identical to the T1 generator, build/eng-artifacts/T1/generator) +# -------------------------------------------------------------------------- +def fp(*parts): + return hashlib.sha256("|".join(str(p) for p in parts).encode()).hexdigest()[:16] + + +def norm_msg(m): + return re.sub(r"\d+", "N", (m or "").strip()) + + +def line_tool_fingerprint(tool, rule, path, msg, occurrence): + """T1 'line-tool' scheme: no line numbers, digits in messages normalized.""" + return f"{tool}:{rule}:{path}:{fp(rule, path, norm_msg(msg), occurrence)}" + + +class UsageError(Exception): + pass + + +class ReportIssue(Exception): + def __init__(self, kind, detail, marker=None): + super().__init__(detail) + self.kind, self.detail, self.marker = kind, detail, marker + + +def parse_date(value, what): + if isinstance(value, dt.date): + return value + try: + return dt.date.fromisoformat(str(value)) + except ValueError: + raise ValueError(f"{what}: invalid ISO date {value!r}") + + +# -------------------------------------------------------------------------- +# observation container +# -------------------------------------------------------------------------- +class Obs: + def __init__(self, scanner, ctx): + self.scanner = scanner + self.ctx = ctx + self.items = {} # fingerprint -> record + self.buckets = collections.Counter() # fingerprint -> count + self.bucket_meta = {} + self.variants = collections.defaultdict(set) + self.provenance = {} + self.issues = [] # dicts kind/detail/marker/fatal + self.scope_evidence = None # description of non-empty scope, if known + self.zero_ok = False # True when the format itself proves scope for empty results + self.notes = [] + + def issue(self, kind, detail, marker=None): + self.issues.append({"kind": kind, "detail": detail, "marker": marker, "fatal": kind in FATAL_KINDS}) + + def item(self, fingerprint, rule, path, line=None, extra=None): + rec = {"fingerprint": fingerprint, "rule_id": rule, "location": {"path": path, "line": line}} + if extra: + rec.update(extra) + self.items[fingerprint] = rec + return rec + + def bucket(self, fingerprint, rule, path, n=1): + self.buckets[fingerprint] += n + self.bucket_meta[fingerprint] = {"rule_id": rule, "path": path} + + def canon(self, path): + return self.ctx.canon(path) + + +class Ctx: + def __init__(self, policy): + self.strip = list(policy.get("strip_path_prefixes") or DEFAULT_STRIP_PREFIXES) + self.renames = [] + for r in policy.get("path_renames") or []: + self.renames.append((r["from"], r["to"])) + self.renamed = {} + + def canon(self, path): + if path is None: + return None + p = str(path) + for pre in self.strip: + if p.startswith(pre): + p = p[len(pre):] + break + for old, new in self.renames: + if new.endswith("/") and p.startswith(new): + self.renamed[p] = old + p[len(new):] + return old + p[len(new):] + if p == new: + self.renamed[p] = old + return old + return p + + +def read_json(path): + try: + with open(path, encoding="utf-8") as fh: + return json.load(fh) + except (OSError, UnicodeDecodeError, json.JSONDecodeError) as e: + raise ReportIssue("invalid-report", f"{path.name}: unparseable JSON ({e.__class__.__name__}: {e})") + + +def read_text(path): + try: + return path.read_text(encoding="utf-8", errors="replace") + except OSError as e: + raise ReportIssue("invalid-report", f"{path.name}: unreadable ({e})") + + +def api_error_check(doc, path): + if isinstance(doc, dict) and "message" in doc and ("status" in doc or "documentation_url" in doc): + status = doc.get("status", "?") + raise ReportIssue("scanner-error", f"{path.name}: API error body, not a result (HTTP {status}: {doc['message']})", + marker=f"api-error-{status}") + + +# -------------------------------------------------------------------------- +# normalizers +# -------------------------------------------------------------------------- +def _sarif_runs(path): + doc = read_json(path) + runs = doc.get("runs") if isinstance(doc, dict) else None + if not isinstance(runs, list) or not runs: + raise ReportIssue("invalid-report", f"{path.name}: SARIF without runs") + return runs + + +def _sarif_common(run, obs, path): + drv = ((run.get("tool") or {}).get("driver")) or {} + if not drv.get("name"): + raise ReportIssue("invalid-report", f"{path.name}: SARIF run without tool.driver.name") + obs.provenance.setdefault("tool", drv.get("name")) + ver = drv.get("semanticVersion") or drv.get("version") + if ver: + obs.provenance["version"] = ver + exts = [f"{e.get('name')} {e.get('semanticVersion') or e.get('version') or '?'}" + for e in (run.get("tool") or {}).get("extensions") or []] + if exts: + obs.provenance["extensions"] = exts + for v in run.get("versionControlProvenance") or []: + if v.get("revisionId"): + obs.provenance["revision"] = v["revisionId"][:12] + for inv in run.get("invocations") or []: + if inv.get("executionSuccessful") is False: + obs.issue("scanner-error", f"{path.name}: invocation executionSuccessful=false", "execution-unsuccessful") + for n in inv.get("toolExecutionNotifications") or []: + if n.get("level") == "error": + obs.issue("scanner-error", f"{path.name}: tool error notification: " + f"{((n.get('message') or {}).get('text') or '')[:160]}", "tool-error-notification") + if not isinstance(run.get("results"), list): + raise ReportIssue("invalid-report", f"{path.name}: SARIF run without results array") + + +def norm_codeql(paths, sc, obs): + want = ((sc.get("scope") or {}).get("category") or "").rstrip("/") + for path in paths: + for run in _sarif_runs(path): + _sarif_common(run, obs, path) + cat = ((run.get("automationDetails") or {}).get("id") or "").rstrip("/") + if want and cat and not cat.startswith(want): + obs.issue("scope-mismatch", f"{path.name}: SARIF category {cat!r} != expected {want!r}") + if run.get("artifacts"): + obs.scope_evidence = f"{len(run['artifacts'])} SARIF artifacts" + for res in run["results"]: + rule = res.get("ruleId") or (res.get("rule") or {}).get("id") + loc = res["locations"][0]["physicalLocation"] + p = obs.canon(loc["artifactLocation"]["uri"]) + line = (loc.get("region") or {}).get("startLine") + lh = (res.get("partialFingerprints") or {}).get("primaryLocationLineHash") + if lh: + f = f"codeql:{rule}:{p}:{lh}" + else: + f = f"codeql:{rule}:{p}:msg-{fp(norm_msg((res.get('message') or {}).get('text')))}" + obs.notes.append(f"{f}: no primaryLocationLineHash; message-hash fallback") + obs.item(f, rule, p, line) + + +def norm_trivy(paths, sc, obs): + want = ((sc.get("scope") or {}).get("image") or "").split(" ")[0] # "lightnvr:scan built from ./Dockerfile" + for path in paths: + for run in _sarif_runs(path): + _sarif_common(run, obs, path) + props = run.get("properties") or {} + target = props.get("imageName") or props.get("imageID") or props.get("ArtifactName") + if not target: + obs.issue("empty-scope", f"{path.name}: no scan target recorded (properties.imageName/imageID missing)") + continue + if want and props.get("imageName") and props["imageName"] != want: + obs.issue("scope-mismatch", f"{path.name}: scanned image {props['imageName']!r} != expected {want!r}") + obs.scope_evidence = f"image {props.get('imageName')} {str(props.get('imageID', ''))[:19]}" + obs.zero_ok = True + for res in run["results"]: + rule = res.get("ruleId") + loc = ((res.get("locations") or [{}])[0].get("physicalLocation") or {}) + uri = obs.canon((loc.get("artifactLocation") or {}).get("uri") or target) + m = re.search(r"Package: (\S+)", (res.get("message") or {}).get("text") or "") + pkg = m.group(1) if m else "" + obs.item(f"trivy:{uri}:{pkg}:{rule}", rule, uri, None, {"package": pkg}) + + +CT_RE = re.compile(r"^(?P\S+?):(?P\d+):(?P\d+): (?Pwarning|error): (?P.*) \[(?P[A-Za-z0-9.,_-]+)\]$") +CT_PROGRESS = re.compile(r"^\[(\d+)/(\d+)\] Processing file (\S+?)\.?$") +CRASH_MARKERS = ("Stack dump:", "PLEASE submit a bug report", "Segmentation fault", "LLVM ERROR:", + "Aborted (core dumped)", "terminate called after throwing") + + +def norm_clang_tidy(paths, sc, obs): + for path in paths: + text = read_text(path) + items, files, max_idx, total = [], set(), 0, 0 + for raw in text.splitlines(): + m = CT_PROGRESS.match(raw) + if m: + max_idx, total = max(max_idx, int(m[1])), max(total, int(m[2])) + files.add(m[3]) + continue + for marker in CRASH_MARKERS: + if raw.startswith(marker) or marker in raw[:80]: + obs.issue("scanner-error", f"{path.name}: crash marker {marker!r}", "crash") + m = CT_RE.match(raw) + if m: + items.append((obs.canon(m["file"]), int(m["line"]), m["sev"], m["chk"], m["msg"])) + if not files and not items: + obs.issue("empty-scope", f"{path.name}: no files processed and no diagnostics (empty or crashed run)") + continue + if not files: + obs.issue("truncated-report", f"{path.name}: diagnostics without run-clang-tidy progress lines") + elif max_idx < total: + obs.issue("truncated-report", f"{path.name}: progress stopped at {max_idx}/{total}") + obs.scope_evidence = f"{len(files)} files processed (declared {total})" + obs.provenance["files_scanned"] = len(files) + if any(i[3] == "clang-diagnostic-error" for i in items): + n = sum(1 for i in items if i[3] == "clang-diagnostic-error") + obs.issue("scanner-error", f"{path.name}: {n} clang-diagnostic-error (translation units not fully analyzed)", + "compile-error") + items.sort() + occ = collections.Counter() + for p, line, sev, chk, msg in items: + key = (chk, p, norm_msg(msg)) + occ[key] += 1 + obs.item(line_tool_fingerprint("clang-tidy", chk, p, msg, occ[key]), chk, p, line, {"severity": sev}) + + +CPPCHECK_INTERNAL = {"internalError", "internalAstError", "cppcheckError", "premiumInternalError", "syntaxErrorInternal"} + + +def norm_cppcheck(paths, sc, obs): + for path in paths: + try: + root = ET.parse(path).getroot() + except (ET.ParseError, OSError) as e: + raise ReportIssue("invalid-report", f"{path.name}: unparseable XML ({e})") + if root.tag != "results" or root.get("version") != "2": + raise ReportIssue("invalid-report", f"{path.name}: not cppcheck XML v2") + ver = root.find("cppcheck") + if ver is None or not ver.get("version"): + raise ReportIssue("invalid-report", f"{path.name}: no ") + obs.provenance.update(tool="cppcheck", version=ver.get("version")) + errs_el = root.find("errors") + if errs_el is None: + raise ReportIssue("invalid-report", f"{path.name}: no element") + errs = errs_el.findall("error") + if not errs: + obs.issue("empty-scope", f"{path.name}: no entries at all (not even checkersReport); " + "cannot distinguish a clean scan from an empty scope") + continue + files = {loc.get("file") for e in errs for loc in e.findall("location")} + obs.scope_evidence = f"{len(files)} files with diagnostics" + for e in errs: + if e.get("id") in CPPCHECK_INTERNAL: + obs.issue("scanner-error", f"{path.name}: cppcheck {e.get('id')}: {e.get('msg', '')[:120]}", "internal-error") + if e.get("id") == "checkersReport" and "critical error" in (e.get("msg") or ""): + obs.issue("scanner-error", f"{path.name}: checkersReport says 'There was critical errors' " + "(some files/configurations not analyzed)", "critical-errors") + + def sort_key(e): + loc = e.find("location") + return (loc.get("file") if loc is not None else "", int(loc.get("line")) if loc is not None else 0, e.get("id")) + + occ = collections.Counter() + for e in sorted(errs, key=sort_key): + loc = e.find("location") + p = obs.canon(loc.get("file") if loc is not None else (e.get("file0") or "")) + line = int(loc.get("line")) if loc is not None else None + sev, rid = e.get("severity"), e.get("id") + if sev in ("style", "information"): + obs.bucket(f"cppcheck-bucket:{rid}:{p}", rid, p) + continue + key = (rid, p, norm_msg(e.get("msg"))) + occ[key] += 1 + obs.item(f"cppcheck:{rid}:{p}:{fp(*key, occ[key])}", rid, p, line, {"severity": sev}) + + +ES_STEP = "Report JSX accessibility findings" +ES_FILE = re.compile(r"(?:^|Z )(?P/\S+\.(?:js|jsx|ts|tsx|mjs|cjs))\s*$") +ES_WARN = re.compile(r"\s(\d+):(\d+)\s+(warning|error)\s+.*\s(\S+)$") +ES_SUMMARY = re.compile(r"✖ (\d+) problems? \((\d+) errors?, (\d+) warnings?\)") + + +def norm_eslint(paths, sc, obs): + obs.provenance.setdefault("tool", "eslint") + for path in paths: + text = read_text(path) + if text.lstrip().startswith("["): + doc = read_json(path) + if not isinstance(doc, list): + raise ReportIssue("invalid-report", f"{path.name}: eslint JSON is not a list") + if not doc: + obs.issue("empty-scope", f"{path.name}: eslint JSON lists no linted files") + continue + obs.scope_evidence = f"{len(doc)} files linted" + obs.zero_ok = True + obs.provenance["files_scanned"] = len(doc) + for fr in doc: + p = obs.canon(fr.get("filePath")) + for m in fr.get("messages") or []: + if m.get("fatal"): + obs.issue("scanner-error", f"{path.name}: fatal eslint message in {p}: {str(m.get('message'))[:120]}", + "fatal-parse-error") + continue + rule = m.get("ruleId") + if not rule: + obs.notes.append(f"eslint message without ruleId in {p}: {str(m.get('message'))[:80]}") + continue + obs.bucket(f"eslint-bucket:{rule}:{p}", rule, p) + continue + # stylish text inside a GitHub Actions job log + lines = text.splitlines() + if any(ES_STEP in l for l in lines): + lines = [l for l in lines if ES_STEP in l] + if any("Oops! Something went wrong" in l for l in lines): + obs.issue("scanner-error", f"{path.name}: eslint crashed ('Oops! Something went wrong')", "crash") + invoked = any(re.search(r"> eslint\b", l) for l in lines) + cur, n, summary = None, 0, None + for l in lines: + m = ES_SUMMARY.search(l) + if m: + summary = (int(m[1]), int(m[2]), int(m[3])) + continue + m = ES_FILE.search(l) + if m: + cur = obs.canon(m["f"]) + continue + m = ES_WARN.search(l) + if m and cur: + obs.bucket(f"eslint-bucket:{m.group(4)}:{cur}", m.group(4), cur) + n += 1 + if summary is not None: + if summary[0] != n: + raise ReportIssue("invalid-report", f"{path.name}: parsed {n} problems but eslint summary says {summary[0]} " + "(log format drift; refusing partial parse)") + obs.scope_evidence = f"eslint summary {summary[0]} problems" + elif n: + raise ReportIssue("invalid-report", f"{path.name}: {n} problems parsed but no eslint summary line (truncated log?)") + elif not invoked: + obs.issue("empty-scope", f"{path.name}: no eslint invocation found in log") + else: + obs.scope_evidence = "eslint invoked; no problems reported" + obs.zero_ok = True + + +def _npm_lockfile(sc): + lock = (sc.get("scope") or {}).get("lockfile") + if lock: + return lock + sid = sc["id"] + return "package-lock.json" if sid.endswith("-root") else f"{sid.split('npm-audit-', 1)[-1]}/package-lock.json" + + +def norm_npm_audit(paths, sc, obs): + lock = _npm_lockfile(sc) + obs.provenance.setdefault("tool", "npm audit") + for path in paths: + variant = "prod" if re.search(r"-prod\b", path.name) else "all" + doc = read_json(path) + if not isinstance(doc, dict): + raise ReportIssue("invalid-report", f"{path.name}: npm audit JSON is not an object") + if "error" in doc: + err = doc["error"] if isinstance(doc["error"], dict) else {"summary": str(doc["error"])} + raise ReportIssue("scanner-error", f"{path.name}: npm audit error {err.get('code', '')}: {str(err.get('summary', ''))[:160]}", + marker=f"npm-error-{err.get('code', 'unknown')}") + if doc.get("auditReportVersion") != 2: + raise ReportIssue("invalid-report", f"{path.name}: auditReportVersion {doc.get('auditReportVersion')!r} != 2") + obs.provenance["report_format_version"] = 2 + total = (((doc.get("metadata") or {}).get("dependencies")) or {}).get("total") + if not total: + obs.issue("empty-scope", f"{path.name}: metadata.dependencies.total={total!r} (no dependencies audited)") + continue + obs.scope_evidence = f"{total} dependencies audited" + obs.zero_ok = True + for name, v in (doc.get("vulnerabilities") or {}).items(): + for via in v.get("via") or []: + if isinstance(via, dict): + ghsa = str(via.get("url", "")).rsplit("/", 1)[-1] or str(via.get("source")) + f = f"npm-audit:{lock}:{name}:{ghsa}" + obs.item(f, ghsa, lock, None, {"package": name}) + obs.variants[f].add(variant) + + +def _api_list(path): + doc = read_json(path) + api_error_check(doc, path) + if not isinstance(doc, list): + raise ReportIssue("invalid-report", f"{path.name}: expected a JSON list of alerts") + return doc + + +def norm_dependabot(paths, sc, obs): + obs.provenance.setdefault("tool", "GitHub Dependabot alerts") + for path in paths: + for a in _api_list(path): + if a.get("state") not in (None, "open"): + continue + dep, adv = a["dependency"], a["security_advisory"] + m = obs.canon(dep["manifest_path"]) + f = f"dependabot:{m}:{dep['package']['name']}:{adv['ghsa_id']}" + obs.item(f, adv["ghsa_id"], m, None, {"package": dep["package"]["name"]}) + obs.zero_ok = True + + +def norm_code_quality(paths, sc, obs): + obs.provenance.setdefault("tool", "GitHub Code Quality") + for path in paths: + for a in _api_list(path): + if a.get("state") not in (None, "open"): + continue + loc = a["location"] + p = obs.canon(loc["path"]) + f = f"code-quality:{a['rule']['id']}:{p}:{fp(norm_msg(a['message']['text']))}" + obs.item(f, a["rule"]["id"], p, loc.get("start_line")) + obs.zero_ok = True + + +def norm_advisories(paths, sc, obs): + obs.provenance.setdefault("tool", "GitHub repository security advisories") + for path in paths: + for a in _api_list(path): + f = f"repo-advisory:{hashlib.sha256(a['ghsa_id'].encode()).hexdigest()[:16]}" + obs.item(f, "repository-security-advisory", None, None) # never echo private IDs + obs.zero_ok = True + + +def norm_secret(paths, sc, obs): + obs.provenance.setdefault("tool", "GitHub secret scanning") + for path in paths: + for a in _api_list(path): + if a.get("state") not in (None, "open"): + continue + # never the secret value + f = f"secret:{a.get('secret_type', 'unknown')}:alert-{a.get('number')}" + obs.item(f, a.get("secret_type"), None, None) + obs.zero_ok = True + + +def norm_sanitizer(paths, sc, obs): + obs.provenance.setdefault("tool", "ctest + ASan/UBSan") + for path in paths: + text = read_text(path) + for marker in ("ERROR: AddressSanitizer", "ERROR: LeakSanitizer", "runtime error:"): + if marker in text: + obs.issue("gate-failed", f"{path.name}: sanitizer report {marker!r}", "sanitizer") + if "No tests were found" in text: + obs.issue("empty-scope", f"{path.name}: ctest found no tests") + continue + m = re.search(r"(\d+)% tests passed, (\d+) tests? failed out of (\d+)", text) + if not m: + raise ReportIssue("invalid-report", f"{path.name}: no ctest summary line (crashed or truncated log)") + if int(m[3]) == 0: + obs.issue("empty-scope", f"{path.name}: ctest ran 0 tests") + elif int(m[2]): + obs.issue("gate-failed", f"{path.name}: {m[2]} of {m[3]} tests failed", "ctest") + obs.scope_evidence = f"{m[3]} tests" + obs.zero_ok = True + + +def choose_normalizer(sc): + sid, fmt, kind = sc["id"], (sc.get("report_format") or "").lower(), (sc.get("kind") or "").lower() + if sid.startswith("trivy") or (fmt.startswith("sarif") and kind.startswith("container")): + return norm_trivy + if fmt.startswith("sarif"): + return norm_codeql + if sid.startswith("clang-tidy") or "clang-diagnostic" in fmt: + return norm_clang_tidy + if sid.startswith("cppcheck") or "cppcheck-xml" in fmt: + return norm_cppcheck + if sid.startswith("eslint") or fmt.startswith("eslint"): + return norm_eslint + if sid.startswith("npm-audit") or "npm-audit" in fmt: + return norm_npm_audit + if "dependabot" in sid or "dependabot" in fmt: + return norm_dependabot + if "code-quality" in sid or "code-quality" in fmt: + return norm_code_quality + if "advisor" in sid: + return norm_advisories + if "secret" in sid: + return norm_secret + if "sanitizer" in sid: + return norm_sanitizer + return None + + +# -------------------------------------------------------------------------- +# report discovery +# -------------------------------------------------------------------------- +def expand_convention(conv): + conv = conv.split(" (")[0].strip() + conv = re.sub(r"^build/eng-artifacts//", "", conv) + m = re.search(r"\{([^{}]*,[^{}]*)\}", conv) + if not m: + return [conv] + out = [] + for alt in m[1].split(","): + out.extend(expand_convention(conv[:m.start()] + alt + conv[m.end():])) + return out + + +def convention_regex(rel): + rx = "" + for part in re.split(r"(<[a-z0-9_]+>)", rel): + if part == "": + rx += "[0-9a-f]{7,40}" + elif part == "": + rx += "[0-9]+" + elif part.startswith("<") and part.endswith(">"): + rx += "[^/]+" + else: + rx += re.escape(part) + return re.compile(rx) + + +def discover(reports_dir, sc, pins, manifest_entry): + """Return (list of paths, list of issues, source label).""" + if pins: + rels, src = pins, "policy report_pins" + elif manifest_entry and manifest_entry.get("reports"): + rels, src = manifest_entry["reports"], "run-manifest.json" + else: + conv = sc.get("report_path_convention") + if not conv: + return [], [("missing-report", "scanners.json has no report_path_convention")], "none" + paths, issues = [], [] + for rel in expand_convention(conv): + rx = convention_regex(rel) + glob = re.sub(r"<[a-z0-9_]+>", "*", rel) + found = sorted(p for p in reports_dir.glob(glob) + if p.is_file() and rx.fullmatch(p.relative_to(reports_dir).as_posix())) + if not found: + issues.append(("missing-report", f"no report matching {rel}")) + elif len(found) > 1: + issues.append(("ambiguous-report", f"{len(found)} reports match {rel}: " + + ", ".join(p.relative_to(reports_dir).as_posix() for p in found) + + " (pin one in findings-policy.json report_pins or list it in run-manifest.json)")) + else: + paths.append(found[0]) + return paths, issues, "convention" + paths, issues = [], [] + for rel in rels: + p = reports_dir / rel + if p.is_file(): + paths.append(p) + else: + issues.append(("missing-report", f"{rel} ({src}) does not exist")) + return paths, issues, src + + +# -------------------------------------------------------------------------- +# evaluation +# -------------------------------------------------------------------------- +def _version_tokens(s): + return re.findall(r"\d+(?:\.\d+)+", str(s or "")) + + +def evaluate(reports_dir, inventory, scanners, policy, today, release=False, reports_key=None): + reports_dir = Path(reports_dir) + today = parse_date(today, "today") + reports_key = reports_key or reports_dir.as_posix() + failures, info, accepted, prov_changes = [], [], [], [] + + def fail(kind, detail, scanner=None, fingerprint=None): + failures.append({"kind": kind, "class": KIND_CLASS.get(kind, "config"), "scanner": scanner, + "fingerprint": fingerprint, "detail": detail}) + + dispositions = policy.get("dispositions") or {} + if not dispositions: + fail("policy-error", "policy has no dispositions table") + warn_days = int(policy.get("expiry_warning_days", 30)) + + # ---- policy: accepted gaps ---- + gaps = [] + for i, g in enumerate(policy.get("accepted_gaps") or []): + missing = [k for k in ("scanner", "condition", "owner", "expires", "reason") if not g.get(k)] + if missing: + fail("policy-error", f"accepted_gaps[{i}] missing {', '.join(missing)}", g.get("scanner")) + continue + try: + g = dict(g, _expires=parse_date(g["expires"], f"accepted_gaps[{i}].expires")) + except ValueError as e: + fail("policy-error", str(e), g.get("scanner")) + continue + g["_used"] = False + gaps.append(g) + + # ---- inventory validation and exception expiry ---- + inv_items, inv_buckets = {}, {} + expected_ids = {s["id"] for s in scanners.get("scanners") or []} + for coll, store in (("findings", inv_items), ("buckets", inv_buckets)): + for idx, r in enumerate(inventory.get(coll) or []): + f = r.get("fingerprint") + where = f"{coll}[{idx}] {r.get('id', '')}".strip() + if not f: + fail("inventory-error", f"{where}: no fingerprint") + continue + if f in inv_items or f in inv_buckets: + fail("inventory-error", f"{where}: duplicate fingerprint", r.get("scanner_id"), f) + continue + store[f] = r + if r.get("scanner_id") not in expected_ids: + fail("inventory-error", f"{where}: scanner_id {r.get('scanner_id')!r} not in scanners.json", r.get("scanner_id"), f) + d = r.get("disposition") + if d not in dispositions: + fail("inventory-error", f"{where}: unknown disposition {d!r}", r.get("scanner_id"), f) + continue + exp = r.get("exception_expiry") + if dispositions[d].get("exception") and not exp: + fail("inventory-error", f"{where}: disposition {d!r} is an exception but has no exception_expiry " + "(unbounded exceptions are not allowed)", r.get("scanner_id"), f) + if exp: + try: + e = parse_date(exp, f"{where}.exception_expiry") + except ValueError as err: + fail("inventory-error", str(err), r.get("scanner_id"), f) + continue + if today > e: + fail("expired-exception", f"{where}: {d} exception expired {exp} (owner {r.get('owner', '?')}); " + "re-review and edit the inventory explicitly", r.get("scanner_id"), f) + elif (e - today).days <= warn_days: + info.append({"kind": "expiring-soon", "scanner": r.get("scanner_id"), "fingerprint": f, + "detail": f"exception expires {exp}"}) + if coll == "buckets" and (not isinstance(r.get("count"), int) or r["count"] < 0): + fail("inventory-error", f"{where}: bucket count must be a non-negative integer", r.get("scanner_id"), f) + + # ---- run manifest ---- + manifest, manifest_path = None, reports_dir / "run-manifest.json" + if manifest_path.is_file(): + try: + manifest = json.loads(manifest_path.read_text(encoding="utf-8")) + if not isinstance(manifest.get("scanners"), dict): + raise ValueError("'scanners' must be an object") + except (ValueError, OSError) as e: + fail("invalid-run-manifest", f"run-manifest.json unreadable: {e}") + manifest = None + accepted_exit = policy.get("accepted_exit_codes") or {} + scope_min = policy.get("scope_minimums") or {} + pins_all = [p for p in policy.get("report_pins") or [] if p.get("reports_dir") == reports_key] + + ctx = Ctx(policy) + scanner_results, observed = {}, {} + for sc in scanners.get("scanners") or []: + sid = sc["id"] + obs = Obs(sc, ctx) + mentry = (manifest or {}).get("scanners", {}).get(sid) if manifest else None + if policy.get("require_run_manifest") and mentry is None: + obs.issue("missing-run-manifest", "no run-manifest.json entry (exit code/status not recorded)") + pins = next((p["paths"] for p in pins_all if p.get("scanner") == sid), None) + paths, d_issues, source = discover(reports_dir, sc, pins, mentry) + not_configured = str(sc.get("access_status", "")).split(" ")[0] in ("not-configured", "disabled") + for kind, detail in d_issues: + if kind == "missing-report" and not_configured and not paths: + kind = "not-scanned" + detail = f"{detail}; scanners.json access_status={sc.get('access_status')}: {sc.get('reason', '')}".strip() + obs.issue(kind, detail) + if mentry: + st = mentry.get("status") + if st is not None and str(st).lower() not in SUCCESS_STATUSES: + obs.issue("scanner-error", f"run-manifest status={st!r}", f"status-{st}") + ok_codes = accepted_exit.get(sid, accepted_exit.get("default", [0])) + if "exit_code" in mentry and mentry["exit_code"] not in ok_codes: + obs.issue("scanner-error", f"run-manifest exit_code={mentry['exit_code']} not in accepted {ok_codes}", + f"exit-code-{mentry['exit_code']}") + for k in ("tool_version", "db_version", "revision"): + if mentry.get(k) is not None: + obs.provenance[{"tool_version": "version"}.get(k, k)] = mentry[k] + if manifest.get("revision") and "revision" not in obs.provenance: + obs.provenance["revision"] = manifest["revision"] + if mentry.get("files_scanned") is not None: + obs.provenance["files_scanned"] = mentry["files_scanned"] + if mentry["files_scanned"] == 0: + obs.issue("empty-scope", "run-manifest files_scanned=0") + else: + obs.scope_evidence = obs.scope_evidence or f"{mentry['files_scanned']} files (run-manifest)" + normalizer = choose_normalizer(sc) + if paths and not any(i["fatal"] for i in obs.issues): + if normalizer is None: + obs.issue("invalid-report", f"no normalizer for report_format {sc.get('report_format')!r}") + else: + try: + normalizer(paths, sc, obs) + except ReportIssue as e: + obs.issue(e.kind, e.detail, e.marker) + except (KeyError, IndexError, TypeError, ValueError, AttributeError) as e: + obs.issue("invalid-report", f"report structure not as expected for {sc.get('report_format')!r}: " + f"{e.__class__.__name__}: {e}") + # zero results need scope evidence + if paths and not any(i["fatal"] for i in obs.issues) and not obs.items and not obs.buckets \ + and not obs.zero_ok and not obs.scope_evidence: + obs.issue("empty-scope", "zero results and no evidence of a non-empty scan scope " + "(record files_scanned in run-manifest.json)") + mins = (scope_min.get(sid) or {}).get("files") + fs = obs.provenance.get("files_scanned") + if mins and isinstance(fs, int) and 0 < fs < mins: + obs.issue("scope-mismatch", f"scanned {fs} files < policy scope_minimums {mins}") + + # provenance comparison + exp_ver = sc.get("tool_version") + got_ver = obs.provenance.get("version") + if exp_ver and got_ver and str(got_ver) not in _version_tokens(exp_ver) and str(got_ver) != str(exp_ver): + toks = _version_tokens(exp_ver) + prov_changes.append({"scanner": sid, "field": "tool_version", + "expected": toks[0] if toks else exp_ver, "observed": str(got_ver)}) + if sc.get("db_version") and obs.provenance.get("db_version") and sc["db_version"] != obs.provenance["db_version"]: + prov_changes.append({"scanner": sid, "field": "db_version", "expected": sc["db_version"], + "observed": obs.provenance["db_version"]}) + + # issues -> failures or accepted gaps + status = "ok" + for iss in obs.issues: + gap = None + for g in gaps: + if g["scanner"] == sid and g["condition"] == iss["kind"] \ + and (not g.get("marker") or g["marker"] == iss.get("marker")) \ + and (not g.get("reports_dirs") or reports_key in g["reports_dirs"]): + gap = g + break + if gap: + gap["_used"] = True + if gap and not release and today <= gap["_expires"]: + accepted.append({"scanner": sid, "kind": iss["kind"], "label": GAP_LABEL.get(iss["kind"], iss["kind"]), + "detail": iss["detail"], "owner": gap["owner"], "expires": gap["expires"], + "reason": gap["reason"], "coverage_gap_ref": gap.get("coverage_gap_ref"), + "status": gap.get("status")}) + if status == "ok": + status = "accepted-gap" + continue + detail = iss["detail"] + if gap and release: + detail += f" [accepted gap ignored in --release mode; owner {gap['owner']}]" + elif gap: + detail += f" [accepted gap expired {gap['expires']}; owner {gap['owner']}]" + fail(iss["kind"], detail, sid) + status = "fail" + + fatal = any(i["fatal"] for i in obs.issues) + partial = bool(obs.issues) + compared = bool(paths) and not fatal + scanner_results[sid] = { + "status": status, "report_source": source, + "reports": [p.relative_to(reports_dir).as_posix() if p.is_relative_to(reports_dir) else str(p) for p in paths], + "issues": obs.issues, "provenance": obs.provenance, "scope_evidence": obs.scope_evidence, + "compared": compared, + "observed": {"itemized": len(obs.items), "buckets": len(obs.buckets), + "bucket_total": sum(obs.buckets.values())}, + "valid_empty": compared and not obs.items and not obs.buckets and not obs.issues, + "fingerprints": sorted(obs.items) + sorted(obs.buckets), + "notes": obs.notes[:50], + } + if not compared: + continue + observed[sid] = obs + + # ---- comparison (identity, never net counts) ---- + for f, rec in sorted(obs.items.items()): + inv = inv_items.get(f) + if inv is None: + loc = rec["location"] + fail("new-finding", f"{rec['rule_id']} at {loc.get('path')}" + + (f":{loc['line']}" if loc.get("line") else "") + " not in inventory", sid, f) + continue + if release and (dispositions.get(inv.get("disposition")) or {}).get("release_blocking"): + fail("release-blocker", f"present with disposition {inv.get('disposition')!r}", sid, f) + if "prod" in obs.variants.get(f, ()) and inv.get("category") == "build-only": + fail("exposure-escalation", "inventoried as build-only but reported by the production (--omit=dev) audit", sid, f) + for f, n in sorted(obs.buckets.items()): + inv = inv_buckets.get(f) + if inv is None: + fail("bucket-new", f"new bucket with {n} occurrence(s) not in inventory", sid, f) + continue + base = inv.get("count", 0) + if n > base: + fail("bucket-increase", f"count {base} -> {n} (+{n - base})", sid, f) + elif n < base: + info.append({"kind": "bucket-decrease", "scanner": sid, "fingerprint": f, + "detail": f"count {base} -> {n} (baseline edit needed to lock in progress)"}) + if release and (dispositions.get(inv.get("disposition")) or {}).get("release_blocking"): + fail("release-blocker", f"bucket present with disposition {inv.get('disposition')!r}", sid, f) + label = "unobserved-partial-scan" if partial else "resolved" + for f, r in inv_items.items(): + if r.get("scanner_id") == sid and f not in obs.items: + # T1 'codeql-alert:' identities have no instance in the analysed scope (e.g. ENABLE_GO2RTC=OFF); + # a report can never contain them, so absence is not evidence of a fix. + kind = "unobservable-identity" if f.startswith("codeql-alert:") else label + info.append({"kind": kind, "scanner": sid, "fingerprint": f, + "detail": f"{r.get('disposition')} record not reported by this scan"}) + for f, r in inv_buckets.items(): + if r.get("scanner_id") == sid and f not in obs.buckets: + info.append({"kind": label, "scanner": sid, "fingerprint": f, + "detail": f"bucket (count {r.get('count')}) not reported by this scan"}) + + for old_new in sorted(ctx.renamed.items()): + info.append({"kind": "renamed", "scanner": None, "fingerprint": None, + "detail": f"path {old_new[0]} identified as {old_new[1]} via policy path_renames"}) + for g in gaps: + if not g["_used"] and (not g.get("reports_dirs") or reports_key in g["reports_dirs"]): + info.append({"kind": "unused-gap", "scanner": g["scanner"], "fingerprint": None, + "detail": f"accepted gap for condition {g['condition']!r} did not apply; remove it from policy"}) + + by_class = collections.Counter(f["class"] for f in failures) + return { + "schema_version": 1, + "status": "fail" if failures else "pass", + "mode": "release" if release else "check", + "today": today.isoformat(), + "reports_dir": reports_key, + "run_manifest": manifest_path.name if manifest else None, + "failures": failures, + "failure_counts": dict(by_class), + "accepted_gaps": accepted, + "provenance_changes": prov_changes, + "info": info, + "scanners": scanner_results, + "_observed": observed, + } + + +# -------------------------------------------------------------------------- +# rendering +# -------------------------------------------------------------------------- +def _prov_str(p): + s = " ".join(str(x) for x in (p.get("tool"), p.get("version")) if x) + if p.get("extensions"): + s += " (+" + ", ".join(p["extensions"][:2]) + ")" + if p.get("db_version"): + s += f" db {p['db_version']}" + if p.get("revision"): + s += f" @{str(p['revision'])[:8]}" + return s or "version not recorded in report" + + +def render(result, out): + w = out.write + w(f"findings policy check mode={result['mode']} reports={result['reports_dir']} today={result['today']}" + f" run-manifest={'yes' if result['run_manifest'] else 'no'}\n\nSCANNERS\n") + tag = {"ok": "OK ", "accepted-gap": "GAP ", "fail": "FAIL"} + for sid, s in result["scanners"].items(): + o = s["observed"] + w(f" [{tag[s['status']]}] {sid:<28} items={o['itemized']:<4} buckets={o['buckets']}/{o['bucket_total']:<5} " + f"{_prov_str(s['provenance'])}\n") + for r in s["reports"]: + w(f" report: {r} ({s['report_source']})\n") + if s["valid_empty"]: + w(f" valid empty result (scope: {s['scope_evidence']})\n") + for i in s["issues"]: + w(f" {i['kind']}: {i['detail']}\n") + if result["provenance_changes"]: + w("\nPROVENANCE CHANGED (tool/database version differs from scanners.json; review result drift)\n") + for c in result["provenance_changes"]: + w(f" PROVENANCE CHANGED {c['scanner']}: {c['field']} {c['expected']} -> {c['observed']}\n") + if result["accepted_gaps"]: + w(f"\nACCEPTED GAPS ({len(result['accepted_gaps'])}) - known coverage gaps, NOT clean results\n") + for g in result["accepted_gaps"]: + w(f" ACCEPTED GAP {g['scanner']}: {g['label']} - {g['detail']}\n" + f" owner {g['owner']}, expires {g['expires']}" + + (f", ref {g['coverage_gap_ref']}" if g.get("coverage_gap_ref") else "") + + (f", {g['status']}" if g.get("status") else "") + f"; reason: {g['reason']}\n") + if result["failures"]: + w(f"\nFAILURES ({len(result['failures'])})\n") + for cls in ("coverage", "finding", "exception", "config"): + fs = [f for f in result["failures"] if f["class"] == cls] + if not fs: + continue + w(f" [{cls}] {len(fs)}\n") + for f in fs[:200]: + w(f" {f['kind']}: {f['scanner'] or '-'} {f['fingerprint'] or ''} {f['detail']}\n") + if len(fs) > 200: + w(f" ... {len(fs) - 200} more (see --json-out)\n") + cnt = collections.Counter(i["kind"] for i in result["info"]) + if cnt: + w("\nINFO (non-failing)\n") + for k, n in sorted(cnt.items()): + w(f" {k}: {n}\n") + for i in [i for i in result["info"] if i["kind"] in ("renamed", "unused-gap", "bucket-decrease", "resolved")][:40]: + w(f" {i['kind']}: {i['scanner'] or '-'} {i['fingerprint'] or ''} {i['detail']}\n") + fc = result["failure_counts"] + if result["status"] == "pass": + w(f"\nRESULT: PASS (0 policy failures; {len(result['accepted_gaps'])} accepted coverage gap(s) listed above are not clean results)\n") + else: + only_gaps = set(fc) == {"coverage"} + w(f"\nRESULT: FAIL - {len(result['failures'])} policy failure(s) " + f"(coverage {fc.get('coverage', 0)}, findings {fc.get('finding', 0)}, " + f"expired exceptions {fc.get('exception', 0)}, inventory/policy {fc.get('config', 0)})" + + ("; all failures are report-coverage gaps, not new findings" if only_gaps else "") + "\n") + + +# -------------------------------------------------------------------------- +# explicit baseline edit +# -------------------------------------------------------------------------- +def dump_compact(obj, path): + """Same layout as the T1 generator: one record per line for list-of-record keys.""" + parts = [] + for k, v in obj.items(): + if isinstance(v, list) and v and isinstance(v[0], dict): + body = ",\n".join(" " + json.dumps(x, separators=(",", ":")) for x in v) + parts.append(f" {json.dumps(k)}: [\n{body}\n ]") + else: + parts.append(f" {json.dumps(k)}: " + json.dumps(v, indent=2).replace("\n", "\n ")) + tmp = Path(str(path) + ".tmp") + tmp.write_text("{\n" + ",\n".join(parts) + "\n}\n", encoding="utf-8") + os.replace(tmp, path) + + +def update_baseline(inventory, result, reason, today): + blocking = [f for f in result["failures"] if f["class"] in ("coverage", "config")] + if blocking: + raise UsageError(f"refusing --update-baseline: {len(blocking)} coverage/config failure(s) must be fixed first " + "(a missing or crashed report cannot be baselined)") + findings = inventory.setdefault("findings", []) + buckets = inventory.setdefault("buckets", []) + edit = {"date": today, "reason": reason, "reports_dir": result["reports_dir"], + "added": [], "removed": [], "bucket_changes": []} + inv_f = {r["fingerprint"]: r for r in findings} + inv_b = {r["fingerprint"]: r for r in buckets} + remove = set() + for sid, obs in result["_observed"].items(): + full = not obs.issues + for f, rec in sorted(obs.items.items()): + if f not in inv_f: + findings.append({"id": f"{sid.upper()}-{fp(f)}", "fingerprint": f, "scanner_id": sid, + "rule_id": rec["rule_id"], "location": rec["location"], + "disposition": "needs-triage", "exception_expiry": None, "first_seen": today, + "evidence": f"added by explicit --update-baseline on {today}: {reason}"}) + edit["added"].append(f) + for f, n in sorted(obs.buckets.items()): + meta = obs.bucket_meta[f] + if f not in inv_b: + buckets.append({"id": f"{sid.upper()}-BUCKET-{fp(f)}", "fingerprint": f, "scanner_id": sid, + "rule_id": meta["rule_id"], "path": meta["path"], "count": n, + "disposition": "needs-triage", "exception_expiry": None}) + edit["bucket_changes"].append({"fingerprint": f, "from": 0, "to": n}) + elif inv_b[f].get("count") != n: + edit["bucket_changes"].append({"fingerprint": f, "from": inv_b[f].get("count"), "to": n}) + inv_b[f]["count"] = n + if full: + for f, r in inv_f.items(): + if r.get("scanner_id") == sid and f not in obs.items: + remove.add(f) + edit["removed"].append(f) + for f, r in inv_b.items(): + if r.get("scanner_id") == sid and f not in obs.buckets: + remove.add(f) + edit["bucket_changes"].append({"fingerprint": f, "from": r.get("count"), "to": 0}) + inventory["findings"] = [r for r in findings if r["fingerprint"] not in remove] + inventory["buckets"] = [r for r in buckets if r["fingerprint"] not in remove] + edit["summary"] = {"added": len(edit["added"]), "removed": len(edit["removed"]), + "bucket_changes": len(edit["bucket_changes"])} + inventory.setdefault("baseline_edits", []).append(edit) + return edit + + +# -------------------------------------------------------------------------- +# CLI +# -------------------------------------------------------------------------- +def _load(path, what): + try: + with open(path, encoding="utf-8") as fh: + return json.load(fh) + except (OSError, json.JSONDecodeError) as e: + raise UsageError(f"cannot read {what} {path}: {e}") + + +def build_parser(): + ap = argparse.ArgumentParser(description=__doc__.split("\n\n")[0]) + mode = ap.add_mutually_exclusive_group(required=True) + mode.add_argument("--check", action="store_true", help="compare reports with the inventory (never writes)") + mode.add_argument("--update-baseline", action="store_true", + help="explicitly rewrite the inventory from the reports (requires --reason)") + ap.add_argument("--reports", required=True, help="report directory, e.g. build/eng-artifacts/T33") + ap.add_argument("--inventory", default="quality/findings.json") + ap.add_argument("--scanners", default="quality/scanners.json") + ap.add_argument("--policy", default="quality/findings-policy.json") + ap.add_argument("--today", help="override today's date (YYYY-MM-DD) for expiry checks") + ap.add_argument("--release", action="store_true", + help="release policy: accepted gaps do not apply; release-blocking dispositions fail") + ap.add_argument("--json-out", help="write the machine-readable result here") + ap.add_argument("--reason", help="justification recorded with --update-baseline") + return ap + + +def main(argv=None): + ap = build_parser() + args = ap.parse_args(argv) # argparse exits 2 on usage errors + if args.update_baseline and not (args.reason or "").strip(): + ap.error("--update-baseline requires a non-empty --reason") + try: + reports = Path(args.reports) + if not reports.is_dir(): + raise UsageError(f"reports directory {reports} does not exist (no scan results at all)") + try: + today = parse_date(args.today, "--today") if args.today else dt.date.today() + except ValueError as e: + raise UsageError(str(e)) + inventory = _load(args.inventory, "inventory") + scanners = _load(args.scanners, "scanners manifest") + policy = _load(args.policy, "policy") + try: + key = Path(os.path.relpath(reports.resolve(), Path.cwd().resolve())).as_posix() + except ValueError: + key = reports.resolve().as_posix() + result = evaluate(reports_dir=reports, inventory=inventory, scanners=scanners, policy=policy, + today=today, release=args.release, reports_key=key) + render(result, sys.stdout) + if args.json_out: + Path(args.json_out).parent.mkdir(parents=True, exist_ok=True) + Path(args.json_out).write_text(json.dumps({k: v for k, v in result.items() if not k.startswith("_")}, + indent=1) + "\n", encoding="utf-8") + if args.update_baseline: + edit = update_baseline(inventory, result, args.reason.strip(), today.isoformat()) + dump_compact(inventory, args.inventory) + print(f"\nBASELINE UPDATED explicitly: +{edit['summary']['added']} findings, " + f"-{edit['summary']['removed']} findings, {edit['summary']['bucket_changes']} bucket changes " + f"written to {args.inventory}; review the diff (expired exceptions are not touched).") + return EXIT_PASS + return EXIT_PASS if result["status"] == "pass" else EXIT_FAIL + except UsageError as e: + print(f"findings.py: error: {e}", file=sys.stderr) + print("RESULT: ERROR - invalid input; no policy verdict was produced", file=sys.stdout) + return EXIT_USAGE + except Exception: # never let a checker bug become exit 0 + traceback.print_exc() + print("RESULT: ERROR - internal checker failure (exit 3); this is not a policy verdict", file=sys.stdout) + return EXIT_INTERNAL + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tests/quality/fixtures/findings/base/inventory.json b/tests/quality/fixtures/findings/base/inventory.json new file mode 100644 index 000000000..3d58a5971 --- /dev/null +++ b/tests/quality/fixtures/findings/base/inventory.json @@ -0,0 +1,153 @@ +{ + "schema_version": 1, + "producer": "fixture", + "findings": [ + { + "id": "CODEQL-1", + "fingerprint": "codeql:cpp/sql-injection:src/database/a.c:aaaa1111bbbb2222:1", + "scanner_id": "codeql-cpp", + "rule_id": "cpp/sql-injection", + "category": "application", + "location": { + "path": "src/database/a.c", + "line": 10 + }, + "disposition": "needs-triage", + "exception_expiry": null + }, + { + "id": "CODEQL-2", + "fingerprint": "codeql:cpp/path-injection:src/core/b.c:cccc3333dddd4444:1", + "scanner_id": "codeql-cpp", + "rule_id": "cpp/path-injection", + "category": "application", + "location": { + "path": "src/core/b.c", + "line": 20 + }, + "disposition": "exception-dismissed-false-positive", + "exception_expiry": "2027-01-31" + }, + { + "id": "CLANGTIDY-3971853557f6166d", + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/core/b.c:3971853557f6166d", + "scanner_id": "clang-tidy", + "rule_id": "bugprone-narrowing-conversions", + "category": "application", + "location": { + "path": "src/core/b.c", + "line": 5 + }, + "disposition": "baseline-debt", + "exception_expiry": "2027-04-30" + }, + { + "id": "CLANGTIDY-23b6d28e219f20e2", + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/core/b.c:23b6d28e219f20e2", + "scanner_id": "clang-tidy", + "rule_id": "bugprone-narrowing-conversions", + "category": "application", + "location": { + "path": "src/core/b.c", + "line": 9 + }, + "disposition": "baseline-debt", + "exception_expiry": "2027-04-30" + }, + { + "id": "CLANGTIDY-6097ffe41888cb7e", + "fingerprint": "clang-tidy:readability-function-cognitive-complexity:src/core/c.c:6097ffe41888cb7e", + "scanner_id": "clang-tidy", + "rule_id": "readability-function-cognitive-complexity", + "category": "application", + "location": { + "path": "src/core/c.c", + "line": 7 + }, + "disposition": "baseline-debt", + "exception_expiry": "2027-04-30" + }, + { + "id": "CPPCHECK-032b81a083372145", + "fingerprint": "cppcheck:arrayIndexOutOfBounds:src/core/c.c:032b81a083372145", + "scanner_id": "cppcheck", + "rule_id": "arrayIndexOutOfBounds", + "category": "application", + "location": { + "path": "src/core/c.c", + "line": 12 + }, + "disposition": "needs-triage", + "exception_expiry": null + }, + { + "id": "NPM-WEB-GHSA-aaaa-bbbb-cccc-minimatch", + "fingerprint": "npm-audit:web/package-lock.json:minimatch:GHSA-aaaa-bbbb-cccc", + "scanner_id": "npm-audit-web", + "rule_id": "GHSA-aaaa-bbbb-cccc", + "category": "build-only", + "location": { + "path": "web/package-lock.json", + "package": "minimatch" + }, + "disposition": "needs-triage", + "exception_expiry": null + }, + { + "id": "DEPENDABOT-7", + "fingerprint": "dependabot:web/package-lock.json:deepmerge:GHSA-dddd-eeee-ffff", + "scanner_id": "dependabot", + "rule_id": "GHSA-dddd-eeee-ffff", + "category": "build-only", + "location": { + "path": "web/package-lock.json", + "package": "deepmerge" + }, + "disposition": "needs-triage", + "exception_expiry": null + } + ], + "buckets": [ + { + "id": "CPPCHECK-BUCKET-1", + "fingerprint": "cppcheck-bucket:constParameterPointer:src/core/b.c", + "scanner_id": "cppcheck", + "rule_id": "constParameterPointer", + "path": "src/core/b.c", + "count": 2, + "disposition": "baseline-debt", + "exception_expiry": "2027-04-30" + }, + { + "id": "CPPCHECK-BUCKET-2", + "fingerprint": "cppcheck-bucket:checkersReport:", + "scanner_id": "cppcheck", + "rule_id": "checkersReport", + "path": "", + "count": 1, + "disposition": "informational", + "exception_expiry": null + }, + { + "id": "ESLINT-BUCKET-1", + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/x.jsx", + "scanner_id": "eslint-web", + "rule_id": "jsx-a11y/click-events-have-key-events", + "path": "web/js/x.jsx", + "count": 2, + "disposition": "baseline-debt", + "exception_expiry": "2027-04-30" + }, + { + "id": "ESLINT-BUCKET-2", + "fingerprint": "eslint-bucket:jsx-a11y/no-autofocus:web/js/x.jsx", + "scanner_id": "eslint-web", + "rule_id": "jsx-a11y/no-autofocus", + "path": "web/js/x.jsx", + "count": 1, + "disposition": "baseline-debt", + "exception_expiry": "2027-04-30" + } + ], + "coverage_gaps": [] +} diff --git a/tests/quality/fixtures/findings/base/policy.json b/tests/quality/fixtures/findings/base/policy.json new file mode 100644 index 000000000..fd8b73afe --- /dev/null +++ b/tests/quality/fixtures/findings/base/policy.json @@ -0,0 +1,35 @@ +{ + "schema_version": 1, + "dispositions": { + "needs-triage": { + "exception": false, + "release_blocking": true + }, + "baseline-debt": { + "exception": true, + "release_blocking": false + }, + "exception-dismissed-false-positive": { + "exception": true, + "release_blocking": false + }, + "informational": { + "exception": false, + "release_blocking": false + } + }, + "accepted_exit_codes": { + "default": [ + 0 + ], + "npm-audit-web": [ + 0, + 1 + ] + }, + "require_run_manifest": false, + "scope_minimums": {}, + "path_renames": [], + "report_pins": [], + "accepted_gaps": [] +} diff --git a/tests/quality/fixtures/findings/base/reports/actions/container-scan-200/trivy-results.sarif b/tests/quality/fixtures/findings/base/reports/actions/container-scan-200/trivy-results.sarif new file mode 100644 index 000000000..a3c831608 --- /dev/null +++ b/tests/quality/fixtures/findings/base/reports/actions/container-scan-200/trivy-results.sarif @@ -0,0 +1,22 @@ +{ + "version": "2.1.0", + "runs": [ + { + "tool": { + "driver": { + "name": "Trivy", + "version": "0.76.1", + "rules": [] + } + }, + "results": [], + "properties": { + "imageID": "sha256:feedface", + "imageName": "lightnvr:scan", + "repoTags": [ + "lightnvr:scan" + ] + } + } + ] +} diff --git a/tests/quality/fixtures/findings/base/reports/actions/static-analysis-100/clang-tidy-report/clang-tidy-report.txt b/tests/quality/fixtures/findings/base/reports/actions/static-analysis-100/clang-tidy-report/clang-tidy-report.txt new file mode 100644 index 000000000..5d4836fab --- /dev/null +++ b/tests/quality/fixtures/findings/base/reports/actions/static-analysis-100/clang-tidy-report/clang-tidy-report.txt @@ -0,0 +1,8 @@ +[1/2] Processing file /__w/lightNVR/lightNVR/src/core/b.c. +2 warnings generated. +/__w/lightNVR/lightNVR/src/core/b.c:5:3: warning: narrowing conversion from 'long' to 'int' [bugprone-narrowing-conversions] + 5 | int x = l; +/__w/lightNVR/lightNVR/src/core/b.c:9:3: warning: narrowing conversion from 'long' to 'int' [bugprone-narrowing-conversions] +[2/2] Processing file /__w/lightNVR/lightNVR/src/core/c.c. +1 warning generated. +/__w/lightNVR/lightNVR/src/core/c.c:7:1: warning: function 'x' has cognitive complexity of 30 (threshold 25) [readability-function-cognitive-complexity] diff --git a/tests/quality/fixtures/findings/base/reports/actions/static-analysis-100/cppcheck-reports/cppcheck-report.xml b/tests/quality/fixtures/findings/base/reports/actions/static-analysis-100/cppcheck-reports/cppcheck-report.xml new file mode 100644 index 000000000..e040d3846 --- /dev/null +++ b/tests/quality/fixtures/findings/base/reports/actions/static-analysis-100/cppcheck-reports/cppcheck-report.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/tests/quality/fixtures/findings/base/reports/actions/static-analysis-100/eslint-web.json b/tests/quality/fixtures/findings/base/reports/actions/static-analysis-100/eslint-web.json new file mode 100644 index 000000000..49bb5241d --- /dev/null +++ b/tests/quality/fixtures/findings/base/reports/actions/static-analysis-100/eslint-web.json @@ -0,0 +1,36 @@ +[ + { + "filePath": "/home/runner/work/lightNVR/lightNVR/web/js/x.jsx", + "messages": [ + { + "ruleId": "jsx-a11y/click-events-have-key-events", + "severity": 1, + "message": "m", + "line": 3, + "column": 1 + }, + { + "ruleId": "jsx-a11y/click-events-have-key-events", + "severity": 1, + "message": "m", + "line": 9, + "column": 1 + }, + { + "ruleId": "jsx-a11y/no-autofocus", + "severity": 1, + "message": "m", + "line": 12, + "column": 1 + } + ], + "errorCount": 0, + "warningCount": 3 + }, + { + "filePath": "/home/runner/work/lightNVR/lightNVR/web/js/y.js", + "messages": [], + "errorCount": 0, + "warningCount": 0 + } +] diff --git a/tests/quality/fixtures/findings/base/reports/github/codeql-abcdef12.sarif b/tests/quality/fixtures/findings/base/reports/github/codeql-abcdef12.sarif new file mode 100644 index 000000000..74194dc02 --- /dev/null +++ b/tests/quality/fixtures/findings/base/reports/github/codeql-abcdef12.sarif @@ -0,0 +1,83 @@ +{ + "version": "2.1.0", + "runs": [ + { + "tool": { + "driver": { + "name": "CodeQL", + "semanticVersion": "2.27.3" + }, + "extensions": [ + { + "name": "codeql/cpp-queries", + "semanticVersion": "1.9.2" + } + ] + }, + "automationDetails": { + "id": "/language:c-cpp/" + }, + "versionControlProvenance": [ + { + "revisionId": "abcdef1234567890" + } + ], + "artifacts": [ + { + "location": { + "uri": "src/database/a.c" + } + }, + { + "location": { + "uri": "src/core/b.c" + } + } + ], + "results": [ + { + "ruleId": "cpp/sql-injection", + "message": { + "text": "query built from user input" + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "src/database/a.c" + }, + "region": { + "startLine": 10 + } + } + } + ], + "partialFingerprints": { + "primaryLocationLineHash": "aaaa1111bbbb2222:1" + } + }, + { + "ruleId": "cpp/path-injection", + "message": { + "text": "path from user input" + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "src/core/b.c" + }, + "region": { + "startLine": 20 + } + } + } + ], + "partialFingerprints": { + "primaryLocationLineHash": "cccc3333dddd4444:1" + } + } + ] + } + ] +} diff --git a/tests/quality/fixtures/findings/base/reports/github/dependabot-open.json b/tests/quality/fixtures/findings/base/reports/github/dependabot-open.json new file mode 100644 index 000000000..4161af604 --- /dev/null +++ b/tests/quality/fixtures/findings/base/reports/github/dependabot-open.json @@ -0,0 +1,24 @@ +[ + { + "number": 7, + "state": "open", + "created_at": "2026-10-29T00:00:00Z", + "dependency": { + "manifest_path": "web/package-lock.json", + "package": { + "ecosystem": "npm", + "name": "deepmerge" + }, + "scope": "development", + "relationship": "transitive" + }, + "security_advisory": { + "ghsa_id": "GHSA-dddd-eeee-ffff", + "severity": "medium" + }, + "security_vulnerability": { + "vulnerable_version_range": "<= 4.3.1", + "first_patched_version": null + } + } +] diff --git a/tests/quality/fixtures/findings/base/reports/npm/web-audit-all.json b/tests/quality/fixtures/findings/base/reports/npm/web-audit-all.json new file mode 100644 index 000000000..a09484187 --- /dev/null +++ b/tests/quality/fixtures/findings/base/reports/npm/web-audit-all.json @@ -0,0 +1,61 @@ +{ + "auditReportVersion": 2, + "vulnerabilities": { + "minimatch": { + "name": "minimatch", + "severity": "moderate", + "isDirect": false, + "via": [ + { + "source": 1, + "name": "minimatch", + "dependency": "minimatch", + "title": "ReDoS", + "url": "https://github.com/advisories/GHSA-aaaa-bbbb-cccc", + "severity": "moderate", + "range": "<3.1.3" + } + ], + "effects": [ + "glob" + ], + "range": "<3.1.3", + "nodes": [ + "node_modules/minimatch" + ], + "fixAvailable": true + }, + "glob": { + "name": "glob", + "severity": "moderate", + "isDirect": false, + "via": [ + "minimatch" + ], + "effects": [], + "range": "*", + "nodes": [ + "node_modules/glob" + ], + "fixAvailable": true + } + }, + "metadata": { + "vulnerabilities": { + "info": 0, + "low": 0, + "moderate": 2, + "high": 0, + "critical": 0, + "total": 2 + }, + "dependencies": { + "prod": 10, + "dev": 90, + "optional": 0, + "peer": 0, + "peerOptional": 0, + "total": 100 + } + } +} diff --git a/tests/quality/fixtures/findings/base/reports/npm/web-audit-prod.json b/tests/quality/fixtures/findings/base/reports/npm/web-audit-prod.json new file mode 100644 index 000000000..52350c73c --- /dev/null +++ b/tests/quality/fixtures/findings/base/reports/npm/web-audit-prod.json @@ -0,0 +1,22 @@ +{ + "auditReportVersion": 2, + "vulnerabilities": {}, + "metadata": { + "vulnerabilities": { + "info": 0, + "low": 0, + "moderate": 0, + "high": 0, + "critical": 0, + "total": 0 + }, + "dependencies": { + "prod": 10, + "dev": 90, + "optional": 0, + "peer": 0, + "peerOptional": 0, + "total": 100 + } + } +} diff --git a/tests/quality/fixtures/findings/base/scanners.json b/tests/quality/fixtures/findings/base/scanners.json new file mode 100644 index 000000000..e900da256 --- /dev/null +++ b/tests/quality/fixtures/findings/base/scanners.json @@ -0,0 +1,71 @@ +{ + "schema_version": 1, + "scanners": [ + { + "id": "codeql-cpp", + "report_format": "sarif-2.1.0", + "access_status": "accessible", + "report_path_convention": "build/eng-artifacts//github/codeql-.sarif", + "fingerprint_scheme": "codeql", + "tool": "CodeQL", + "tool_version": "2.27.3", + "scope": { + "category": "/language:c-cpp" + } + }, + { + "id": "clang-tidy", + "report_format": "clang-diagnostic-text (path:line:col: severity: message [check])", + "access_status": "accessible", + "report_path_convention": "build/eng-artifacts//actions/static-analysis-/clang-tidy-report/clang-tidy-report.txt", + "fingerprint_scheme": "line-tool", + "tool": "clang-tidy", + "tool_version": "Debian LLVM 21.1.8" + }, + { + "id": "cppcheck", + "report_format": "cppcheck-xml-v2 (+ text template)", + "access_status": "accessible", + "report_path_convention": "build/eng-artifacts//actions/static-analysis-/cppcheck-reports/cppcheck-report.xml", + "fingerprint_scheme": "line-tool / bucket", + "tool": "cppcheck", + "tool_version": "2.13.0" + }, + { + "id": "eslint-web", + "report_format": "eslint-json", + "access_status": "accessible", + "report_path_convention": "build/eng-artifacts//actions/static-analysis-/eslint-web.json", + "fingerprint_scheme": "bucket", + "tool": "eslint" + }, + { + "id": "trivy-container", + "report_format": "sarif-2.1.0", + "access_status": "accessible", + "report_path_convention": "build/eng-artifacts//actions/container-scan-/trivy-results.sarif", + "fingerprint_scheme": "sca", + "tool": "Trivy", + "tool_version": "0.76.1", + "scope": { + "image": "lightnvr:scan" + } + }, + { + "id": "npm-audit-web", + "report_format": "npm-audit-json (auditReportVersion 2)", + "access_status": "accessible", + "report_path_convention": "build/eng-artifacts//npm/web-audit-{all,prod}.json", + "fingerprint_scheme": "sca", + "tool": "npm audit" + }, + { + "id": "dependabot", + "report_format": "json (REST repos/{repo}/dependabot/alerts)", + "access_status": "accessible", + "report_path_convention": "build/eng-artifacts//github/dependabot-open.json", + "fingerprint_scheme": "sca", + "tool": "GitHub Dependabot alerts" + } + ] +} diff --git a/tests/quality/test_findings.py b/tests/quality/test_findings.py new file mode 100644 index 000000000..ffd1ab21e --- /dev/null +++ b/tests/quality/test_findings.py @@ -0,0 +1,559 @@ +# SPDX-License-Identifier: GPL-3.0-or-later +"""Tests for scripts/quality/findings.py (T6: finding identity and exception policy). + +Run: python3 -m unittest discover -s tests/quality -p test_findings.py +The fixture inventory in fixtures/findings/base was generated with the T1 +generator's fingerprint formulas, independently of findings.py, so a passing +baseline proves the checker reproduces the T1 identity scheme. +""" +import contextlib +import hashlib +import io +import json +import os +import shutil +import subprocess +import sys +import tempfile +import unittest +from pathlib import Path + +HERE = Path(__file__).resolve().parent +REPO = HERE.parent.parent +SCRIPT = REPO / "scripts" / "quality" / "findings.py" +BASE = HERE / "fixtures" / "findings" / "base" +ESLINT_LOG = HERE / "fixtures" / "findings" / "eslint-log" / "web-jsx-a11y.log" + +sys.path.insert(0, str(SCRIPT.parent)) +import findings # noqa: E402 (RED: fails until scripts/quality/findings.py exists) + +TODAY = "2026-11-01" +CT_REL = "actions/static-analysis-100/clang-tidy-report/clang-tidy-report.txt" +CC_REL = "actions/static-analysis-100/cppcheck-reports/cppcheck-report.xml" +ES_REL = "actions/static-analysis-100/eslint-web.json" +TRIVY_REL = "actions/container-scan-200/trivy-results.sarif" +CODEQL_REL = "github/codeql-abcdef12.sarif" + + +def sha(path): + return hashlib.sha256(Path(path).read_bytes()).hexdigest() + + +class Case(unittest.TestCase): + def setUp(self): + self.tmp = Path(tempfile.mkdtemp(prefix="t6-")) + shutil.copytree(BASE, self.tmp / "base") + self.d = self.tmp / "base" + self.reports = self.d / "reports" + + def tearDown(self): + shutil.rmtree(self.tmp, ignore_errors=True) + + # helpers ------------------------------------------------------------- + def load(self, name): + return json.loads((self.d / name).read_text()) + + def save(self, name, obj): + (self.d / name).write_text(json.dumps(obj, indent=2)) + + def rj(self, rel): + return json.loads((self.reports / rel).read_text()) + + def wj(self, rel, obj): + p = self.reports / rel + p.parent.mkdir(parents=True, exist_ok=True) + p.write_text(json.dumps(obj, indent=2)) + + def evaluate(self, today=TODAY, release=False): + return findings.evaluate( + reports_dir=self.reports, + inventory=self.load("inventory.json"), + scanners=self.load("scanners.json"), + policy=self.load("policy.json"), + today=today, + release=release, + reports_key="fixture/reports", + ) + + def kinds(self, result): + return sorted({f["kind"] for f in result["failures"]}) + + def cli(self, *extra, today=TODAY): + cmd = [sys.executable, "-I", str(SCRIPT), "--reports", str(self.reports), + "--inventory", str(self.d / "inventory.json"), + "--scanners", str(self.d / "scanners.json"), + "--policy", str(self.d / "policy.json"), "--today", today, *extra] + return subprocess.run(cmd, capture_output=True, text=True, cwd=str(REPO)) + + +class BaselineTests(Case): + def test_baseline_passes(self): + r = self.evaluate() + self.assertEqual(r["failures"], [], r["failures"]) + self.assertEqual(r["status"], "pass") + for sid, s in r["scanners"].items(): + self.assertEqual(s["status"], "ok", (sid, s)) + + def test_cli_check_exit_zero_on_pass(self): + p = self.cli("--check") + self.assertEqual(p.returncode, 0, p.stdout + p.stderr) + self.assertIn("RESULT: PASS", p.stdout) + + def test_valid_empty_report_passes(self): + r = self.evaluate() + trivy = r["scanners"]["trivy-container"] + self.assertEqual(trivy["status"], "ok") + self.assertEqual(trivy["observed"]["itemized"], 0) + self.assertTrue(trivy["valid_empty"]) + + +class NewFindingTests(Case): + def test_new_finding_fails_even_when_another_disappears(self): + s = self.rj(CODEQL_REL) + s["runs"][0]["results"][0]["ruleId"] = "cpp/uncontrolled-allocation-size" + s["runs"][0]["results"][0]["partialFingerprints"]["primaryLocationLineHash"] = "9999888877776666:1" + self.wj(CODEQL_REL, s) + r = self.evaluate() + self.assertEqual(r["status"], "fail") + new = [f for f in r["failures"] if f["kind"] == "new-finding"] + self.assertEqual(len(new), 1) + self.assertIn("cpp/uncontrolled-allocation-size", new[0]["fingerprint"]) + resolved = [i for i in r["info"] if i["kind"] == "resolved"] + self.assertTrue(any("cpp/sql-injection" in i["fingerprint"] for i in resolved)) + # result counts are equal; the checker must not net them out + self.assertEqual(r["scanners"]["codeql-cpp"]["observed"]["itemized"], 2) + + def test_new_clang_tidy_message_fails(self): + p = self.reports / CT_REL + p.write_text(p.read_text() + "/__w/lightNVR/lightNVR/src/core/c.c:44:1: warning: " + "Call to function 'strcpy' is insecure [clang-analyzer-security.insecureAPI.strcpy]\n") + r = self.evaluate() + self.assertIn("new-finding", self.kinds(r)) + + def test_bucket_increase_fails_even_if_other_bucket_decreases(self): + es = self.rj(ES_REL) + msgs = es[0]["messages"] + msgs.append(dict(msgs[0], line=20)) # click-events +1 + es[0]["messages"] = [m for m in msgs if m["ruleId"] != "jsx-a11y/no-autofocus"] # autofocus -1 + self.wj(ES_REL, es) + r = self.evaluate() + self.assertEqual(r["status"], "fail") + inc = [f for f in r["failures"] if f["kind"] == "bucket-increase"] + self.assertEqual(len(inc), 1) + self.assertIn("click-events-have-key-events", inc[0]["fingerprint"]) + self.assertIn("2 -> 3", inc[0]["detail"]) + self.assertTrue(any(i["kind"] in ("bucket-decrease", "resolved") for i in r["info"])) + + def test_new_bucket_fails(self): + es = self.rj(ES_REL) + es[1]["messages"].append({"ruleId": "jsx-a11y/alt-text", "severity": 1, "message": "m", "line": 1, "column": 1}) + self.wj(ES_REL, es) + r = self.evaluate() + self.assertIn("bucket-new", self.kinds(r)) + + +class IdentityTests(Case): + def test_line_shift_keeps_fingerprints(self): + before = self.evaluate() + import re + ct = self.reports / CT_REL + ct.write_text(re.sub(r"(\.c):(\d+):", lambda m: f"{m[1]}:{int(m[2]) + 7}:", ct.read_text())) + cc = self.reports / CC_REL + cc.write_text(re.sub(r'line="(\d+)"', lambda m: f'line="{int(m[1]) + 7}"', cc.read_text())) + s = self.rj(CODEQL_REL) + for res in s["runs"][0]["results"]: + res["locations"][0]["physicalLocation"]["region"]["startLine"] += 7 + self.wj(CODEQL_REL, s) + after = self.evaluate() + self.assertEqual(after["failures"], []) + for sid in ("clang-tidy", "cppcheck", "codeql-cpp"): + self.assertEqual(before["scanners"][sid]["fingerprints"], after["scanners"][sid]["fingerprints"], sid) + + def test_line_tool_fingerprint_matches_t1_scheme(self): + got = findings.line_tool_fingerprint("clang-tidy", "bugprone-x", "src/a.c", "value 42 is 7", 1) + h = hashlib.sha256("bugprone-x|src/a.c|value N is N|1".encode()).hexdigest()[:16] + self.assertEqual(got, f"clang-tidy:bugprone-x:src/a.c:{h}") + + def test_rename_requires_explicit_policy_map(self): + ct = self.reports / CT_REL + ct.write_text(ct.read_text().replace("src/core/b.c", "src/core/b_renamed.c")) + r = self.evaluate() + self.assertIn("new-finding", self.kinds(r)) + pol = self.load("policy.json") + pol["path_renames"] = [{"from": "src/core/b.c", "to": "src/core/b_renamed.c", + "reason": "test rename", "approved_by": "test"}] + self.save("policy.json", pol) + r = self.evaluate() + self.assertEqual(r["failures"], [], r["failures"]) + self.assertTrue(any(i["kind"] == "renamed" for i in r["info"])) + + def test_directory_rename_prefix(self): + es = self.rj(ES_REL) + es[0]["filePath"] = es[0]["filePath"].replace("web/js/x.jsx", "web/src/x.jsx") + self.wj(ES_REL, es) + pol = self.load("policy.json") + pol["path_renames"] = [{"from": "web/js/", "to": "web/src/", "reason": "dir move", "approved_by": "test"}] + self.save("policy.json", pol) + self.assertEqual(self.evaluate()["failures"], []) + + +class CoverageTests(Case): + def test_missing_report_fails(self): + (self.reports / TRIVY_REL).unlink() + r = self.evaluate() + self.assertEqual(r["status"], "fail") + self.assertIn("missing-report", self.kinds(r)) + self.assertEqual(r["scanners"]["trivy-container"]["status"], "fail") + + def test_missing_one_variant_of_brace_convention_fails(self): + (self.reports / "npm/web-audit-prod.json").unlink() + r = self.evaluate() + self.assertIn("missing-report", self.kinds(r)) + + def test_ambiguous_report_fails_unless_pinned(self): + shutil.copy(self.reports / CODEQL_REL, self.reports / "github/codeql-12345678.sarif") + r = self.evaluate() + self.assertIn("ambiguous-report", self.kinds(r)) + pol = self.load("policy.json") + pol["report_pins"] = [{"reports_dir": "fixture/reports", "scanner": "codeql-cpp", + "paths": [CODEQL_REL], "reason": "test"}] + self.save("policy.json", pol) + self.assertEqual(self.evaluate()["failures"], []) + + def test_crashed_clang_tidy_fails(self): + ct = self.reports / CT_REL + lines = ct.read_text().splitlines() + cut = [l for l in lines if not l.startswith("[2/2]")][:5] + ct.write_text("\n".join(cut + ["Stack dump:", "Segmentation fault (core dumped)"]) + "\n") + r = self.evaluate() + self.assertIn("scanner-error", self.kinds(r)) + + def test_truncated_clang_tidy_fails(self): + ct = self.reports / CT_REL + ct.write_text("".join(l for l in ct.read_text().splitlines(True) if "[2/2]" not in l)) + r = self.evaluate() + self.assertIn("truncated-report", self.kinds(r)) + + def test_clang_diagnostic_error_is_scanner_error(self): + ct = self.reports / CT_REL + ct.write_text(ct.read_text() + "/__w/lightNVR/lightNVR/src/core/c.c:1:10: error: 'foo.h' file not found [clang-diagnostic-error]\n") + self.assertIn("scanner-error", self.kinds(self.evaluate())) + + def test_empty_clang_tidy_report_is_empty_scope(self): + (self.reports / CT_REL).write_text("") + r = self.evaluate() + self.assertIn("empty-scope", self.kinds(r)) + + def test_trivy_without_target_is_empty_scope(self): + t = self.rj(TRIVY_REL) + t["runs"][0]["properties"] = {} + self.wj(TRIVY_REL, t) + self.assertIn("empty-scope", self.kinds(self.evaluate())) + + def test_eslint_json_with_no_files_is_empty_scope(self): + self.wj(ES_REL, []) + self.assertIn("empty-scope", self.kinds(self.evaluate())) + + def test_eslint_fatal_parse_error_is_scanner_error(self): + es = self.rj(ES_REL) + es[1]["messages"].append({"ruleId": None, "fatal": True, "severity": 2, "message": "Parsing error"}) + self.wj(ES_REL, es) + self.assertIn("scanner-error", self.kinds(self.evaluate())) + + def test_npm_zero_dependencies_is_empty_scope(self): + a = self.rj("npm/web-audit-prod.json") + a["metadata"]["dependencies"]["total"] = 0 + self.wj("npm/web-audit-prod.json", a) + self.assertIn("empty-scope", self.kinds(self.evaluate())) + + def test_empty_cppcheck_is_empty_scope(self): + (self.reports / CC_REL).write_text('\n\n') + self.assertIn("empty-scope", self.kinds(self.evaluate())) + + def test_cppcheck_critical_errors_marker_is_scanner_error(self): + cc = self.reports / CC_REL + cc.write_text(cc.read_text().replace("Active checkers: 106/592", "Active checkers: There was critical errors")) + self.assertIn("scanner-error", self.kinds(self.evaluate())) + + def test_unparseable_report_is_invalid_not_crash(self): + (self.reports / CODEQL_REL).write_text("{not json") + r = self.evaluate() + self.assertIn("invalid-report", self.kinds(r)) + + def test_sarif_execution_failure_is_scanner_error(self): + s = self.rj(CODEQL_REL) + s["runs"][0]["invocations"] = [{"executionSuccessful": False, + "toolExecutionNotifications": [{"level": "error", "message": {"text": "extractor crashed"}}]}] + self.wj(CODEQL_REL, s) + self.assertIn("scanner-error", self.kinds(self.evaluate())) + + def test_sarif_wrong_category_is_scope_mismatch(self): + s = self.rj(CODEQL_REL) + s["runs"][0]["automationDetails"]["id"] = "/language:javascript-typescript/" + self.wj(CODEQL_REL, s) + self.assertIn("scope-mismatch", self.kinds(self.evaluate())) + + def test_api_error_body_is_not_an_empty_result(self): + self.wj("github/dependabot-open.json", {"message": "Dependabot alerts are disabled for this repository.", "status": "403"}) + r = self.evaluate() + self.assertIn("scanner-error", self.kinds(r)) + + def test_unconfigured_scanner_is_not_scanned(self): + sc = self.load("scanners.json") + sc["scanners"].append({"id": "secret-scanning", "report_format": "json", "access_status": "disabled", + "report_path_convention": "build/eng-artifacts//github/secret-scanning-alerts.json", + "fingerprint_scheme": "secret"}) + self.save("scanners.json", sc) + r = self.evaluate() + self.assertIn("not-scanned", self.kinds(r)) + self.assertEqual(r["status"], "fail") + + +class ExitStatusTests(Case): + def manifest(self, entries): + self.wj("run-manifest.json", {"schema_version": 1, "revision": "abcdef12", "scanners": entries}) + + def test_npm_error_key_fails_even_if_exit_zero(self): + self.wj("npm/web-audit-all.json", {"error": {"code": "ENOLOCK", "summary": "lockfile missing"}}) + self.manifest({"npm-audit-web": {"exit_code": 0, "status": "success"}}) + r = self.evaluate() + self.assertIn("scanner-error", self.kinds(r)) + p = self.cli("--check") + self.assertEqual(p.returncode, 1, p.stdout) + + def test_npm_exit_one_with_findings_is_not_error(self): + self.manifest({"npm-audit-web": {"exit_code": 1, "status": "success"}}) + self.assertEqual(self.evaluate()["failures"], []) + + def test_recorded_failure_status_fails_despite_valid_report(self): + self.manifest({"trivy-container": {"exit_code": 0, "status": "failure"}}) + r = self.evaluate() + self.assertIn("scanner-error", self.kinds(r)) + + def test_recorded_nonzero_exit_fails(self): + self.manifest({"clang-tidy": {"exit_code": 139, "status": "success"}}) + self.assertIn("scanner-error", self.kinds(self.evaluate())) + + def test_manifest_files_scanned_zero_is_empty_scope(self): + self.manifest({"codeql-cpp": {"exit_code": 0, "status": "success", "files_scanned": 0}}) + self.assertIn("empty-scope", self.kinds(self.evaluate())) + + def test_required_manifest_missing_fails(self): + pol = self.load("policy.json") + pol["require_run_manifest"] = True + self.save("policy.json", pol) + self.assertIn("missing-run-manifest", self.kinds(self.evaluate())) + + def test_internal_error_never_exits_zero(self): + orig = findings.evaluate + try: + def boom(**kw): + raise RuntimeError("synthetic checker bug") + findings.evaluate = boom + err = io.StringIO() + with contextlib.redirect_stderr(err), contextlib.redirect_stdout(io.StringIO()): + rc = findings.main(["--check", "--reports", str(self.reports), + "--inventory", str(self.d / "inventory.json"), + "--scanners", str(self.d / "scanners.json"), + "--policy", str(self.d / "policy.json"), "--today", TODAY]) + finally: + findings.evaluate = orig + self.assertEqual(rc, 3) + self.assertIn("synthetic checker bug", err.getvalue()) + + def test_missing_reports_dir_is_nonzero(self): + p = subprocess.run([sys.executable, "-I", str(SCRIPT), "--check", "--reports", str(self.tmp / "nope"), + "--inventory", str(self.d / "inventory.json"), "--scanners", str(self.d / "scanners.json"), + "--policy", str(self.d / "policy.json"), "--today", TODAY], capture_output=True, text=True) + self.assertNotEqual(p.returncode, 0) + + +class ExceptionTests(Case): + def test_unexpired_exception_passes(self): + self.assertEqual(self.evaluate(today="2027-01-31")["failures"], []) # expiry day is still valid + + def test_expired_exception_fails(self): + r = self.evaluate(today="2027-02-01") + exp = [f for f in r["failures"] if f["kind"] == "expired-exception"] + self.assertEqual(len(exp), 1) + self.assertIn("cpp/path-injection", exp[0]["fingerprint"]) + p = self.cli("--check", today="2027-02-01") + self.assertEqual(p.returncode, 1) + + def test_exception_without_expiry_is_inventory_error(self): + inv = self.load("inventory.json") + inv["buckets"][0]["exception_expiry"] = None + self.save("inventory.json", inv) + self.assertIn("inventory-error", self.kinds(self.evaluate())) + + def test_unknown_disposition_is_inventory_error(self): + inv = self.load("inventory.json") + inv["findings"][0]["disposition"] = "ignore-forever" + self.save("inventory.json", inv) + self.assertIn("inventory-error", self.kinds(self.evaluate())) + + def test_duplicate_fingerprint_is_inventory_error(self): + inv = self.load("inventory.json") + inv["findings"].append(dict(inv["findings"][0], id="DUP")) + self.save("inventory.json", inv) + self.assertIn("inventory-error", self.kinds(self.evaluate())) + + def test_release_mode_blocks_untriaged(self): + r = self.evaluate(release=True) + self.assertIn("release-blocker", self.kinds(r)) + + +class GapPolicyTests(Case): + def add_secret_scanner(self): + sc = self.load("scanners.json") + sc["scanners"].append({"id": "secret-scanning", "report_format": "json", "access_status": "disabled", + "report_path_convention": "build/eng-artifacts//github/secret-scanning-alerts.json", + "fingerprint_scheme": "secret"}) + self.save("scanners.json", sc) + + def gap(self, expires): + pol = self.load("policy.json") + pol["accepted_gaps"] = [{"scanner": "secret-scanning", "condition": "not-scanned", "owner": "maintainers/security", + "expires": expires, "reason": "disabled upstream", "coverage_gap_ref": "GAP-x"}] + self.save("policy.json", pol) + + def test_accepted_gap_is_visible_and_passes(self): + self.add_secret_scanner() + self.gap("2026-12-31") + r = self.evaluate() + self.assertEqual(r["failures"], []) + self.assertEqual(r["scanners"]["secret-scanning"]["status"], "accepted-gap") + self.assertEqual(len(r["accepted_gaps"]), 1) + p = self.cli("--check") + self.assertEqual(p.returncode, 0) + self.assertIn("ACCEPTED GAP", p.stdout) + self.assertIn("NOT SCANNED", p.stdout) + + def test_expired_gap_fails(self): + self.add_secret_scanner() + self.gap("2026-10-01") + r = self.evaluate() + self.assertIn("not-scanned", self.kinds(r)) + self.assertTrue(any("expired" in f["detail"] for f in r["failures"])) + + def test_release_mode_ignores_accepted_gaps(self): + self.add_secret_scanner() + self.gap("2026-12-31") + self.assertIn("not-scanned", self.kinds(self.evaluate(release=True))) + + def test_gap_without_owner_is_policy_error(self): + self.add_secret_scanner() + self.gap("2026-12-31") + pol = self.load("policy.json") + del pol["accepted_gaps"][0]["owner"] + self.save("policy.json", pol) + self.assertIn("policy-error", self.kinds(self.evaluate())) + + def test_gap_scoped_to_other_reports_dir_does_not_apply(self): + self.add_secret_scanner() + self.gap("2026-12-31") + pol = self.load("policy.json") + pol["accepted_gaps"][0]["reports_dirs"] = ["build/eng-artifacts/T1"] + self.save("policy.json", pol) + self.assertIn("not-scanned", self.kinds(self.evaluate())) + + +class ProvenanceTests(Case): + def test_tool_version_change_is_surfaced(self): + s = self.rj(CODEQL_REL) + s["runs"][0]["tool"]["driver"]["semanticVersion"] = "2.28.0" + self.wj(CODEQL_REL, s) + r = self.evaluate() + self.assertEqual(r["failures"], []) + ch = [c for c in r["provenance_changes"] if c["scanner"] == "codeql-cpp"] + self.assertEqual(len(ch), 1) + self.assertEqual((ch[0]["expected"], ch[0]["observed"]), ("2.27.3", "2.28.0")) + p = self.cli("--check") + self.assertIn("PROVENANCE CHANGED", p.stdout) + self.assertIn("2.27.3 -> 2.28.0", p.stdout) + + def test_db_version_from_manifest_is_reported(self): + self.wj("run-manifest.json", {"schema_version": 1, "scanners": { + "trivy-container": {"exit_code": 0, "status": "success", "db_version": "2026-10-31T00:00:00Z"}}}) + r = self.evaluate() + self.assertEqual(r["scanners"]["trivy-container"]["provenance"]["db_version"], "2026-10-31T00:00:00Z") + + +class FormatTests(Case): + def test_eslint_stylish_log_matches_json_buckets(self): + (self.reports / ES_REL).unlink() + shutil.copy(ESLINT_LOG, self.reports / "actions/static-analysis-100/eslint-web.json.log") + sc = self.load("scanners.json") + for s in sc["scanners"]: + if s["id"] == "eslint-web": + s["report_path_convention"] = "build/eng-artifacts//actions/static-analysis-/eslint-web.json.log" + s["report_format"] = "eslint stylish text in job log only (no artifact)" + self.save("scanners.json", sc) + self.assertEqual(self.evaluate()["failures"], []) + + def test_eslint_log_summary_mismatch_is_invalid(self): + text = ESLINT_LOG.read_text().replace("3 problems (0 errors, 3 warnings)", "4 problems (0 errors, 4 warnings)") + (self.reports / ES_REL).unlink() + (self.reports / "actions/static-analysis-100/eslint-web.json.log").write_text(text) + sc = self.load("scanners.json") + for s in sc["scanners"]: + if s["id"] == "eslint-web": + s["report_path_convention"] = "build/eng-artifacts//actions/static-analysis-/eslint-web.json.log" + s["report_format"] = "eslint stylish text in job log only (no artifact)" + self.save("scanners.json", sc) + self.assertIn("invalid-report", self.kinds(self.evaluate())) + + def test_npm_prod_exposure_escalation_fails(self): + self.wj("npm/web-audit-prod.json", self.rj("npm/web-audit-all.json")) + self.assertIn("exposure-escalation", self.kinds(self.evaluate())) + + +class BaselineEditTests(Case): + def add_new_codeql(self): + s = self.rj(CODEQL_REL) + new = json.loads(json.dumps(s["runs"][0]["results"][0])) + new["ruleId"] = "cpp/toctou-race-condition" + new["partialFingerprints"]["primaryLocationLineHash"] = "1234123412341234:1" + s["runs"][0]["results"].append(new) + self.wj(CODEQL_REL, s) + + def test_check_never_modifies_inventory(self): + self.add_new_codeql() + inv = self.d / "inventory.json" + before = sha(inv) + p = self.cli("--check") + self.assertEqual(p.returncode, 1, p.stdout) + self.assertEqual(sha(inv), before) + self.assertEqual(self.cli("--check").returncode, 1) # still failing: nothing auto-baselined + + def test_update_baseline_requires_reason(self): + self.add_new_codeql() + p = self.cli("--update-baseline") + self.assertNotEqual(p.returncode, 0) + + def test_update_baseline_is_explicit_and_recorded(self): + self.add_new_codeql() + p = self.cli("--update-baseline", "--reason", "accept new toctou for triage (test)") + self.assertEqual(p.returncode, 0, p.stdout + p.stderr) + inv = self.load("inventory.json") + rec = [f for f in inv["findings"] if "toctou" in f["fingerprint"]] + self.assertEqual(len(rec), 1) + self.assertEqual(rec[0]["disposition"], "needs-triage") + self.assertEqual(inv["baseline_edits"][-1]["reason"], "accept new toctou for triage (test)") + self.assertEqual(self.cli("--check").returncode, 0) + + def test_update_baseline_refuses_on_coverage_failure(self): + (self.reports / TRIVY_REL).unlink() + inv = self.d / "inventory.json" + before = sha(inv) + p = self.cli("--update-baseline", "--reason", "x") + self.assertNotEqual(p.returncode, 0) + self.assertEqual(sha(inv), before) + + def test_check_and_update_are_mutually_exclusive(self): + p = self.cli("--check", "--update-baseline", "--reason", "x") + self.assertEqual(p.returncode, 2) + + +if __name__ == "__main__": + unittest.main() From 27e4d57e37487d35bb459ee908a06e9bdf4ee75b Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Sat, 31 Oct 2026 03:14:36 -0400 Subject: [PATCH 007/230] T6: Track eslint job-log fixture (ignored by *.log rule) Co-Authored-By: Claude Opus 5.5 --- .../fixtures/findings/eslint-log/web-jsx-a11y.log | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 tests/quality/fixtures/findings/eslint-log/web-jsx-a11y.log diff --git a/tests/quality/fixtures/findings/eslint-log/web-jsx-a11y.log b/tests/quality/fixtures/findings/eslint-log/web-jsx-a11y.log new file mode 100644 index 000000000..299c5aa2e --- /dev/null +++ b/tests/quality/fixtures/findings/eslint-log/web-jsx-a11y.log @@ -0,0 +1,11 @@ +Web JSX accessibility lint Report JSX accessibility findings 2026-10-31T06:25:45.0425138Z ##[group]Run npm run lint --prefix web +Web JSX accessibility lint Report JSX accessibility findings 2026-10-31T06:25:45.1155371Z > lightnvr-web@1.0.0 lint +Web JSX accessibility lint Report JSX accessibility findings 2026-10-31T06:25:45.1155683Z > eslint js +Web JSX accessibility lint Report JSX accessibility findings 2026-10-31T06:25:46.1000000Z +Web JSX accessibility lint Report JSX accessibility findings 2026-10-31T06:25:46.1000001Z /home/runner/work/lightNVR/lightNVR/web/js/x.jsx +Web JSX accessibility lint Report JSX accessibility findings 2026-10-31T06:25:46.1000002Z 3:1 warning Visible, non-interactive elements with click handlers must have at least one keyboard listener jsx-a11y/click-events-have-key-events +Web JSX accessibility lint Report JSX accessibility findings 2026-10-31T06:25:46.1000003Z 9:1 warning Visible, non-interactive elements with click handlers must have at least one keyboard listener jsx-a11y/click-events-have-key-events +Web JSX accessibility lint Report JSX accessibility findings 2026-10-31T06:25:46.1000004Z 12:1 warning The autoFocus prop should not be used, as it can reduce usability and accessibility for users jsx-a11y/no-autofocus +Web JSX accessibility lint Report JSX accessibility findings 2026-10-31T06:25:46.1000005Z +Web JSX accessibility lint Report JSX accessibility findings 2026-10-31T06:25:46.8727233Z ✖ 3 problems (0 errors, 3 warnings) +Web JSX accessibility lint Report JSX accessibility findings 2026-10-31T06:25:46.8727234Z From a764b6cad444cb336389e4a181ba4b1da87335b3 Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Sat, 31 Oct 2026 03:30:48 -0400 Subject: [PATCH 008/230] T11: Specify Streams pilot contracts and reviewed fixtures --- docs/api/contracts/common.yaml | 272 ++++ docs/api/contracts/streams.yaml | 1209 +++++++++++++++++ docs/api/openapi.yaml | 114 ++ quality/evidence/T11.md | 364 +++++ .../auth-verify.auth-disabled.valid.json | 20 + .../auth-verify.demo-as-admin.invalid.json | 18 + .../streams/auth-verify.demo.valid.json | 17 + .../streams/auth-verify.user.valid.json | 25 + .../client-config.camelcase-only.invalid.json | 30 + .../fixtures/streams/client-config.valid.json | 29 + .../detection-models.403-viewer.valid.json | 14 + .../detection-models.no-directory.valid.json | 42 + ...ls.unsupported-without-reason.invalid.json | 49 + .../streams/detection-models.valid.json | 51 + .../streams/error.400-retention.valid.json | 12 + .../streams/error.400-surface.valid.json | 12 + .../fixtures/streams/error.401.valid.json | 12 + .../streams/error.403-put-viewer.valid.json | 12 + .../streams/error.404-camera.valid.json | 12 + .../streams/error.404-stream.valid.json | 12 + .../streams/error.413-publish-url.valid.json | 12 + .../streams/error.empty-message.invalid.json | 13 + .../streams/error.message-key.invalid.json | 13 + .../full.any.generic-schema.valid.json | 413 ++++++ ...r.legacy-name-plain-credentials.valid.json | 417 ++++++ ...igurer.missing-onvif-password.invalid.json | 412 ++++++ ...configurer.onvif-url-userinfo.invalid.json | 413 ++++++ .../streams/full.configurer.onvif.valid.json | 417 ++++++ ...l.error-message-without-error.invalid.json | 414 ++++++ ...ll.live-only.claims-configure.invalid.json | 413 ++++++ .../full.live-only.error-status.valid.json | 414 ++++++ ...ll.live-only.leaked-admin-url.invalid.json | 413 ++++++ ...ive-only.leaked-detection-url.invalid.json | 413 ++++++ ...e-only.leaked-go2rtc-override.invalid.json | 413 ++++++ ...ve-only.leaked-onvif-password.invalid.json | 413 ++++++ ...ve-only.leaked-onvif-username.invalid.json | 413 ++++++ ....live-only.leaked-publish-url.invalid.json | 413 ++++++ ...ve-only.leaked-sub-stream-url.invalid.json | 413 ++++++ .../full.live-only.redacted.valid.json | 417 ++++++ ...live-only.sensitive-keys-absent.valid.json | 405 ++++++ ...ll.live-only.url-query-secret.invalid.json | 413 ++++++ .../full.live-only.url-userinfo.invalid.json | 413 ++++++ ...l.live-only.url-username-only.invalid.json | 413 ++++++ .../streams/full.null-tags.invalid.json | 413 ++++++ .../full.protocol-out-of-enum.invalid.json | 413 ++++++ .../full.retention-below-inherit.invalid.json | 413 ++++++ .../full.retention-over-max.invalid.json | 413 ++++++ .../full.schedule-167-entries.invalid.json | 412 ++++++ .../full.status-docs-value.invalid.json | 413 ++++++ .../full.threshold-as-fraction.invalid.json | 413 ++++++ .../full.unwrapped-object.invalid.json | 411 ++++++ tests/contracts/fixtures/streams/index.json | 726 ++++++++++ .../fixtures/streams/path-encoding.cases.json | 84 ++ .../put-response.200-privacy.valid.json | 14 + .../put-response.202-onvif-failed.valid.json | 17 + ...-onvif-status-without-message.invalid.json | 16 + .../streams/put-response.202.valid.json | 15 + .../streams/put.clear-with-null.valid.json | 22 + ...t.detection-retention-minus-2.invalid.json | 19 + ...put.detection-url-file-scheme.invalid.json | 19 + .../put.detection-url-too-long.invalid.json | 19 + .../fixtures/streams/put.edit-form.valid.json | 407 ++++++ .../streams/put.empty-object.valid.json | 14 + .../streams/put.eptz-not-string.invalid.json | 21 + .../put.eptz-wrong-projection.invalid.json | 19 + .../streams/put.is-deleted.invalid.json | 404 ++++++ .../streams/put.name-in-body.invalid.json | 18 + .../put.playback-transport-bogus.invalid.json | 19 + .../put.privacy-mixed-with-edit.invalid.json | 18 + .../put.protocol-out-of-enum.invalid.json | 17 + .../put.publish-and-detection-url.valid.json | 17 + .../streams/put.publish-url-http.invalid.json | 19 + .../put.publish-url-quote.invalid.json | 19 + .../streams/put.record-as-string.invalid.json | 17 + .../streams/put.retention-366.invalid.json | 19 + .../put.retention-finite-boundary.valid.json | 17 + .../streams/put.retention-tristate.valid.json | 22 + .../streams/put.schedule-weekday.valid.json | 186 +++ .../put.schedule-wrong-length.invalid.json | 42 + .../streams/put.set-privacy-mode.valid.json | 21 + .../streams/put.tags-too-long.invalid.json | 17 + ...n.admin-url-without-configure.invalid.json | 46 + ...admin.configurer-with-admin-url.valid.json | 84 ++ .../summary.admin.contains-url.invalid.json | 46 + .../streams/summary.admin.empty.valid.json | 25 + ...y.admin.missing-can-configure.invalid.json | 44 + .../summary.admin.page-beyond-end.valid.json | 26 + ...mary.admin.page-size-over-max.invalid.json | 18 + ...admin.status-from-detail-enum.invalid.json | 45 + .../streams/summary.admin.viewer.valid.json | 52 + ...mmary.live.contains-admin-url.invalid.json | 56 + ....live.contains-onvif-password.invalid.json | 56 + .../streams/summary.live.viewer.valid.json | 64 + .../summary.lpr.leaks-location.invalid.json | 24 + .../fixtures/streams/summary.lpr.valid.json | 33 + .../fixtures/streams/zones.empty.valid.json | 13 + .../fixtures/streams/zones.valid.json | 37 + 97 files changed, 16883 insertions(+) create mode 100644 docs/api/contracts/common.yaml create mode 100644 docs/api/contracts/streams.yaml create mode 100644 docs/api/openapi.yaml create mode 100644 quality/evidence/T11.md create mode 100644 tests/contracts/fixtures/streams/auth-verify.auth-disabled.valid.json create mode 100644 tests/contracts/fixtures/streams/auth-verify.demo-as-admin.invalid.json create mode 100644 tests/contracts/fixtures/streams/auth-verify.demo.valid.json create mode 100644 tests/contracts/fixtures/streams/auth-verify.user.valid.json create mode 100644 tests/contracts/fixtures/streams/client-config.camelcase-only.invalid.json create mode 100644 tests/contracts/fixtures/streams/client-config.valid.json create mode 100644 tests/contracts/fixtures/streams/detection-models.403-viewer.valid.json create mode 100644 tests/contracts/fixtures/streams/detection-models.no-directory.valid.json create mode 100644 tests/contracts/fixtures/streams/detection-models.unsupported-without-reason.invalid.json create mode 100644 tests/contracts/fixtures/streams/detection-models.valid.json create mode 100644 tests/contracts/fixtures/streams/error.400-retention.valid.json create mode 100644 tests/contracts/fixtures/streams/error.400-surface.valid.json create mode 100644 tests/contracts/fixtures/streams/error.401.valid.json create mode 100644 tests/contracts/fixtures/streams/error.403-put-viewer.valid.json create mode 100644 tests/contracts/fixtures/streams/error.404-camera.valid.json create mode 100644 tests/contracts/fixtures/streams/error.404-stream.valid.json create mode 100644 tests/contracts/fixtures/streams/error.413-publish-url.valid.json create mode 100644 tests/contracts/fixtures/streams/error.empty-message.invalid.json create mode 100644 tests/contracts/fixtures/streams/error.message-key.invalid.json create mode 100644 tests/contracts/fixtures/streams/full.any.generic-schema.valid.json create mode 100644 tests/contracts/fixtures/streams/full.configurer.legacy-name-plain-credentials.valid.json create mode 100644 tests/contracts/fixtures/streams/full.configurer.missing-onvif-password.invalid.json create mode 100644 tests/contracts/fixtures/streams/full.configurer.onvif-url-userinfo.invalid.json create mode 100644 tests/contracts/fixtures/streams/full.configurer.onvif.valid.json create mode 100644 tests/contracts/fixtures/streams/full.error-message-without-error.invalid.json create mode 100644 tests/contracts/fixtures/streams/full.live-only.claims-configure.invalid.json create mode 100644 tests/contracts/fixtures/streams/full.live-only.error-status.valid.json create mode 100644 tests/contracts/fixtures/streams/full.live-only.leaked-admin-url.invalid.json create mode 100644 tests/contracts/fixtures/streams/full.live-only.leaked-detection-url.invalid.json create mode 100644 tests/contracts/fixtures/streams/full.live-only.leaked-go2rtc-override.invalid.json create mode 100644 tests/contracts/fixtures/streams/full.live-only.leaked-onvif-password.invalid.json create mode 100644 tests/contracts/fixtures/streams/full.live-only.leaked-onvif-username.invalid.json create mode 100644 tests/contracts/fixtures/streams/full.live-only.leaked-publish-url.invalid.json create mode 100644 tests/contracts/fixtures/streams/full.live-only.leaked-sub-stream-url.invalid.json create mode 100644 tests/contracts/fixtures/streams/full.live-only.redacted.valid.json create mode 100644 tests/contracts/fixtures/streams/full.live-only.sensitive-keys-absent.valid.json create mode 100644 tests/contracts/fixtures/streams/full.live-only.url-query-secret.invalid.json create mode 100644 tests/contracts/fixtures/streams/full.live-only.url-userinfo.invalid.json create mode 100644 tests/contracts/fixtures/streams/full.live-only.url-username-only.invalid.json create mode 100644 tests/contracts/fixtures/streams/full.null-tags.invalid.json create mode 100644 tests/contracts/fixtures/streams/full.protocol-out-of-enum.invalid.json create mode 100644 tests/contracts/fixtures/streams/full.retention-below-inherit.invalid.json create mode 100644 tests/contracts/fixtures/streams/full.retention-over-max.invalid.json create mode 100644 tests/contracts/fixtures/streams/full.schedule-167-entries.invalid.json create mode 100644 tests/contracts/fixtures/streams/full.status-docs-value.invalid.json create mode 100644 tests/contracts/fixtures/streams/full.threshold-as-fraction.invalid.json create mode 100644 tests/contracts/fixtures/streams/full.unwrapped-object.invalid.json create mode 100644 tests/contracts/fixtures/streams/index.json create mode 100644 tests/contracts/fixtures/streams/path-encoding.cases.json create mode 100644 tests/contracts/fixtures/streams/put-response.200-privacy.valid.json create mode 100644 tests/contracts/fixtures/streams/put-response.202-onvif-failed.valid.json create mode 100644 tests/contracts/fixtures/streams/put-response.202-onvif-status-without-message.invalid.json create mode 100644 tests/contracts/fixtures/streams/put-response.202.valid.json create mode 100644 tests/contracts/fixtures/streams/put.clear-with-null.valid.json create mode 100644 tests/contracts/fixtures/streams/put.detection-retention-minus-2.invalid.json create mode 100644 tests/contracts/fixtures/streams/put.detection-url-file-scheme.invalid.json create mode 100644 tests/contracts/fixtures/streams/put.detection-url-too-long.invalid.json create mode 100644 tests/contracts/fixtures/streams/put.edit-form.valid.json create mode 100644 tests/contracts/fixtures/streams/put.empty-object.valid.json create mode 100644 tests/contracts/fixtures/streams/put.eptz-not-string.invalid.json create mode 100644 tests/contracts/fixtures/streams/put.eptz-wrong-projection.invalid.json create mode 100644 tests/contracts/fixtures/streams/put.is-deleted.invalid.json create mode 100644 tests/contracts/fixtures/streams/put.name-in-body.invalid.json create mode 100644 tests/contracts/fixtures/streams/put.playback-transport-bogus.invalid.json create mode 100644 tests/contracts/fixtures/streams/put.privacy-mixed-with-edit.invalid.json create mode 100644 tests/contracts/fixtures/streams/put.protocol-out-of-enum.invalid.json create mode 100644 tests/contracts/fixtures/streams/put.publish-and-detection-url.valid.json create mode 100644 tests/contracts/fixtures/streams/put.publish-url-http.invalid.json create mode 100644 tests/contracts/fixtures/streams/put.publish-url-quote.invalid.json create mode 100644 tests/contracts/fixtures/streams/put.record-as-string.invalid.json create mode 100644 tests/contracts/fixtures/streams/put.retention-366.invalid.json create mode 100644 tests/contracts/fixtures/streams/put.retention-finite-boundary.valid.json create mode 100644 tests/contracts/fixtures/streams/put.retention-tristate.valid.json create mode 100644 tests/contracts/fixtures/streams/put.schedule-weekday.valid.json create mode 100644 tests/contracts/fixtures/streams/put.schedule-wrong-length.invalid.json create mode 100644 tests/contracts/fixtures/streams/put.set-privacy-mode.valid.json create mode 100644 tests/contracts/fixtures/streams/put.tags-too-long.invalid.json create mode 100644 tests/contracts/fixtures/streams/summary.admin.admin-url-without-configure.invalid.json create mode 100644 tests/contracts/fixtures/streams/summary.admin.configurer-with-admin-url.valid.json create mode 100644 tests/contracts/fixtures/streams/summary.admin.contains-url.invalid.json create mode 100644 tests/contracts/fixtures/streams/summary.admin.empty.valid.json create mode 100644 tests/contracts/fixtures/streams/summary.admin.missing-can-configure.invalid.json create mode 100644 tests/contracts/fixtures/streams/summary.admin.page-beyond-end.valid.json create mode 100644 tests/contracts/fixtures/streams/summary.admin.page-size-over-max.invalid.json create mode 100644 tests/contracts/fixtures/streams/summary.admin.status-from-detail-enum.invalid.json create mode 100644 tests/contracts/fixtures/streams/summary.admin.viewer.valid.json create mode 100644 tests/contracts/fixtures/streams/summary.live.contains-admin-url.invalid.json create mode 100644 tests/contracts/fixtures/streams/summary.live.contains-onvif-password.invalid.json create mode 100644 tests/contracts/fixtures/streams/summary.live.viewer.valid.json create mode 100644 tests/contracts/fixtures/streams/summary.lpr.leaks-location.invalid.json create mode 100644 tests/contracts/fixtures/streams/summary.lpr.valid.json create mode 100644 tests/contracts/fixtures/streams/zones.empty.valid.json create mode 100644 tests/contracts/fixtures/streams/zones.valid.json diff --git a/docs/api/contracts/common.yaml b/docs/api/contracts/common.yaml new file mode 100644 index 000000000..95c42368b --- /dev/null +++ b/docs/api/contracts/common.yaml @@ -0,0 +1,272 @@ +# SPDX-License-Identifier: GPL-3.0-or-later +# Copyright (C) 2025-2026 OpenSensor Engineering and LightNVR contributors +# +# Shared contract fragment for the LightNVR OpenAPI 3.1 definition. +# Root document: docs/api/openapi.yaml. Owner of this fragment: T11 (pilot); +# later schema workers edit their assigned fragments only (see plan T12/T25). +# +# This is NOT a standalone OpenAPI document. It is a $ref target: every +# reusable object lives under `components` so JSON pointers look like +# `./common.yaml#/components/schemas/ErrorResponse`. +# +# Every schema below was checked against the C sources named in its +# `x-lightnvr-source` annotation. Byte limits come from the C buffer sizes; +# JSON Schema `maxLength` counts code points, so `maxLength` equals the byte +# limit and is exact only for ASCII (see `x-lightnvr-max-bytes`). +components: + schemas: + ErrorResponse: + description: >- + Error envelope used for every non-2xx JSON response in the pilot. + Produced only by http_response_set_json_error(), which emits exactly one + key. Clients must not depend on the message text for control flow except + where an operation documents a specific message. + type: object + required: [error] + properties: + error: + type: string + minLength: 1 + x-lightnvr-source: src/web/request_response.c:http_response_set_json_error + + Int32: + description: >- + C `int` read through cJSON `valueint` (fractional values are truncated, + out-of-range values saturate). Used where the server performs no range + validation of its own. + type: integer + minimum: -2147483648 + maximum: 2147483647 + + EpochSecondsOrZero: + description: Unix epoch seconds (int64). `0` means "never observed". + type: integer + minimum: 0 + x-lightnvr-source: include/core/camera_selector.h:fleet_camera_t (int64_t); include/telemetry/stream_metrics.h last_frame_ts + + CameraUuid: + description: >- + Immutable fleet identity (36-char UUID). Legacy rows created before + camera UUIDs existed may carry an empty string. + type: string + maxLength: 36 + pattern: '^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$' + x-lightnvr-source: include/core/config.h:CAMERA_UUID_STRING_SIZE (37 incl. NUL) + + StreamName: + description: >- + Stream (camera) name as stored. This is the primary key used in paths. + Names created through POST /api/streams must match + `^[A-Za-z0-9_-][A-Za-z0-9._-]*$` (is_valid_stream_name), but names that + predate that rule or arrive through configuration import can contain + other characters, so the read-side schema only bounds the length. + type: string + minLength: 1 + maxLength: 255 + x-lightnvr-max-bytes: 255 + x-lightnvr-create-pattern: '^[A-Za-z0-9_-][A-Za-z0-9._-]*$' + x-lightnvr-source: include/core/config.h:MAX_STREAM_NAME; src/core/path_utils.c:is_valid_stream_name + + PlaybackTransport: + type: string + enum: [auto, webrtc_only, mse_only, hls_only, webrtc_then_mse, mse_then_hls] + description: >- + Responses substitute `auto` when the stored value is invalid, so a + response never carries a value outside this enum. + x-lightnvr-source: src/core/config.c:playback_transport_is_valid + + StreamProtocol: + description: >- + Transport protocol: 0 = TCP, 1 = UDP (stream_protocol_t). PUT does not + range-check this value (see finding candidate F-T11-06); the contract + only permits the two defined values. + type: integer + enum: [0, 1] + x-lightnvr-source: include/core/config.h:stream_protocol_t + + RetentionDays: + description: >- + Tri-state per-stream retention override in days. + `-1` inherits the live global retention value at evaluation time, + `0` is explicitly unlimited (also disables tier expiry), and `1..365` + is a day override. Writes outside -1..365 are rejected with 400. + For `detection_retention_days`, `-1` inherits the *global* retention + value, not this stream's `retention_days`. + type: integer + minimum: -1 + maximum: 365 + x-lightnvr-retention-states: + inherit: -1 + unlimited: 0 + finite: '1..365' + x-lightnvr-source: >- + include/core/config.h:stream_config_t.retention_days; + src/web/api_handlers_streams_modify.c:handle_put_stream (range check); + src/storage/storage_manager.c (tri-state evaluation, tier expiry skip on 0) + + HourOfWeekSchedule: + description: >- + 168 booleans indexed `day * 24 + hour` in server local time, where day + 0 = Sunday ... 6 = Saturday (struct tm tm_wday). Responses always carry + exactly 168 entries. On PUT, an array whose length is not 168 is + silently ignored (no error) and any entry other than JSON `true` is + stored as false (finding candidate F-T11-07). + type: array + minItems: 168 + maxItems: 168 + items: + type: boolean + x-lightnvr-source: >- + src/web/api_handlers_streams_get.c (serialization loop j<168); + src/web/api_handlers_streams_modify.c:handle_put_stream (arr_size == 168); + src/video/stream_manager.c:is_recording_scheduled (tm_wday*24+tm_hour) + + EmptyString: + description: Redacted value. The server emits an empty string in place of a sensitive value. + type: string + const: '' + + UrlWithoutUserinfo: + description: >- + A URL-like string that carries no userinfo (`user:pass@`) in its + authority. Empty string is permitted (viewer redaction falls back to "" + when credential stripping fails). A response that contains userinfo here + is a credential leak and must fail validation. + type: string + maxLength: 511 + pattern: '^(?![A-Za-z][A-Za-z0-9+.-]*://[^/?#]*@)' + x-lightnvr-source: src/web/api_handlers_streams_get.c:get_stream_api_credentials; src/core/url_utils.c:url_strip_credentials + + UrlWithoutQuerySecrets: + description: >- + Rejects a URL whose query string carries a non-empty parameter whose key + contains pass, pwd, token, secret or apikey (case-insensitive). The C + redaction only strips userinfo, so a camera URL like + `rtsp://host/live?user=admin&password=x` currently reaches viewers + unchanged. This rule is the redaction policy the contract enforces; a + server response that violates it is a finding (F-T11-03), not a schema + bug. + type: string + not: + pattern: '[?&;][^=&#]*([Pp][Aa][Ss][Ss]|[Pp][Ww][Dd]|[Tt][Oo][Kk][Ee][Nn]|[Ss][Ee][Cc][Rr][Ee][Tt]|[Aa][Pp][Ii]_?[Kk][Ee][Yy])[^=&#]*=[^&#]' + + ViewerSafeUrl: + description: Credential-free URL as delivered to principals without camera.configure. + allOf: + - $ref: '#/components/schemas/UrlWithoutUserinfo' + - $ref: '#/components/schemas/UrlWithoutQuerySecrets' + + parameters: + StreamNamePath: + name: name + in: path + required: true + description: >- + Stream name, percent-encoded as one path segment (the UI uses + encodeURIComponent). Routing matches the *encoded* segment against + `#` (a run of non-'/' characters), then http_request_extract_path_param + decodes it with form semantics: `%XX` is decoded and a literal `+` + becomes a space, so a name containing '+' must be sent as `%2B`. + The entire encoded suffix after `/api/streams/` must be shorter than + 256 bytes, including `/full` or `/zones`. Thus the encoded name limit + is 255 bytes for PUT, 250 for `/full`, and 249 for `/zones`. Overflow + answers 400 "Invalid request path" ("Invalid stream name" for zones; + finding candidate F-T11-09). + Names whose decoded form contains '/' (sent as `%2F`) are truncated at + the first '/' by the `/full` handler and resolve to a different stream + (finding candidate F-T11-08). Path segments that decode to `.` or `..` + are rejected by the HTTP parser before routing. + schema: + $ref: '#/components/schemas/StreamName' + x-lightnvr-encoding: percent-encode-path-segment + x-lightnvr-source: >- + src/web/request_response.c:http_request_extract_path_param,url_decode; + src/web/libuv_connection.c:on_url_complete,request_path_has_dot_segment + + headers: + CacheControl: + description: 'Every JSON response sets `no-cache, no-store, must-revalidate` (plus `Pragma: no-cache` and `Expires: 0`).' + schema: + type: string + const: no-cache, no-store, must-revalidate + x-lightnvr-source: src/web/request_response.c:http_response_set_json + + responses: + BadRequest: + description: Malformed path, query, or body. Message text is operation-specific. + headers: + Cache-Control: + $ref: '#/components/headers/CacheControl' + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + Unauthorized: + description: >- + No authenticated principal (and demo mode is off). Body is + `{"error":"Unauthorized"}`. + headers: + Cache-Control: + $ref: '#/components/headers/CacheControl' + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + example: + error: Unauthorized + x-lightnvr-source: src/web/httpd_utils.c:httpd_authorize_stream_action_with_context,httpd_authorize_action + Forbidden: + description: Authenticated but the authorization policy denied the action. Body is `{"error":"Forbidden"}`. + headers: + Cache-Control: + $ref: '#/components/headers/CacheControl' + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + example: + error: Forbidden + x-lightnvr-source: src/web/httpd_utils.c:httpd_authorize_stream_action_with_context,httpd_authorize_action + StreamNotFound: + description: >- + `{"error":"Stream not found"}` when no stream with that name is loaded. + This check runs BEFORE authentication, so unauthenticated callers can + distinguish existing from missing names (finding candidate F-T11-01). + `{"error":"Camera not found"}` is returned after authentication when the + stream exists but has no fleet inventory row. + headers: + Cache-Control: + $ref: '#/components/headers/CacheControl' + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + stream: + value: + error: Stream not found + camera: + value: + error: Camera not found + x-lightnvr-source: src/web/api_handlers_streams_get.c:handle_get_stream_full; src/web/httpd_utils.c:httpd_authorize_stream_action_with_context + PayloadTooLarge: + description: A size-checked string field exceeded its buffer. + headers: + Cache-Control: + $ref: '#/components/headers/CacheControl' + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + InternalError: + description: >- + Server-side failure (allocation, serialization, database read, or + authorization policy evaluation error: `{"error":"Authorization policy + evaluation failed"}`). + headers: + Cache-Control: + $ref: '#/components/headers/CacheControl' + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' diff --git a/docs/api/contracts/streams.yaml b/docs/api/contracts/streams.yaml new file mode 100644 index 000000000..2f7f1a7f3 --- /dev/null +++ b/docs/api/contracts/streams.yaml @@ -0,0 +1,1209 @@ +# SPDX-License-Identifier: GPL-3.0-or-later +# Copyright (C) 2025-2026 OpenSensor Engineering and LightNVR contributors +# +# Streams pilot contract fragment (T11). Root: docs/api/openapi.yaml. +# Not a standalone OpenAPI document: `paths` entries are Path Item $ref +# targets and `components` holds the schemas they use. +# +# Pilot scope: Streams list + edit (GET /api/streams?summary=true, +# GET /api/streams/{name}/full, PUT /api/streams/{name}) and the read-only +# option dependencies the list/edit UI loads (client-config, detection models, +# auth verify, zones read). Every other Streams operation is inventoried in +# quality/api-inventory.json (streams_pilot.out_of_pilot_streams_operations) +# and intentionally NOT specified here. +# +# Modelling rules used throughout: +# - The server never emits JSON null in these responses; absent text is "". +# - Response objects are open (additive fields are compatible) EXCEPT that +# viewer-facing schemas explicitly forbid or pin every credential-bearing +# key, and LPR summary rows are closed (identity only). +# - Request objects are closed: the server silently ignores unknown keys, so +# the contract forbids them to catch client drift (e.g. D-01 `is_deleted`). +# - Numeric bounds appear only where the C handler enforces them. Intended but +# unenforced ranges are recorded as `x-lightnvr-intended-range`. +# - `x-lightnvr-overflow` says what the server does with an over-long string: +# `truncate` (silently, 202) or the status it returns. +paths: + /api/streams: + get: + operationId: listStreams + tags: [streams] + summary: List streams (paged summary for the pilot; legacy full list otherwise) + description: >- + Authentication is checked first (401). With `summary=true` (or `1`) the + paged summary variant is returned; its row shape depends on `surface`. + Rows are filtered per camera: `admin`/`live` require live.view, + `lpr` requires both lpr.search and lpr.read. `can_configure` is the + per-camera camera.configure decision. Query parameters are validated in + this order: page/page_size, sort_by, sort_order, surface, availability. + Without `summary`, the legacy unbounded array of full stream objects is + returned (out of pilot; no current web/js caller) and every other query + parameter is ignored. + x-lightnvr-source: src/web/api_handlers_streams_get.c:handle_get_streams,handle_get_stream_summaries + x-lightnvr-authz: + authentication: required (demo mode grants a viewer pseudo-user; auth disabled grants admin) + row_filter: + admin: live.view + live: live.view + lpr: lpr.search AND lpr.read + can_configure: camera.configure (per camera) + x-lightnvr-response-variant-by-query: + parameter: surface + requires: { summary: ['true', '1'] } + mapping: + admin: '#/components/schemas/StreamSummaryPageAdmin' + live: '#/components/schemas/StreamSummaryPageLive' + lpr: '#/components/schemas/StreamSummaryPageLpr' + otherwise: '#/components/schemas/LegacyStreamList' + parameters: + - name: summary + in: query + description: Exactly `true` or `1` selects the summary variant; any other value (including `TRUE`) selects the legacy list. + schema: { type: string } + - name: surface + in: query + schema: { type: string, enum: [admin, live, lpr], default: admin } + description: 'Invalid value: 400 "surface must be admin, live or lpr".' + - name: page + in: query + schema: { type: integer, minimum: 1, maximum: 1000000, default: 1 } + description: >- + Decimal integer parsed by strtol: leading whitespace and a plus sign + are accepted, but trailing whitespace/suffixes are rejected. Empty + or out of range: + 400 "page and page_size must be positive; page_size max is 100". + A page beyond the last returns an empty `streams` array with the real totals. + - name: page_size + in: query + schema: { type: integer, minimum: 1, maximum: 100, default: 50 } + description: 'Out of range: 400 "page and page_size must be positive; page_size max is 100".' + - name: sort_by + in: query + schema: { type: string, enum: [name, status, resolution, fps, recording], default: name } + description: 'Invalid: 400 "Invalid stream summary sort field". Ties break on case-insensitive name.' + - name: sort_order + in: query + schema: { type: string, enum: [asc, desc], default: asc } + description: 'Invalid: 400 "sort_order must be asc or desc".' + - name: availability + in: query + schema: { type: string, enum: [all, live, offline, never_connected, disabled], default: all } + description: 'Invalid: 400 "Invalid availability value".' + - name: search + in: query + description: >- + Case-insensitive substring over name, camera_uuid, tags, location + path and inventory address. Values longer than 255 bytes are + silently truncated. + schema: { type: string, maxLength: 255 } + - name: include_admin_url + in: query + description: >- + Exactly `true` or `1` adds `admin_url` to rows on the admin surface + (never on live/lpr). Rows without camera.configure get "". + schema: { type: string } + responses: + '200': + description: Summary page (surface-specific) or legacy array. + headers: + Cache-Control: + $ref: './common.yaml#/components/headers/CacheControl' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/StreamSummaryPageAdmin' + - $ref: '#/components/schemas/StreamSummaryPageLive' + - $ref: '#/components/schemas/StreamSummaryPageLpr' + - $ref: '#/components/schemas/LegacyStreamList' + '400': + $ref: './common.yaml#/components/responses/BadRequest' + '401': + $ref: './common.yaml#/components/responses/Unauthorized' + '500': + description: >- + Includes "Authorization policy evaluation failed", which is also + returned for the WHOLE list when any stream lacks a fleet inventory + row (finding candidate F-T11-10). + content: + application/json: + schema: + $ref: './common.yaml#/components/schemas/ErrorResponse' + + /api/streams/{name}/full: + get: + operationId: getStreamFull + tags: [streams] + summary: Full stream detail used by the edit form + description: >- + Order of checks: path decode (400 "Invalid request path"), stream + lookup (404 "Stream not found", BEFORE authentication), configuration + read (500), authentication (401), fleet row (404 "Camera not found"), + live.view (403). Callers with live.view but without camera.configure + receive the live-only redacted variant; `can_control_privacy` equals + the camera.configure decision and selects the variant. The response is + wrapped as `{"stream": {...}}` (GET /api/streams/{name}, out of pilot, + returns the same object unwrapped). The handler never emits + `detection_zones` (D-02); zones come from GET /api/streams/{name}/zones. + x-lightnvr-source: src/web/api_handlers_streams_get.c:handle_get_stream_full,get_stream_api_credentials,stream_user_can_modify + x-lightnvr-authz: + required: live.view (per camera) + variant_selector: camera.configure (per camera) -> can_control_privacy + x-lightnvr-response-variant-by-field: + field: stream.can_control_privacy + mapping: + 'true': '#/components/schemas/StreamFullResponseConfigurable' + 'false': '#/components/schemas/StreamFullResponseLiveOnly' + parameters: + - $ref: './common.yaml#/components/parameters/StreamNamePath' + responses: + '200': + description: Stream detail, configure or live-only variant. + headers: + Cache-Control: + $ref: './common.yaml#/components/headers/CacheControl' + content: + application/json: + schema: + $ref: '#/components/schemas/StreamFullResponse' + '400': + $ref: './common.yaml#/components/responses/BadRequest' + '401': + $ref: './common.yaml#/components/responses/Unauthorized' + '403': + $ref: './common.yaml#/components/responses/Forbidden' + '404': + $ref: './common.yaml#/components/responses/StreamNotFound' + '500': + $ref: './common.yaml#/components/responses/InternalError' + + /api/streams/{name}: + put: + operationId: updateStream + tags: [streams] + summary: Update stream configuration (asynchronous apply) + description: >- + Order of checks: path decode (400 "Invalid request path"), stream + lookup (404 "Stream not found", BEFORE authentication), configuration + read (500), camera.configure authorization (401/404 "Camera not + found"/403) BEFORE the body is parsed, then body parse (400 "Invalid + JSON in request body" for an empty or unparsable body). Fields are + applied in handler order; the first failing validation returns its + error and nothing is stored. Present keys with the wrong JSON type are + silently ignored (F-T11-05). A valid JSON body that is not an object + (e.g. `null`, `[]`) is accepted as a no-op 202 (F-T11-04). + If `isOnvif` is omitted the server recomputes it from whether `url` + contains "onvif" (F-T11-11). When the effective isOnvif is true the + handler copies onvif_username/onvif_password/onvif_profile, moves URL + credentials into them, and runs an ONVIF connection test inline before + responding; when false those three keys are ignored. + `set_privacy_mode` short-circuits: after all other keys were parsed and + validated (and `enable_disabled` already executed) it writes only + privacy_mode and answers 200; other edits in the same body are + discarded (F-T11-12). Otherwise the response is 202 and a detached + worker applies the change; the 202 does not prove persistence. + Errors in the 400 set: "playback_transport is invalid", + "eptz_config must be a JSON string", "eptz_config exceeds size limit", + "eptz_config is not a supported version-1 equidistant ceiling configuration", + "retention_days must be between -1 and 365", + "detection_retention_days must be between -1 and 365", + "detection_url must use http, https, rtsp, or rtsps", + "publish_url destinations must be rtmp:// or rtmps:// URLs". + 413 set: "detection_url exceeds size limit", "publish_url exceeds size limit". + x-lightnvr-source: src/web/api_handlers_streams_modify.c:handle_put_stream,check_stream_write_access,copy_valid_eptz_config,is_allowed_detection_url,normalize_stream_url_credentials + x-lightnvr-authz: + required: camera.configure (per camera), checked before body parse + parameters: + - $ref: './common.yaml#/components/parameters/StreamNamePath' + requestBody: + required: true + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/StreamUpdateRequest' + - $ref: '#/components/schemas/StreamPrivacyModeRequest' + responses: + '200': + description: set_privacy_mode short-circuit result. + headers: + Cache-Control: + $ref: './common.yaml#/components/headers/CacheControl' + content: + application/json: + schema: + $ref: '#/components/schemas/StreamPrivacyModeResponse' + '202': + description: Update accepted; applied asynchronously by a worker thread. + headers: + Cache-Control: + $ref: './common.yaml#/components/headers/CacheControl' + content: + application/json: + schema: + $ref: '#/components/schemas/StreamUpdateAccepted' + '400': + $ref: './common.yaml#/components/responses/BadRequest' + '401': + $ref: './common.yaml#/components/responses/Unauthorized' + '403': + $ref: './common.yaml#/components/responses/Forbidden' + '404': + $ref: './common.yaml#/components/responses/StreamNotFound' + '413': + $ref: './common.yaml#/components/responses/PayloadTooLarge' + '500': + $ref: './common.yaml#/components/responses/InternalError' + + /api/streams/{name}/zones: + get: + operationId: getStreamZones + tags: [streams, pilot-option-dependency] + summary: Detection zones for a stream (read by the edit modal and ZoneEditor) + description: >- + No pre-auth existence check: 401 first, then 404 "Camera not found" + for unknown names, 403 without live.view. Path decode failure is 400 + "Invalid stream name". POST/DELETE on this path are out of pilot. + x-lightnvr-source: src/web/api_handlers_zones.c:handle_get_zones + x-lightnvr-authz: + required: live.view (per camera) + parameters: + - $ref: './common.yaml#/components/parameters/StreamNamePath' + responses: + '200': + description: Zones for the stream (possibly empty). + headers: + Cache-Control: + $ref: './common.yaml#/components/headers/CacheControl' + content: + application/json: + schema: + $ref: '#/components/schemas/ZonesResponse' + '400': + $ref: './common.yaml#/components/responses/BadRequest' + '401': + $ref: './common.yaml#/components/responses/Unauthorized' + '403': + $ref: './common.yaml#/components/responses/Forbidden' + '404': + $ref: './common.yaml#/components/responses/StreamNotFound' + '500': + $ref: './common.yaml#/components/responses/InternalError' + + /api/client-config: + get: + operationId: getClientConfig + tags: [pilot-option-dependency] + summary: Viewer-safe runtime playback configuration + x-lightnvr-source: src/web/api_handlers_settings.c:handle_get_client_config + x-lightnvr-authz: + required: authentication only + responses: + '200': + description: Client configuration. + headers: + Cache-Control: + $ref: './common.yaml#/components/headers/CacheControl' + content: + application/json: + schema: + $ref: '#/components/schemas/ClientConfig' + '401': + $ref: './common.yaml#/components/responses/Unauthorized' + '500': + $ref: './common.yaml#/components/responses/InternalError' + + /api/detection/models: + get: + operationId: listDetectionModels + tags: [pilot-option-dependency] + summary: Detection model options for the edit form + description: >- + 401 unauthenticated; 403 unless the principal has global + camera.configure or camera.configure on at least one camera. Viewers + therefore receive 403 and the UI shows no models (D-04). + x-lightnvr-source: src/web/api_handlers_detection_models.c:handle_get_detection_models + x-lightnvr-authz: + required: camera.configure (global, or on >= 1 camera) + responses: + '200': + description: Built-in models first (motion, api-detection, onvif), then file models. + headers: + Cache-Control: + $ref: './common.yaml#/components/headers/CacheControl' + content: + application/json: + schema: + $ref: '#/components/schemas/DetectionModelsResponse' + '401': + $ref: './common.yaml#/components/responses/Unauthorized' + '403': + $ref: './common.yaml#/components/responses/Forbidden' + '500': + $ref: './common.yaml#/components/responses/InternalError' + + /api/auth/verify: + get: + operationId: verifyAuth + tags: [pilot-option-dependency] + summary: Current principal (role and demo-mode gating for the Streams UI) + description: >- + Three 200 shapes: authentication disabled (synthetic admin), a real + authenticated user, or demo-mode anonymous viewer. Uses + httpd_get_authenticated_user (scoped API tokens are not accepted here + although the streams handlers accept them). 401 also clears the + session cookie. An authenticated user in demo mode receives no + `demo_mode` key (F-T11-13). + x-lightnvr-source: src/web/api_handlers_auth_backend_agnostic.c:handle_auth_verify + security: + - {} + - sessionCookie: [] + - basicAuth: [] + - apiKey: [] + - bearerAuth: [] + responses: + '200': + description: Principal description. + headers: + Cache-Control: + $ref: './common.yaml#/components/headers/CacheControl' + content: + application/json: + schema: + $ref: '#/components/schemas/AuthVerifyResponse' + '401': + $ref: './common.yaml#/components/responses/Unauthorized' + +components: + schemas: + # ------------------------------------------------------------------ + # Summary list (GET /api/streams?summary=true) + # ------------------------------------------------------------------ + SummaryStatus: + type: string + enum: [Running, Degraded, Error, Stopped, Unknown] + x-lightnvr-source: src/web/api_handlers_streams_get.c:summary_status + + Availability: + type: string + enum: [live, offline, never_connected, disabled] + x-lightnvr-source: src/core/camera_selector.c:fleet_availability_state_name + + SummaryForbiddenSensitiveKeys: + description: >- + Summary rows never carry credential-bearing configuration. Presence of + any of these keys is a redaction failure regardless of value. + not: + anyOf: + - required: [url] + - required: [onvif_username] + - required: [onvif_password] + - required: [sub_stream_url] + - required: [detection_url] + - required: [publish_url] + - required: [go2rtc_source_override] + - required: [detection_api_url] + + StreamSummaryLpr: + description: >- + surface=lpr row. LPR discovery grants identity only, so this object is + closed: any extra key (configuration, location, health) is a policy leak. + type: object + additionalProperties: false + required: [camera_uuid, name] + properties: + camera_uuid: + $ref: './common.yaml#/components/schemas/CameraUuid' + name: + $ref: './common.yaml#/components/schemas/StreamName' + + StreamSummaryBase: + description: Fields shared by admin and live summary rows (always emitted). + type: object + allOf: + - $ref: '#/components/schemas/SummaryForbiddenSensitiveKeys' + required: + - camera_uuid + - name + - location_uuid + - location_name + - location_path + - enabled + - width + - height + - fps + - codec + - protocol + - record + - record_on_schedule + - detection_based_recording + - isOnvif + - tags + - status + - availability + - first_video_at + - last_frame_ts + - current_fps + - recording_active + - last_recording_at + - can_configure + properties: + camera_uuid: { $ref: './common.yaml#/components/schemas/CameraUuid' } + name: { $ref: './common.yaml#/components/schemas/StreamName' } + location_uuid: { $ref: './common.yaml#/components/schemas/CameraUuid' } + location_name: { type: string, maxLength: 127 } + location_path: { type: string, maxLength: 1023 } + enabled: { type: boolean } + width: { $ref: './common.yaml#/components/schemas/Int32' } + height: { $ref: './common.yaml#/components/schemas/Int32' } + fps: { $ref: './common.yaml#/components/schemas/Int32' } + codec: { type: string, maxLength: 15 } + protocol: { $ref: './common.yaml#/components/schemas/StreamProtocol' } + record: { type: boolean } + record_on_schedule: { type: boolean } + detection_based_recording: { type: boolean } + isOnvif: { type: boolean } + tags: { type: string, maxLength: 255, description: Comma-separated legacy tags. } + status: { $ref: '#/components/schemas/SummaryStatus' } + availability: { $ref: '#/components/schemas/Availability' } + first_video_at: { $ref: './common.yaml#/components/schemas/EpochSecondsOrZero' } + last_frame_ts: { $ref: './common.yaml#/components/schemas/EpochSecondsOrZero' } + current_fps: { type: number, minimum: 0 } + recording_active: { type: boolean } + last_recording_at: { $ref: './common.yaml#/components/schemas/EpochSecondsOrZero' } + can_configure: + type: boolean + description: Per-camera camera.configure decision. Authoritative for edit affordances (D-05). + x-lightnvr-not-emitted: + - error_message (D-03) + - playback_transport on the admin surface (D-03) + + StreamSummaryAdmin: + description: >- + surface=admin row. `admin_url` appears only with include_admin_url and + must be "" when can_configure is false. + allOf: + - $ref: '#/components/schemas/StreamSummaryBase' + - type: object + properties: + admin_url: { type: string, maxLength: 511 } + if: + required: [can_configure] + properties: + can_configure: { const: false } + then: + properties: + admin_url: { $ref: './common.yaml#/components/schemas/EmptyString' } + + StreamSummaryLive: + description: surface=live row. Never carries admin_url. + allOf: + - $ref: '#/components/schemas/StreamSummaryBase' + - type: object + not: + required: [admin_url] + required: + - streaming_enabled + - playback_transport + - eptz_config + - detection_model + - privacy_mode + - can_control_privacy + - has_sub_stream + - ptz_enabled + - backchannel_enabled + - go2rtc_hls_available + properties: + streaming_enabled: { type: boolean } + playback_transport: { $ref: './common.yaml#/components/schemas/PlaybackTransport' } + eptz_config: { $ref: '#/components/schemas/EptzConfigString' } + detection_model: { type: string, maxLength: 511 } + privacy_mode: { type: boolean } + can_control_privacy: + type: boolean + description: Equals can_configure for the row. + has_sub_stream: { type: boolean } + ptz_enabled: { type: boolean } + backchannel_enabled: { type: boolean } + go2rtc_hls_available: { type: boolean } + + SummaryPageMeta: + type: object + required: [total, page, page_size, total_pages] + properties: + total: { type: integer, minimum: 0, description: Rows visible to the caller after filtering. } + page: { type: integer, minimum: 1, maximum: 1000000 } + page_size: { type: integer, minimum: 1, maximum: 100 } + total_pages: { type: integer, minimum: 0, description: '0 when total is 0, else ceil(total / page_size).' } + + StreamSummaryPageAdmin: + allOf: + - $ref: '#/components/schemas/SummaryPageMeta' + - type: object + required: [streams] + properties: + streams: + type: array + maxItems: 100 + items: { $ref: '#/components/schemas/StreamSummaryAdmin' } + + StreamSummaryPageLive: + allOf: + - $ref: '#/components/schemas/SummaryPageMeta' + - type: object + required: [streams] + properties: + streams: + type: array + maxItems: 100 + items: { $ref: '#/components/schemas/StreamSummaryLive' } + + StreamSummaryPageLpr: + allOf: + - $ref: '#/components/schemas/SummaryPageMeta' + - type: object + required: [streams] + properties: + streams: + type: array + maxItems: 100 + items: { $ref: '#/components/schemas/StreamSummaryLpr' } + + LegacyStreamList: + description: >- + Out of pilot (inventoried, not contract-tested by T18): GET /api/streams + without summary. Bare unbounded array of the same objects as the /full + detail, each redacted per camera. + x-lightnvr-pilot: false + type: array + items: { $ref: '#/components/schemas/StreamDetail' } + + # ------------------------------------------------------------------ + # Full detail (GET /api/streams/{name}/full) + # ------------------------------------------------------------------ + DetailStatus: + type: string + enum: [Running, Degraded, Error, Stopped, Unknown, Starting, Stopping, Reconnecting] + description: >- + Fleet health first; when health is unknown and the stream is enabled, + the stream-state/UDT status is used (adds Starting/Stopping/Reconnecting). + x-lightnvr-source: src/web/api_handlers_streams_get.c:summary_status,resolve_effective_stream_status + + EptzConfigString: + description: >- + "" (disabled) or JSON text of a version-1 equidistant ceiling dewarp + document, at most 1023 bytes. The server stores it opaquely after + validating; the document schema is EptzConfigV1. + type: string + maxLength: 1023 + contentMediaType: application/json + contentSchema: { $ref: '#/components/schemas/EptzConfigV1' } + x-lightnvr-max-bytes: 1023 + x-lightnvr-source: src/web/api_handlers_streams_modify.c:copy_valid_eptz_config; include/core/config.h:EPTZ_CONFIG_MAX + + EptzConfigV1: + type: object + required: [version, projection, mount, centerX, centerY, radius, fov, rotation, defaultYaw, defaultTilt, defaultViewFov] + properties: + version: { const: 1 } + projection: { const: equidistant } + mount: { const: ceiling } + centerX: { type: number, minimum: 0, maximum: 1 } + centerY: { type: number, minimum: 0, maximum: 1 } + radius: { type: number, minimum: 0.05, maximum: 1 } + fov: { type: number, minimum: 160, maximum: 360 } + rotation: { type: number, minimum: -360, maximum: 360 } + defaultYaw: { type: number, minimum: -360, maximum: 360 } + defaultTilt: { type: number, minimum: -90, maximum: 30 } + defaultViewFov: { type: number, minimum: 20, maximum: 120 } + + StreamDetailBase: + description: >- + Non-sensitive fields of the full stream object, emitted for every caller + with live.view. Credential-bearing keys (url, onvif_username, + onvif_password, admin_url, go2rtc_source_override, sub_stream_url, + detection_url, publish_url) are declared here only as strings and are + NOT required; each variant pins them. + type: object + required: + - camera_uuid + - location_uuid + - name + - enabled + - streaming_enabled + - playback_transport + - eptz_config + - width + - height + - fps + - codec + - priority + - record + - segment_duration + - detection_based_recording + - detection_model + - detection_threshold + - detection_interval + - pre_detection_buffer + - post_detection_buffer + - detection_object_filter + - detection_object_filter_list + - protocol + - record_audio + - audio_voice_enhancement + - isOnvif + - backchannel_enabled + - retention_days + - detection_retention_days + - max_storage_mb + - tier_critical_multiplier + - tier_important_multiplier + - tier_ephemeral_multiplier + - storage_priority + - ptz_enabled + - ptz_max_x + - ptz_max_y + - ptz_max_z + - ptz_has_home + - onvif_profile + - onvif_port + - record_on_schedule + - recording_schedule + - detection_record_on_schedule + - detection_recording_schedule + - tags + - privacy_mode + - can_control_privacy + - motion_trigger_source + - has_sub_stream + - status + - go2rtc_hls_available + properties: + camera_uuid: { $ref: './common.yaml#/components/schemas/CameraUuid' } + location_uuid: { $ref: './common.yaml#/components/schemas/CameraUuid' } + name: { $ref: './common.yaml#/components/schemas/StreamName' } + url: { type: string, maxLength: 511 } + enabled: { type: boolean } + streaming_enabled: { type: boolean } + playback_transport: { $ref: './common.yaml#/components/schemas/PlaybackTransport' } + eptz_config: { $ref: '#/components/schemas/EptzConfigString' } + width: { $ref: './common.yaml#/components/schemas/Int32' } + height: { $ref: './common.yaml#/components/schemas/Int32' } + fps: { $ref: './common.yaml#/components/schemas/Int32' } + codec: { type: string, maxLength: 15 } + priority: { $ref: './common.yaml#/components/schemas/Int32' } + record: { type: boolean } + segment_duration: { $ref: './common.yaml#/components/schemas/Int32' } + detection_based_recording: { type: boolean } + detection_model: { type: string, maxLength: 511 } + detection_threshold: + type: integer + description: >- + Integer percent: (int)(stored_float * 100.0f), truncated toward + zero. Not a 0..1 float on the wire. + detection_interval: { $ref: './common.yaml#/components/schemas/Int32' } + pre_detection_buffer: { $ref: './common.yaml#/components/schemas/Int32' } + post_detection_buffer: { $ref: './common.yaml#/components/schemas/Int32' } + detection_object_filter: { type: string, maxLength: 15 } + detection_object_filter_list: { type: string, maxLength: 255 } + protocol: { $ref: './common.yaml#/components/schemas/StreamProtocol' } + record_audio: { type: boolean } + audio_voice_enhancement: { type: boolean } + isOnvif: { type: boolean } + backchannel_enabled: { type: boolean } + retention_days: { $ref: './common.yaml#/components/schemas/RetentionDays' } + detection_retention_days: { $ref: './common.yaml#/components/schemas/RetentionDays' } + max_storage_mb: + allOf: [{ $ref: './common.yaml#/components/schemas/Int32' }] + description: Quota in MB; 0 = unlimited. + tier_critical_multiplier: { type: number } + tier_important_multiplier: { type: number } + tier_ephemeral_multiplier: { type: number } + storage_priority: { $ref: './common.yaml#/components/schemas/Int32' } + ptz_enabled: { type: boolean } + ptz_max_x: { $ref: './common.yaml#/components/schemas/Int32' } + ptz_max_y: { $ref: './common.yaml#/components/schemas/Int32' } + ptz_max_z: { $ref: './common.yaml#/components/schemas/Int32' } + ptz_has_home: { type: boolean } + onvif_username: { type: string, maxLength: 63 } + onvif_password: { type: string, maxLength: 63 } + onvif_profile: { type: string, maxLength: 63 } + onvif_port: + allOf: [{ $ref: './common.yaml#/components/schemas/Int32' }] + description: 0 = derive from the stream URL. + record_on_schedule: { type: boolean } + recording_schedule: { $ref: './common.yaml#/components/schemas/HourOfWeekSchedule' } + detection_record_on_schedule: { type: boolean } + detection_recording_schedule: { $ref: './common.yaml#/components/schemas/HourOfWeekSchedule' } + tags: { type: string, maxLength: 255 } + admin_url: { type: string, maxLength: 511 } + privacy_mode: { type: boolean } + can_control_privacy: { type: boolean } + motion_trigger_source: { type: string, maxLength: 255 } + go2rtc_source_override: { type: string, maxLength: 8191 } + sub_stream_url: { type: string, maxLength: 511 } + has_sub_stream: + type: boolean + description: Presence of a sub-stream; visible to viewers by design. + detection_url: { type: string, maxLength: 511 } + publish_url: { type: string, maxLength: 511 } + status: { $ref: '#/components/schemas/DetailStatus' } + error_message: + type: string + minLength: 1 + maxLength: 255 + description: Present only when status is Error and a cause was recorded (currently model-load failures). + go2rtc_hls_available: { type: boolean } + if: + required: [status] + properties: + status: { not: { const: Error } } + then: + not: + required: [error_message] + x-lightnvr-not-emitted: + - detection_zones (D-02) + - detection_api_url + - id + + StreamDetailConfigurable: + description: >- + Admin edit model: caller has camera.configure on this camera + (can_control_privacy = true). Sensitive fields carry real values. + When separate credentials are in use (isOnvif, or non-empty + onvif_username/onvif_password) the server strips userinfo from `url` + and surfaces it through the onvif_* fields. + allOf: + - $ref: '#/components/schemas/StreamDetailBase' + - type: object + required: [url, onvif_username, onvif_password, admin_url, go2rtc_source_override, sub_stream_url, detection_url, publish_url] + properties: + can_control_privacy: { const: true } + if: + anyOf: + - required: [isOnvif] + properties: { isOnvif: { const: true } } + - required: [onvif_username] + properties: { onvif_username: { minLength: 1 } } + - required: [onvif_password] + properties: { onvif_password: { minLength: 1 } } + then: + properties: + url: { $ref: './common.yaml#/components/schemas/UrlWithoutUserinfo' } + + StreamDetailLiveOnly: + description: >- + Viewer (live.view without camera.configure) model. Every + credential-bearing key is OPTIONAL (a server that stops sending it is + compatible) but, if present, must be redacted: onvif_* and the + administrative URLs must be exactly "", and `url` must be + credential-free (no userinfo, no secret-like query parameter). A leaked + value therefore fails validation. + allOf: + - $ref: '#/components/schemas/StreamDetailBase' + - type: object + properties: + can_control_privacy: { const: false } + url: { $ref: './common.yaml#/components/schemas/ViewerSafeUrl' } + onvif_username: { $ref: './common.yaml#/components/schemas/EmptyString' } + onvif_password: { $ref: './common.yaml#/components/schemas/EmptyString' } + admin_url: { $ref: './common.yaml#/components/schemas/EmptyString' } + go2rtc_source_override: { $ref: './common.yaml#/components/schemas/EmptyString' } + sub_stream_url: { $ref: './common.yaml#/components/schemas/EmptyString' } + detection_url: { $ref: './common.yaml#/components/schemas/EmptyString' } + publish_url: { $ref: './common.yaml#/components/schemas/EmptyString' } + not: + required: [detection_api_url] + + StreamDetail: + description: Either variant, selected by can_control_privacy (mutually exclusive by const). + oneOf: + - $ref: '#/components/schemas/StreamDetailConfigurable' + - $ref: '#/components/schemas/StreamDetailLiveOnly' + + StreamFullResponse: + type: object + required: [stream] + properties: + stream: { $ref: '#/components/schemas/StreamDetail' } + + StreamFullResponseConfigurable: + type: object + required: [stream] + properties: + stream: { $ref: '#/components/schemas/StreamDetailConfigurable' } + + StreamFullResponseLiveOnly: + type: object + required: [stream] + properties: + stream: { $ref: '#/components/schemas/StreamDetailLiveOnly' } + + # ------------------------------------------------------------------ + # Update (PUT /api/streams/{name}) + # ------------------------------------------------------------------ + NullableClearableString: + description: Clearable text field. JSON null clears the stored value (same as ""). + type: [string, 'null'] + + DetectionUrl: + description: >- + "" (use main stream) or a URL whose scheme is http, https, rtsp or rtsps + (case-insensitive prefix check). Other schemes: 400. >= 512 bytes: 413 + (scheme is checked first). null clears. + type: [string, 'null'] + maxLength: 511 + pattern: '^($|([Hh][Tt][Tt][Pp][Ss]?|[Rr][Tt][Ss][Pp][Ss]?)://)' + x-lightnvr-max-bytes: 511 + x-lightnvr-overflow: 413 + x-lightnvr-source: src/web/api_handlers_streams_modify.c:is_allowed_detection_url + + PublishUrlList: + description: >- + "" or a comma/whitespace-separated list of rtmp:// or rtmps:// + destinations. Each destination is printable ASCII without quotes or + backslash and has at least one character after the scheme. Invalid + list: 400; whole string >= 512 bytes: 413 (validity is checked first). + null clears. + type: [string, 'null'] + maxLength: 511 + pattern: '^[\t\n\v\f\r ,]*(([Rr][Tt][Mm][Pp][Ss]?://[!#-&(-+\x2D-\x5B\x5D-~]+)([\t\n\v\f\r ,]+[Rr][Tt][Mm][Pp][Ss]?://[!#-&(-+\x2D-\x5B\x5D-~]+)*)?[\t\n\v\f\r ,]*$' + x-lightnvr-max-bytes: 511 + x-lightnvr-overflow: 413 + x-lightnvr-source: src/core/url_utils.c:publish_url_list_is_valid + + StreamUpdateRequest: + description: >- + Edit-form body. All keys optional (partial update). Closed: the server + ignores unknown keys (including `name` and the UI's `is_deleted`, D-01) + but the contract rejects them so client drift is visible. + Wrong-typed values are silently ignored by the server (F-T11-05). + Top-level numeric fields have no server-side range checks except + retention (F-T11-06); the JSON embedded in eptz_config is separately + range-checked. Over-long strings are silently truncated unless + `x-lightnvr-overflow` says otherwise (F-T11-14). + type: object + additionalProperties: false + properties: + url: + type: string + maxLength: 511 + x-lightnvr-overflow: truncate + description: Not validated (an empty string is accepted). A change requires a stream restart. + enabled: { type: boolean } + enable_disabled: + type: boolean + x-lightnvr-pilot: false + description: >- + Out of pilot (enable/bulk-enable). `true` re-enables a disabled + stream synchronously, even when the same body also carries set_privacy_mode. + streaming_enabled: { type: boolean } + playback_transport: { $ref: './common.yaml#/components/schemas/PlaybackTransport' } + eptz_config: { $ref: '#/components/schemas/EptzConfigString' } + codec: + type: string + maxLength: 15 + x-lightnvr-overflow: truncate + description: Codec hint; the UI sends "" (auto), "h264" or "h265". Not validated. + priority: + allOf: [{ $ref: './common.yaml#/components/schemas/Int32' }] + x-lightnvr-intended-range: '1..10' + protocol: { $ref: './common.yaml#/components/schemas/StreamProtocol' } + segment_duration: + allOf: [{ $ref: './common.yaml#/components/schemas/Int32' }] + description: Seconds. + record: { type: boolean } + detection_based_recording: { type: boolean } + detection_model: + type: string + maxLength: 255 + x-lightnvr-max-bytes: 255 + x-lightnvr-overflow: truncate + description: Copied through a 256-byte buffer although the stored field holds 511 bytes. + detection_threshold: + type: number + description: Percent; stored as value / 100.0 (float). Not range-checked. + x-lightnvr-intended-range: '0..100' + detection_interval: { $ref: './common.yaml#/components/schemas/Int32' } + pre_detection_buffer: { $ref: './common.yaml#/components/schemas/Int32' } + post_detection_buffer: { $ref: './common.yaml#/components/schemas/Int32' } + detection_object_filter: + type: string + maxLength: 15 + x-lightnvr-overflow: truncate + x-lightnvr-intended-enum: [none, include, exclude] + detection_object_filter_list: + type: string + maxLength: 255 + x-lightnvr-overflow: truncate + record_audio: { type: boolean } + audio_voice_enhancement: { type: boolean } + isOnvif: + type: boolean + description: When omitted the server recomputes it from `url` containing "onvif" (F-T11-11). The UI always sends it. + backchannel_enabled: { type: boolean } + onvif_username: + type: string + maxLength: 63 + x-lightnvr-overflow: truncate + description: Applied only when the effective isOnvif is true; "" clears the stored value (no "unchanged" sentinel). + onvif_password: + type: string + maxLength: 63 + x-lightnvr-overflow: truncate + x-lightnvr-sensitive: true + description: Applied only when the effective isOnvif is true; "" clears the stored value (no "unchanged" sentinel). + onvif_profile: + type: string + maxLength: 63 + x-lightnvr-overflow: truncate + description: Applied only when the effective isOnvif is true. + onvif_port: { $ref: './common.yaml#/components/schemas/Int32' } + retention_days: { $ref: './common.yaml#/components/schemas/RetentionDays' } + detection_retention_days: { $ref: './common.yaml#/components/schemas/RetentionDays' } + max_storage_mb: + allOf: [{ $ref: './common.yaml#/components/schemas/Int32' }] + description: 0 = unlimited. + tier_critical_multiplier: { type: number } + tier_important_multiplier: { type: number } + tier_ephemeral_multiplier: { type: number } + storage_priority: + allOf: [{ $ref: './common.yaml#/components/schemas/Int32' }] + x-lightnvr-intended-range: '1..10 (clamped by the UI only)' + ptz_enabled: { type: boolean } + ptz_max_x: { $ref: './common.yaml#/components/schemas/Int32' } + ptz_max_y: { $ref: './common.yaml#/components/schemas/Int32' } + ptz_max_z: { $ref: './common.yaml#/components/schemas/Int32' } + ptz_has_home: { type: boolean } + record_on_schedule: { type: boolean } + recording_schedule: { $ref: './common.yaml#/components/schemas/HourOfWeekSchedule' } + detection_record_on_schedule: { type: boolean } + detection_recording_schedule: { $ref: './common.yaml#/components/schemas/HourOfWeekSchedule' } + tags: + allOf: [{ $ref: '#/components/schemas/NullableClearableString' }] + maxLength: 255 + x-lightnvr-overflow: truncate + admin_url: + allOf: [{ $ref: '#/components/schemas/NullableClearableString' }] + maxLength: 511 + x-lightnvr-overflow: truncate + motion_trigger_source: + allOf: [{ $ref: '#/components/schemas/NullableClearableString' }] + maxLength: 255 + x-lightnvr-overflow: truncate + description: Another stream's name; existence is not checked. + go2rtc_source_override: + allOf: [{ $ref: '#/components/schemas/NullableClearableString' }] + maxLength: 8191 + x-lightnvr-overflow: truncate + description: Whitespace-only is stored as "". Not YAML-validated by PUT. + sub_stream_url: + allOf: [{ $ref: '#/components/schemas/NullableClearableString' }] + maxLength: 511 + x-lightnvr-overflow: truncate + detection_url: { $ref: '#/components/schemas/DetectionUrl' } + publish_url: { $ref: '#/components/schemas/PublishUrlList' } + + StreamPrivacyModeRequest: + description: >- + Live privacy toggle (used by Live video cells, not the edit form). + Modelled as its own closed body because the server discards every other + edit when this key is present (F-T11-12). + type: object + additionalProperties: false + required: [set_privacy_mode] + properties: + set_privacy_mode: { type: boolean } + + StreamUpdateAccepted: + type: object + required: [success, message] + properties: + success: { const: true } + message: { const: Stream update request accepted and processing } + onvif_status: + type: string + enum: [success, error] + description: Present when the effective isOnvif was true and the inline ONVIF test ran. + onvif_message: + type: string + enum: [ONVIF capabilities detected successfully, Failed to detect ONVIF capabilities] + dependentRequired: + onvif_status: [onvif_message] + onvif_message: [onvif_status] + + StreamPrivacyModeResponse: + description: >- + Always success:true, even if the database write failed (the failure is + only logged; F-T11-12). + type: object + required: [success, privacy_mode] + properties: + success: { const: true } + privacy_mode: { type: boolean } + + # ------------------------------------------------------------------ + # Option dependencies + # ------------------------------------------------------------------ + ZonePoint: + type: object + required: [x, y] + properties: + x: { type: number, description: Normalized 0..1 (not re-validated on read). } + y: { type: number, description: Normalized 0..1 (not re-validated on read). } + + DetectionZone: + type: object + required: [id, stream_name, name, enabled, color, polygon, filter_classes, min_confidence] + properties: + id: { type: string, maxLength: 63 } + stream_name: { $ref: './common.yaml#/components/schemas/StreamName' } + name: { type: string, maxLength: 63 } + enabled: { type: boolean } + color: { type: string, maxLength: 7 } + polygon: + type: array + maxItems: 32 + items: { $ref: '#/components/schemas/ZonePoint' } + filter_classes: { type: string, maxLength: 255 } + min_confidence: { type: number, description: 0 = use the stream default. } + x-lightnvr-source: src/web/api_handlers_zones.c:handle_get_zones; include/database/db_zones.h + + ZonesResponse: + type: object + required: [zones] + properties: + zones: + type: array + maxItems: 16 + items: { $ref: '#/components/schemas/DetectionZone' } + + ClientConfig: + type: object + required: + - go2rtc_enabled + - web_auth_enabled + - demo_mode + - audio_disabled + - auto_disabled + - go2rtc_available + - go2rtc_api_port + - go2rtc_base_path + - webrtc_disabled + - hls_disabled + - mse_disabled + - default_playback_transport + - go2rtc_force_native_hls + - webrtc_connection_timeout_ms + - webrtc_ice_recovery_timeout_ms + - generate_thumbnails + - thumbnails_per_recording + properties: + go2rtc_enabled: { type: boolean } + web_auth_enabled: { type: boolean } + demo_mode: { type: boolean } + audio_disabled: { type: boolean } + auto_disabled: { type: boolean } + go2rtc_available: { type: boolean } + go2rtc_api_port: { $ref: './common.yaml#/components/schemas/Int32' } + go2rtc_base_path: { type: string } + webrtc_disabled: { type: boolean } + hls_disabled: { type: boolean } + mse_disabled: { type: boolean } + default_playback_transport: { $ref: './common.yaml#/components/schemas/PlaybackTransport' } + go2rtc_force_native_hls: { type: boolean } + webrtc_connection_timeout_ms: { $ref: './common.yaml#/components/schemas/Int32' } + webrtc_ice_recovery_timeout_ms: { $ref: './common.yaml#/components/schemas/Int32' } + generate_thumbnails: { type: boolean } + thumbnails_per_recording: { $ref: './common.yaml#/components/schemas/Int32' } + x-lightnvr-note: snake_case only (D-06). + + DetectionModel: + type: object + required: [id, name, path, type, supported] + properties: + id: + type: string + description: Built-ins use motion, api-detection, onvif; file models use the absolute file path. + name: { type: string } + path: { type: string } + type: + type: string + description: Observed values include builtin, api, onvif, sod, sod_realnet, tflite. + supported: { type: boolean } + description: { type: string, description: Built-ins only. } + unsupported_reason: { type: string } + size: { type: number, minimum: 0, description: File size in bytes (file models only). } + if: + required: [supported] + properties: { supported: { const: false } } + then: + required: [unsupported_reason] + + DetectionModelsResponse: + type: object + required: [models, litert_available, sod_available, count] + properties: + models: + type: array + minItems: 3 + items: { $ref: '#/components/schemas/DetectionModel' } + x-lightnvr-builtin-prefix: [motion, api-detection, onvif] + litert_available: { type: boolean } + sod_available: { type: boolean } + count: { type: integer, minimum: 3 } + message: + const: Models directory does not exist + description: Present only when the models directory cannot be opened. + + AuthRole: + type: string + enum: [admin, user, viewer, api, unknown] + x-lightnvr-source: src/database/db_auth.c:db_auth_get_role_name + + AuthVerifyAuthenticated: + type: object + required: [authenticated, id, username, email, role, role_id, is_active, password_change_locked, must_change_password, auth_enabled, auth_timeout_hours, auth_absolute_timeout_hours, trusted_device_days] + properties: + authenticated: { const: true } + id: { type: integer } + username: { type: string, maxLength: 63 } + email: { type: string, maxLength: 127 } + role: { $ref: '#/components/schemas/AuthRole' } + role_id: { type: integer, minimum: 0, maximum: 3 } + is_active: { type: boolean } + password_change_locked: { type: boolean } + must_change_password: { type: boolean } + auth_enabled: { const: true } + auth_timeout_hours: { type: integer } + auth_absolute_timeout_hours: { type: integer } + trusted_device_days: { type: integer } + + AuthVerifyAuthDisabled: + type: object + required: [authenticated, username, role, must_change_password, auth_enabled, auth_timeout_hours, auth_absolute_timeout_hours, trusted_device_days] + properties: + authenticated: { const: true } + username: { const: admin } + role: { const: admin } + must_change_password: { const: false } + auth_enabled: { const: false } + auth_timeout_hours: { type: integer } + auth_absolute_timeout_hours: { type: integer } + trusted_device_days: { type: integer } + + AuthVerifyDemo: + type: object + required: [authenticated, demo_mode, username, role, must_change_password] + properties: + authenticated: { const: false } + demo_mode: { const: true } + username: { const: demo } + role: { const: viewer } + must_change_password: { const: false } + + AuthVerifyResponse: + oneOf: + - $ref: '#/components/schemas/AuthVerifyAuthenticated' + - $ref: '#/components/schemas/AuthVerifyAuthDisabled' + - $ref: '#/components/schemas/AuthVerifyDemo' diff --git a/docs/api/openapi.yaml b/docs/api/openapi.yaml new file mode 100644 index 000000000..fe505709f --- /dev/null +++ b/docs/api/openapi.yaml @@ -0,0 +1,114 @@ +# SPDX-License-Identifier: GPL-3.0-or-later +# Copyright (C) 2025-2026 OpenSensor Engineering and LightNVR contributors +# +# Canonical LightNVR HTTP API contract (OpenAPI 3.1, JSON Schema 2020-12). +# This root document only indexes operations; paths and schemas live in the +# fragments under docs/api/contracts/. Bundle/validate with the tooling from +# plan task T12 (scripts/quality/contracts.mjs); do not hand-edit generated +# outputs. +# +# COVERAGE IS PARTIAL. Only the Streams list/edit pilot and its read-only +# option dependencies are specified. Every other route is inventoried in +# quality/api-inventory.json and is NOT described by this file; absence of an +# operation here says nothing about its behavior. +openapi: 3.1.0 +jsonSchemaDialect: https://spec.openapis.org/oas/3.1/dialect/base +info: + title: LightNVR API + version: 0.1.0-pilot + summary: Streams list/edit pilot contract + description: >- + Specified from the C handlers in src/web (serialization and parsing code + read directly), not from prose documentation. Where the C behavior and the + UI or docs disagree, operation descriptions record the C wire behavior and + the disagreement is recorded as a discrepancy (D-xx in + quality/api-inventory.json) or a finding candidate (F-T11-xx in + quality/evidence/T11.md). Extension keywords (`x-lightnvr-*`) are + annotations: they never change validation results. The schemas additionally + enforce explicit client-input and response-redaction policies: they do not + claim that every currently accepted request or emitted response conforms. + Known violations are recorded in the fixtures and findings, with + expected_server_response separate from schema validity. + + Compatibility policy: response objects are open (unknown additional keys + are compatible) except where a schema states otherwise for redaction + reasons; request bodies are closed. Errors use `{"error": ""}`. + license: + name: GPL-3.0-or-later + identifier: GPL-3.0-or-later +servers: + - url: / + description: Same origin as the web UI. +tags: + - name: streams + description: Streams list and edit pilot. + - name: pilot-option-dependency + description: Read-only endpoints the Streams list/edit UI loads to populate options and gating. +security: + - sessionCookie: [] + - basicAuth: [] + - apiKey: [] + - bearerAuth: [] +x-lightnvr-coverage: + scope: streams-pilot + inventory: quality/api-inventory.json + specified_operations: + - GET /api/streams + - GET /api/streams/{name}/full + - PUT /api/streams/{name} + - GET /api/streams/{name}/zones + - GET /api/client-config + - GET /api/detection/models + - GET /api/auth/verify + inventoried_not_specified: + - GET /api/streams/{name} (unwrapped single stream; same object as /full .stream) + - POST /api/streams + - POST /api/streams/test + - DELETE /api/streams/{name} + - POST /api/streams/{name}/zones + - DELETE /api/streams/{name}/zones + - POST /api/streams/{name}/refresh + - all other routes in quality/api-inventory.json routes[] + partially_specified: + - operation: GET /api/streams + note: the legacy (non-summary) array is schema-described via LegacyStreamList but is out of pilot and not contract-tested. + - operation: PUT /api/streams/{name} + note: enable_disabled and set_privacy_mode are described because they share the operation, but their flows are out of pilot. +paths: + /api/streams: + $ref: './contracts/streams.yaml#/paths/~1api~1streams' + /api/streams/{name}/full: + $ref: './contracts/streams.yaml#/paths/~1api~1streams~1%7Bname%7D~1full' + /api/streams/{name}: + $ref: './contracts/streams.yaml#/paths/~1api~1streams~1%7Bname%7D' + /api/streams/{name}/zones: + $ref: './contracts/streams.yaml#/paths/~1api~1streams~1%7Bname%7D~1zones' + /api/client-config: + $ref: './contracts/streams.yaml#/paths/~1api~1client-config' + /api/detection/models: + $ref: './contracts/streams.yaml#/paths/~1api~1detection~1models' + /api/auth/verify: + $ref: './contracts/streams.yaml#/paths/~1api~1auth~1verify' +components: + securitySchemes: + sessionCookie: + type: apiKey + in: cookie + name: session + description: HttpOnly session cookie set by POST /api/auth/login. + basicAuth: + type: http + scheme: basic + apiKey: + type: apiKey + in: header + name: X-API-Key + description: API token (scoped tokens are accepted by the streams handlers but not by /api/auth/verify). + bearerAuth: + type: http + scheme: bearer + description: API token presented as a bearer credential. + x-lightnvr-anonymous-modes: >- + When web authentication is disabled every request is treated as an admin. + In demo mode an unauthenticated request is treated as a viewer + pseudo-user. Neither mode appears as a security requirement. diff --git a/quality/evidence/T11.md b/quality/evidence/T11.md new file mode 100644 index 000000000..436830e23 --- /dev/null +++ b/quality/evidence/T11.md @@ -0,0 +1,364 @@ +# T11 Evidence: Streams pilot contract specified from C behavior + +- Revision inspected: `27e4d57e` on `feat/engineering-foundation` (includes T2 `8d715d7f`; handlers unchanged since T2). +- Outputs: `docs/api/openapi.yaml` (root index), `docs/api/contracts/streams.yaml`, + `docs/api/contracts/common.yaml`, `tests/contracts/fixtures/streams/` (91 schema fixtures: + 39 valid, 52 known-invalid; `index.json` manifest; `path-encoding.cases.json`). +- C code and UI were only read. Every field below was checked against the JSON serialization or + parsing code in `src/web`, not against `docs/API.md`. + +## reason_not_testable + +This is a specification task. There is no contract validator or generator until T12, and no +C contract runner until T18, so a red/green TDD loop is not possible here. Evidence is a static +check (YAML parse, `$ref` resolution, 2020-12 meta-validation, and fixture validation with a +throwaway Python script), plus the field-to-source review tables below. T12 owns formal +validation. T12 must also confirm that every `expect: invalid` fixture fails under the selected +validator. + +## Validation + +| Check | Result | +|---|---| +| `python3 -c "import yaml; [yaml.safe_load(open(p)) for p in ('docs/api/openapi.yaml','docs/api/contracts/streams.yaml','docs/api/contracts/common.yaml')]"` | exit 0 | +| `$ref` resolution across all three files, including the Path Item refs from openapi.yaml | 178 refs, 0 unresolved | +| `Draft202012Validator.check_schema` on every component schema (jsonschema 4.26) | all valid | +| Fixture validation (jsonschema 4.26 + `referencing`, schemas resolved from the YAML files) | 91 checked, 0 failures | +| Each invalid fixture fails for its stated reason | reviewed manually: leaf errors match `violates` | +| All `pattern`s compile as ECMA-262 `u`-flag regexes (node + js-yaml from web/node_modules) and pass 17 boundary cases | 5/5 compiled, 0 mismatches; publish_url regex gave no backtracking on a 5 KB adversarial string | +| No `synthetic-pass*` value appears in a valid fixture for a non-configurer principal | pass | + +The scripts ran from the session scratchpad and are not committed. T12 owns the committed tooling. +One check depends on validator behavior. `put.eptz-wrong-projection.invalid.json` fails only when +`contentSchema` is enforced. In 2020-12, `contentSchema` is an annotation, so the validator +must decode `eptz_config` and check it against `EptzConfigV1` explicitly. My script did this. + +## Operations specified + +| Operation | Method/path | Handler | Statuses modelled | +|---|---|---|---| +| listStreams | GET /api/streams | handle_get_streams → handle_get_stream_summaries | 200 (admin/live/lpr pages, or legacy array), 400, 401, 500 | +| getStreamFull | GET /api/streams/{name}/full | handle_get_stream_full | 200 (configurable or live-only), 400, 401, 403, 404, 500 | +| updateStream | PUT /api/streams/{name} | handle_put_stream | 200 (set_privacy_mode), 202, 400, 401, 403, 404, 413, 500 | +| getStreamZones | GET /api/streams/{name}/zones | handle_get_zones | 200, 400, 401, 403, 404, 500 | +| getClientConfig | GET /api/client-config | handle_get_client_config | 200, 401, 500 | +| listDetectionModels | GET /api/detection/models | handle_get_detection_models | 200, 401, 403, 500 | +| verifyAuth | GET /api/auth/verify | handle_auth_verify | 200 (3 shapes), 401 | + +Routing was checked against `register_all_libuv_handlers()` (`src/web/libuv_api_handlers.c:111,255-258,220,262,295,310`). +The router is first-match, so `/api/streams/#/full` (L255) is registered before `/api/streams/#` (L256-258). +Out-of-pilot operations are listed under `x-lightnvr-coverage.inventoried_not_specified` in +openapi.yaml and are not specified. The legacy non-summary list is the exception: it is described +through `LegacyStreamList` because it shares the operation, but it is marked `x-lightnvr-pilot: false`. + +### Order of checks (from C) + +- `/full`: path decode (400 "Invalid request path"), then `get_stream_by_name` (404 "Stream not + found", which runs **before authentication**), then config read (500), then + `httpd_authorize_stream_action_with_context` (401 "Unauthorized", 404 "Camera not found", + 500 "Authorization policy evaluation failed", 403 "Forbidden"), then the variant chosen by + `stream_user_can_modify`. +- PUT: same order up to `check_stream_write_access` (camera.configure), then the body parse (400 + "Invalid JSON in request body"), then per-field validation in handler order. There are no + partial writes on a 4xx. +- summary: 401, then page/page_size, sort_by, sort_order, surface, availability (400 messages + recorded on each parameter), then per-row authorization. + +## Redaction modelling + +- **Separate schemas.** The summary rows (`StreamSummaryAdmin`, `StreamSummaryLive`, + `StreamSummaryLpr`) are separate from the detail object. The detail object has two variants: + `StreamDetailConfigurable` (admin edit model) and `StreamDetailLiveOnly` (viewer). Request + bodies are separate too: `StreamUpdateRequest` and `StreamPrivacyModeRequest`. Variant + selection is annotated with `x-lightnvr-response-variant-by-query` (surface) and + `x-lightnvr-response-variant-by-field` (`can_control_privacy`). +- **Viewer model.** The credential-bearing keys are `url`, `onvif_username`, `onvif_password`, + `admin_url`, `go2rtc_source_override`, `sub_stream_url`, `detection_url` and `publish_url`. + None of them is required. When one is present, the onvif and admin keys must equal `""` + (`EmptyString` const). `url` must be `ViewerSafeUrl`: it may not contain userinfo, and it may + not contain a non-empty query parameter whose name contains pass, pwd, token, secret or apikey. + `can_control_privacy` is const false. As a result, any leaked value fails validation. There is + one known-invalid fixture per sensitive key. +- **Admin model.** All sensitive keys are required, and `can_control_privacy` is const true. + When separate credentials are in use (isOnvif, or non-empty onvif_* fields), `url` must not + contain userinfo. This mirrors `get_stream_api_credentials`. +- **Summary rows.** `SummaryForbiddenSensitiveKeys` rejects `url`, `onvif_*`, + `sub_stream_url`, `detection_url`, `publish_url`, `go2rtc_source_override` and + `detection_api_url` whatever their value. `admin_url` must be `""` when + `can_configure:false`. Live rows must not contain `admin_url`. LPR rows are a closed object + with only identity fields. +- **Not hidden, by design (current behavior):** viewers can still read `has_sub_stream`, the + credential-free `url` host/path, `motion_trigger_source`, `detection_model` (which may be a + filesystem path), `onvif_profile` and `onvif_port`. + +## Semantics confirmed from C + +- **Retention is tri-state.** `-1` inherits the live global value, `0` means unlimited and also + skips tier expiry, and `1..365` is a day override. Sources: `include/core/config.h`, + `src/storage/storage_manager.c:556-563,1579-1584`, and the PUT range check at + `api_handlers_streams_modify.c:1512-1544`. `detection_retention_days=-1` inherits the + *global* value, not the stream's `retention_days`. The PUT check uses `valueint`, so a + fractional value is truncated before the range test. +- **Schedules** are 168 booleans indexed `tm_wday*24+tm_hour` in server local time, with + Sunday as 0 (`src/video/stream_manager.c:103-133`). +- **`detection_threshold`** is an integer percent on the wire: `(int)(float*100.0f)` on read + and `value/100.0` on write. +- **Numeric limits enforced by C:** retention fields (-1..365), summary page (1..1000000), + page_size (1..100), and the eptz document ranges. No other numeric field is range-checked. + Those fields are declared as int32 and carry `x-lightnvr-intended-range` annotations. +- **String byte limits** come from the `stream_config_t` buffers. Truncation is silent except + for detection_url and publish_url (413) and eptz_config (400). +- **Nullability.** The server never emits null. On PUT, null clears exactly seven fields: tags, + admin_url, motion_trigger_source, go2rtc_source_override, sub_stream_url, detection_url and + publish_url. A null on any other key is ignored. +- **Encoded names.** The route matches the encoded segment. The decode then maps `%XX` and maps + a literal `+` to a space. The encoded segment must be under 256 bytes. Dot segments are + rejected by the parser. New names must match `^[A-Za-z0-9_-][A-Za-z0-9._-]*$`, but legacy + names can contain anything. Cases are in `path-encoding.cases.json`. +- **Response headers.** Every JSON response carries `Cache-Control: no-cache, no-store, + must-revalidate`, `Pragma`, `Expires` and CORS headers (`http_response_set_json`). +- **Error envelope.** `{"error": ""}` from `http_response_set_json_error`. + +## Field-to-source review + +### Full detail (`GET /api/streams/{name}/full`) and PUT parsing + +| Field | Emitted (src/web/api_handlers_streams_get.c:handle_get_stream_full) | Live-only / configure | PUT parse (src/web/api_handlers_streams_modify.c:handle_put_stream) | Contract schema | +|---|---|---|---|---| +| `camera_uuid` | L1012 | same value | read-only | StreamDetailBase.camera_uuid | +| `location_uuid` | L1013 | same value | read-only | StreamDetailBase.location_uuid | +| `name` | L1014 | same value | read-only | StreamDetailBase.name | +| `url` | L1015 | credential-stripped ("" on strip failure) / raw unless separate creds | L1306 | StreamDetailBase.url | +| `enabled` | L1016 | same value | L1320 | StreamDetailBase.enabled | +| `streaming_enabled` | L1017 | same value | L1327 | StreamDetailBase.streaming_enabled | +| `playback_transport` | L1018 | same value | L1336 | StreamDetailBase.playback_transport | +| `eptz_config` | L1021 | same value | L1354 | StreamDetailBase.eptz_config | +| `width` | L1022 | same value | not accepted (auto-detected) | StreamDetailBase.width | +| `height` | L1023 | same value | not accepted (auto-detected) | StreamDetailBase.height | +| `fps` | L1024 | same value | not accepted (auto-detected) | StreamDetailBase.fps | +| `codec` | L1025 | same value | L1732 | StreamDetailBase.codec | +| `priority` | L1026 | same value | L1375 | StreamDetailBase.priority | +| `record` | L1027 | same value | L1382 | StreamDetailBase.record | +| `segment_duration` | L1028 | same value | L1393 | StreamDetailBase.segment_duration | +| `detection_based_recording` | L1031 | same value | L1400 | StreamDetailBase.detection_based_recording | +| `detection_model` | L1032 | same value | L1413 | StreamDetailBase.detection_model | +| `detection_threshold` | L1034 | same value | L1424 | StreamDetailBase.detection_threshold | +| `detection_interval` | L1035 | same value | L1434 | StreamDetailBase.detection_interval | +| `pre_detection_buffer` | L1036 | same value | L1443 | StreamDetailBase.pre_detection_buffer | +| `post_detection_buffer` | L1037 | same value | L1450 | StreamDetailBase.post_detection_buffer | +| `detection_object_filter` | L1038 | same value | L1457 | StreamDetailBase.detection_object_filter | +| `detection_object_filter_list` | L1039 | same value | L1463 | StreamDetailBase.detection_object_filter_list | +| `protocol` | L1040 | same value | L1715 | StreamDetailBase.protocol | +| `record_audio` | L1041 | same value | L1469 | StreamDetailBase.record_audio | +| `audio_voice_enhancement` | L1042 | same value | L1487 | StreamDetailBase.audio_voice_enhancement | +| `isOnvif` | L1043 | same value | L1921 | StreamDetailBase.isOnvif | +| `backchannel_enabled` | L1044 | same value | L1498 | StreamDetailBase.backchannel_enabled | +| `retention_days` | L1045 | same value | L1512 | StreamDetailBase.retention_days | +| `detection_retention_days` | L1046 | same value | L1529 | StreamDetailBase.detection_retention_days | +| `max_storage_mb` | L1047 | same value | L1546 | StreamDetailBase.max_storage_mb | +| `tier_critical_multiplier` | L1048 | same value | L1558 | StreamDetailBase.tier_critical_multiplier | +| `tier_important_multiplier` | L1049 | same value | L1568 | StreamDetailBase.tier_important_multiplier | +| `tier_ephemeral_multiplier` | L1050 | same value | L1578 | StreamDetailBase.tier_ephemeral_multiplier | +| `storage_priority` | L1051 | same value | L1588 | StreamDetailBase.storage_priority | +| `ptz_enabled` | L1052 | same value | L1599 | StreamDetailBase.ptz_enabled | +| `ptz_max_x` | L1053 | same value | L1611 | StreamDetailBase.ptz_max_x | +| `ptz_max_y` | L1054 | same value | L1621 | StreamDetailBase.ptz_max_y | +| `ptz_max_z` | L1055 | same value | L1631 | StreamDetailBase.ptz_max_z | +| `ptz_has_home` | L1056 | same value | L1641 | StreamDetailBase.ptz_has_home | +| `onvif_username` | L1057 | "" / real (or extracted from url) | L1965 | StreamDetailBase.onvif_username | +| `onvif_password` | L1058 | "" / real (or extracted from url) | L1966 | StreamDetailBase.onvif_password | +| `onvif_profile` | L1059 | same value | L1967 | StreamDetailBase.onvif_profile | +| `onvif_port` | L1060 | same value | L1938 | StreamDetailBase.onvif_port | +| `record_on_schedule` | L1061 | same value | L1652 | StreamDetailBase.record_on_schedule | +| `recording_schedule` | L1068 | same value | L1663 | StreamDetailBase.recording_schedule | +| `detection_record_on_schedule` | L1070 | same value | L1684 | StreamDetailBase.detection_record_on_schedule | +| `detection_recording_schedule` | L1078 | same value | L1696 | StreamDetailBase.detection_recording_schedule | +| `tags` | L1081 | same value | L1747 | StreamDetailBase.tags | +| `admin_url` | L1082 | "" / real | L1761 | StreamDetailBase.admin_url | +| `privacy_mode` | L1084 | same value | only via set_privacy_mode L2088 | StreamDetailBase.privacy_mode | +| `can_control_privacy` | L1085 | false / true | read-only | StreamDetailBase.can_control_privacy | +| `motion_trigger_source` | L1086 | same value | L1776 | StreamDetailBase.motion_trigger_source | +| `go2rtc_source_override` | L1087 | "" / real | L1794 | StreamDetailBase.go2rtc_source_override | +| `sub_stream_url` | L1089 | "" / real | L1821 | StreamDetailBase.sub_stream_url | +| `has_sub_stream` | L1091 | same value | read-only | StreamDetailBase.has_sub_stream | +| `detection_url` | L1093 | "" / real | L1844 | StreamDetailBase.detection_url | +| `publish_url` | L1095 | "" / real | L1884 | StreamDetailBase.publish_url | +| `status` | L1115 | same; summary_status + UDT fallback | read-only | StreamDetailBase.status | +| `error_message` | L1125 | same; only when status==Error | read-only | StreamDetailBase.error_message | +| `go2rtc_hls_available` | L1130 | same value | read-only | StreamDetailBase.go2rtc_hls_available | + +### Summary rows (`handle_get_stream_summaries`, src/web/api_handlers_streams_get.c) + +| Field | Line(s) | Surface | Contract schema | +|---|---|---|---| +| `camera_uuid` | L355 | lpr, admin, live | StreamSummaryBase.camera_uuid, StreamSummaryLpr.camera_uuid | +| `name` | L356 | lpr, admin, live | StreamSummaryBase.name, StreamSummaryLpr.name | +| `location_uuid` | L362 | admin, live | StreamSummaryBase.location_uuid | +| `location_name` | L363 | admin, live | StreamSummaryBase.location_name | +| `location_path` | L364 | admin, live | StreamSummaryBase.location_path | +| `enabled` | L365 | admin, live | StreamSummaryBase.enabled | +| `width` | L366 | admin, live | StreamSummaryBase.width | +| `height` | L367 | admin, live | StreamSummaryBase.height | +| `fps` | L368 | admin, live | StreamSummaryBase.fps | +| `codec` | L369 | admin, live | StreamSummaryBase.codec | +| `protocol` | L370 | admin, live | StreamSummaryBase.protocol | +| `record` | L371 | admin, live | StreamSummaryBase.record | +| `record_on_schedule` | L372 | admin, live | StreamSummaryBase.record_on_schedule | +| `detection_based_recording` | L374 | admin, live | StreamSummaryBase.detection_based_recording | +| `isOnvif` | L376 | admin, live | StreamSummaryBase.isOnvif | +| `tags` | L377 | admin, live | StreamSummaryBase.tags | +| `status` | L378 (summary_status) | admin, live | StreamSummaryBase.status | +| `availability` | L380 (fleet_availability_state_name) | admin, live | StreamSummaryBase.availability | +| `first_video_at` | L382 | admin, live | StreamSummaryBase.first_video_at | +| `last_frame_ts` | L384 | admin, live | StreamSummaryBase.last_frame_ts | +| `current_fps` | L386 | admin, live | StreamSummaryBase.current_fps | +| `recording_active` | L387 | admin, live | StreamSummaryBase.recording_active | +| `last_recording_at` | L389 | admin, live | StreamSummaryBase.last_recording_at | +| `can_configure` | L391 | admin, live | StreamSummaryBase.can_configure | +| `admin_url` | L394 | admin (include_admin_url) | StreamSummaryAdmin.admin_url | +| `streaming_enabled` | L398 | live | StreamSummaryLive.streaming_enabled | +| `playback_transport` | L401 | live | StreamSummaryLive.playback_transport | +| `eptz_config` | L404 | live | StreamSummaryLive.eptz_config | +| `detection_model` | L405 | live | StreamSummaryLive.detection_model | +| `privacy_mode` | L407 | live | StreamSummaryLive.privacy_mode | +| `can_control_privacy` | L408 | live | StreamSummaryLive.can_control_privacy | +| `has_sub_stream` | L410 | live | StreamSummaryLive.has_sub_stream | +| `ptz_enabled` | L412 | live | StreamSummaryLive.ptz_enabled | +| `backchannel_enabled` | L413 | live | StreamSummaryLive.backchannel_enabled | +| `go2rtc_hls_available` | L416 | live | StreamSummaryLive.go2rtc_hls_available | +| `total` | L421 | page envelope | SummaryPageMeta.total | +| `page` | L422 | page envelope | SummaryPageMeta.page | +| `page_size` | L423 | page envelope | SummaryPageMeta.page_size | +| `total_pages` | L424 | page envelope | SummaryPageMeta.total_pages | + +### Option dependencies + +| Schema field(s) | C source | +|---|---| +| ClientConfig: all 17 keys, all required | src/web/api_handlers_settings.c:handle_get_client_config L641-697 (`default_playback_transport` falls back to `auto` when invalid) | +| DetectionModelsResponse.models / litert_available / sod_available / count / message | src/web/api_handlers_detection_models.c:handle_get_detection_models L99-110, 166-177, 266 | +| DetectionModel id/name/path/type/supported/description (built-ins L118-160); unsupported_reason (L243-248, only if !supported); size (L252-254) | same file | +| 403 for principals without any camera.configure grant | same file L48-68 | +| AuthVerifyAuthDisabled / Authenticated / Demo, role names | src/web/api_handlers_auth_backend_agnostic.c:handle_auth_verify L575-655; src/database/db_auth.c:role_names | +| ZonesResponse / DetectionZone / ZonePoint | src/web/api_handlers_zones.c:handle_get_zones L68-98; include/database/db_zones.h (16 zones, 32 points, 64-byte id/name) | +| ErrorResponse | src/web/request_response.c:http_response_set_json_error L282 | +| 401/403/404 messages | src/web/httpd_utils.c:httpd_authorize_stream_action_with_context L789-845, httpd_authorize_action L629-657 | +| StreamNamePath decoding and limits | src/web/request_response.c:http_request_extract_path_param L194, url_decode L62; src/web/libuv_connection.c:on_url_complete, request_path_has_dot_segment | +| PUT 202/200 bodies | src/web/api_handlers_streams_modify.c L2123-2136 (200), L2195-2219 (202) | + +## T2 discrepancies re-checked against C + +| ID | Status in contract | +|---|---| +| D-01 `is_deleted` | Confirmed: `handle_put_stream` never reads it. `StreamUpdateRequest` is closed, so the UI's current payload fails (`put.is-deleted.invalid.json`). The server answers 202. | +| D-02 `detection_zones` | Confirmed: not emitted. Listed in `x-lightnvr-not-emitted`; zones are specified separately. | +| D-03 `error_message`/`playback_transport` | Confirmed: absent from admin summary rows (`x-lightnvr-not-emitted`). `playback_transport` appears only on live rows. | +| D-04 models 403 for viewers | Modelled as a 403 response, plus fixture `detection-models.403-viewer.valid.json`. | +| D-05 role vs per-camera gating | `can_configure` / `can_control_privacy` are documented as authoritative. | +| D-06 camelCase client-config | Snake_case only; camelCase fixture is invalid. | +| D-07 / D-08 routing and encoded names | Folded into `StreamNamePath` and the path cases. Extended by F-T11-08 and F-T11-09. | + +## New finding candidates (for the coordinator; quality/findings.json not edited) + +| ID | Kind | Severity (proposed) | Detail | Where | +|---|---|---|---|---| +| F-T11-01 | security/policy | medium | `/full`, GET `/{name}` and PUT return 404 "Stream not found" **before** authentication. An unauthenticated caller can therefore enumerate stream names (an unknown name gets 404, a known one gets 401). | api_handlers_streams_get.c:handle_get_stream_full L969-975; api_handlers_streams_modify.c:handle_put_stream L1262-1268 | +| F-T11-02 | docs | low | The `docs/API.md` streams example disagrees with the wire format. It wraps the legacy list as `{streams:[...]}` (the real response is a bare array), shows `detection_threshold: 0.5` (the wire uses integer percent), and uses `is_onvif` instead of `isOnvif`, `status: "connected"` (not in the enum), and `id`/`detection_api_url`, which are never emitted. | docs/API.md L411-455 | +| F-T11-03 | security/redaction | medium | Viewer URL redaction strips only userinfo (`url_strip_credentials`). Credentials passed as query parameters (for example `?user=admin&password=...`, a common camera URL form) reach live-only viewers in `/full`, GET `/{name}` and the legacy list. The contract's `ViewerSafeUrl` rejects such responses (fixture `full.live-only.url-query-secret.invalid.json`), so T18 with a query-credential camera **will fail until fixed**. That failure is intended. | api_handlers_streams_get.c:get_stream_api_credentials L96-104; src/core/url_utils.c:url_strip_credentials | +| F-T11-04 | validation | low | PUT accepts valid JSON that is not an object (`null`, `[]`, `1`) and answers 202. The only effect is that `isOnvif` is recomputed from the URL (F-T11-11). | handle_put_stream L1282-1287 | +| F-T11-05 | validation | medium | Wrong-typed PUT values are silently ignored (for example `"record":"true"`), and the client still gets 202 success with nothing changed. | handle_put_stream (every `cJSON_Is*` guard) | +| F-T11-06 | validation | medium | Only retention is range-checked. protocol (any int is cast to the enum), priority, segment_duration, detection_threshold, detection_interval, the buffers, max_storage_mb, storage_priority (the UI clamps it to 1..10), ptz_max_*, onvif_port and the tier multipliers accept any value. | handle_put_stream L1375-1726 | +| F-T11-07 | validation | low | A schedule array whose length is not 168 is silently ignored, and any entry that is not `true` is stored as false. | handle_put_stream L1663-1713 | +| F-T11-08 | routing | low | `/full` truncates the decoded name at its first '/'. A legacy name containing '/' (sent as `%2F`) therefore reads a *different* stream. Authorization is evaluated on that same truncated name, so this is wrong data rather than a bypass. | handle_get_stream_full L960-965 | +| F-T11-09 | routing | low | The 256-byte path-parameter limit is applied to the **entire encoded suffix**, including `/full` or `/zones`. The encoded-name maxima are therefore 255 bytes for PUT, 250 for `/full`, and 249 for zones. Long ASCII names and names with many non-ASCII bytes become unaddressable (400). | request_response.c:http_request_extract_path_param L211 | +| F-T11-10 | reliability | low | In the summary and legacy list, a single stream without a fleet inventory row makes the **whole** list return 500 "Authorization policy evaluation failed". | handle_get_stream_summaries L303-316; handle_get_streams L544-558 | +| F-T11-11 | semantics | medium | When `isOnvif` is omitted, PUT recomputes it as `strstr(url,"onvif")`. A partial PUT (for example `{tags:"x"}`) can therefore flip the ONVIF flag and trigger the ONVIF test and credential normalization. | handle_put_stream L1921-1935 | +| F-T11-12 | semantics | medium | `set_privacy_mode` is handled only after every other key has been parsed and validated. Before that point, `enable_disabled` has already run (a synchronous DB write plus a go2rtc reload) and the ONVIF test may already have run. The other edits are then discarded without notice. The handler returns 200 `success:true` even when the privacy DB update fails. | handle_put_stream L2013-2137 | +| F-T11-13 | auth/UI | low | In demo mode, an authenticated user's `/api/auth/verify` response omits `demo_mode`, so UI demo gating (`shouldHideCredentials`) does not apply. Server-side redaction is unaffected. | handle_auth_verify L600-623 | +| F-T11-14 | validation | medium | Over-long strings are silently truncated with a 202 response: url (511 bytes), tags, admin_url, sub_stream_url, go2rtc_source_override (8191), onvif_* (63), codec (15), motion_trigger_source, and the filter fields. `detection_model` is copied through a 256-byte temporary buffer although the stored field holds 511 bytes. Only detection_url and publish_url (413) and eptz_config (400) are rejected. | handle_put_stream L1306-1467, 1747-1840 | +| F-T11-15 | performance | low | For an ONVIF stream, PUT runs `test_onvif_connection` (network I/O) inline before the 202 response, on a libuv pool worker. Save latency therefore depends on the camera, while the UI applies a 15 s timeout with 1 retry. | handle_put_stream L1960-2011; libuv_connection.c uv_queue_work | +| F-T11-16 | precision (arithmetic reproduced) | low | Threshold round-trip: GET truncates `(int)(f*100.0f)`. Native arithmetic matching PUT/GET reproduces 53 → 52 and 59 → 58 for integer percentages 0..100. T18 must still verify the actual persistence/HTTP path. | handle_get_stream_full L1033; handle_put_stream L1429 | +| F-T11-17 | semantics | low | PUT has no "unchanged" sentinel for `onvif_password`: `""` clears the stored password when isOnvif is in effect. Clients that echo a redacted (`""`) value will erase credentials. The pilot UI is safe only because live-only users cannot PUT. | handle_put_stream L1969-1975 | + +## Fixtures (tests/contracts/fixtures/streams/) + +Fixture format: `{operation, direction, status, principal, request?, schema (relative to schema_base), expect, description|violates, expected_server_response?, body}`. +All values are synthetic: hosts are RFC 5737 addresses or `.invalid` domains, and credentials +are `synthetic-*`. They were chosen by hand and are not snapshots of server output. The +generator is a scratchpad script; the committed JSON is the reviewed artifact. + +- **Valid (39):** full.configurer.onvif, full.configurer.legacy-name-plain-credentials, full.live-only.redacted, full.live-only.sensitive-keys-absent, full.live-only.error-status, full.any.generic-schema; summary.admin.configurer-with-admin-url, summary.admin.viewer, summary.live.viewer, summary.lpr, summary.admin.page-beyond-end, summary.admin.empty; put.edit-form, put.retention-tristate, put.retention-finite-boundary, put.clear-with-null, put.schedule-weekday, put.publish-and-detection-url, put.empty-object, put.set-privacy-mode; put-response.202, put-response.202-onvif-failed, put-response.200-privacy; error.401, error.403-put-viewer, error.404-stream, error.404-camera, error.400-surface, error.400-retention, error.413-publish-url; client-config; detection-models, detection-models.no-directory, detection-models.403-viewer; auth-verify.user, auth-verify.auth-disabled, auth-verify.demo; zones, zones.empty. +- **Known-invalid (52):** + - Redaction leaks, one per sensitive key: live-only onvif_password, onvif_username, url-userinfo, url-username-only, url-query-secret, admin_url, sub_stream_url, detection_url, publish_url, go2rtc_override, claims-configure. + - Configurable variant: onvif-url-userinfo, missing-onvif-password. + - Detail shape: schedule-167, threshold-as-fraction, retention-below-inherit, retention-over-max, status-docs-value, error-message-without-error, protocol-out-of-enum, null-tags, unwrapped-object. + - Summary: contains-url, admin-url-without-configure, live contains-onvif-password, live contains-admin-url, lpr leaks-location, page-size-over-max, status-from-detail-enum, missing-can-configure. + - PUT bodies (each records `expected_server_response`): is-deleted, name-in-body, retention-366, detection-retention-minus-2, detection-url-file-scheme, detection-url-too-long, publish-url-http, publish-url-quote, playback-transport-bogus, eptz-wrong-projection, eptz-not-string, schedule-wrong-length, record-as-string, protocol-out-of-enum, privacy-mixed-with-edit, tags-too-long. + - Other: put-response onvif-status-without-message, error message-key, error empty-message, client-config camelcase-only, detection-models unsupported-without-reason, auth-verify demo-as-admin. +- `path-encoding.cases.json`: 15 path-encoding cases for T18 and T19. These are not schema fixtures. + +## Notes for downstream tasks + +- **T12 (dialect and refs).** The root uses `openapi: 3.1.0` with `jsonSchemaDialect` set to the + OAS 3.1 base dialect. Paths are Path Item `$ref`s into `contracts/streams.yaml`, with `{`/`}` + percent-encoded in the fragment (`~1%7Bname%7D`). Schemas use relative refs + (`./common.yaml#/...`) resolved against each fragment's own location. The fragments are not + standalone OpenAPI documents; each has only top-level `paths` and/or `components`. Bundle with + a resolver that supports Path Item refs (for example redocly or + @apidevtools/json-schema-ref-parser) before running openapi-typescript. +- **T12 (keywords that need care).** + - `const`, `if`/`then`, `not`, `dependentRequired` and `contentMediaType`/`contentSchema` are + used. `contentSchema` must be enforced explicitly for `eptz_config`. + - Type arrays are used for nullable request fields (`[string, 'null']`). + - `oneOf` without a `discriminator`: OpenAPI discriminators cannot map boolean const values. + - `anyOf` covers the surface-dependent list response. + - Patterns are ECMA-262 compatible and verified with the `u` flag. + - `maxLength` counts code points, while C limits are bytes (`x-lightnvr-max-bytes`). + - The `x-lightnvr-response-variant-by-query` and `-by-field` annotations tell the generator + which concrete schema to validate per surface or variant. Generate standalone validators + for the variant schemas, not only for the anyOf/oneOf unions. + - Expect openapi-typescript to emit `never`-ish types for `not: {required: [...]}`. That is + acceptable for sensitive-key exclusion. +- **T12 (policy).** Response objects are open except for the LPR rows and the explicit + sensitive-key exclusions. Request bodies are closed. +- **T18.** Use `expected_server_response` on the request fixtures, not `expect`. The + invalid-request fixtures describe bodies the contract forbids, and several of them are + accepted with 202 by the current C code (F-T11-05/06/07/14, D-01). Expect + `url-query-secret` to reproduce F-T11-03. +- **T19.** Encode names with `encodeURIComponent` (never a raw `+`). Treat 202 as "accepted", + not "persisted". Select the detail variant by `can_control_privacy`. + +## Resumed T11 verification (2026-10-31) + +Independently re-read the auth, list, detail, PUT, path-decoding, zones, option, +and URL-redaction implementation. No application code changed. Corrected the +root introduction to distinguish observed server behavior from explicit +client-input/redaction policy, corrected the encoded path limit (the helper +counts `/full` and `/zones` too), and corrected the page-number description +(`strtol` accepts leading whitespace and `+`). Added four concrete path boundary +cases. Refined F-T11-16 from suspected to arithmetic reproduced, using the +actual double-to-float PUT expression and float-to-int GET expression. + +Reproducible local static-check artifacts are retained under the ignored +`build/eng-artifacts/T11/` directory. These are specification review aids, not +the production generator owned by T12: + +- `python3 build/eng-artifacts/T11/verify-spec.py`: 178 local references + resolved; all 53 component schemas pass Draft 2020-12 meta-validation; all + 91 fixtures match their manifest expectation (39 valid, 52 invalid); 15 + path cases. Uses installed PyYAML/jsonschema/referencing, no network access. + The validator explicitly applies contentSchema to nonempty JSON text; empty + eptz_config means disabled. It does not claim byte-length enforcement. +- `cc build/eng-artifacts/T11/threshold-roundtrip.c -o + build/eng-artifacts/T11/threshold-roundtrip` then the resulting executable: + of integer percentages 0..100, 53 reads as 52 and 59 reads as 58. This is + isolated arithmetic evidence, not a running-server contract test. + +Additional independent checks: all five patterns compile with the ECMA-262 +`u` flag; all 59 scalar keys emitted by `handle_get_stream_full` are declared +in StreamDetailBase; all seven specified paths exist in the C route table. + +T12 remains responsible for committed deterministic validation tooling, byte +limits and JSON-in-string validation. T18 remains responsible for running C +handlers, permission/side-effect assertions, and checking findings against the +server. No known finding is waived by this specification task. diff --git a/tests/contracts/fixtures/streams/auth-verify.auth-disabled.valid.json b/tests/contracts/fixtures/streams/auth-verify.auth-disabled.valid.json new file mode 100644 index 000000000..cb0a925e7 --- /dev/null +++ b/tests/contracts/fixtures/streams/auth-verify.auth-disabled.valid.json @@ -0,0 +1,20 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "verifyAuth", + "direction": "response", + "status": 200, + "principal": "anonymous_auth_disabled", + "schema": "streams.yaml#/components/schemas/AuthVerifyResponse", + "expect": "valid", + "body": { + "authenticated": true, + "username": "admin", + "role": "admin", + "must_change_password": false, + "auth_enabled": false, + "auth_timeout_hours": 24, + "auth_absolute_timeout_hours": 168, + "trusted_device_days": 30 + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/auth-verify.demo-as-admin.invalid.json b/tests/contracts/fixtures/streams/auth-verify.demo-as-admin.invalid.json new file mode 100644 index 000000000..d17a273f4 --- /dev/null +++ b/tests/contracts/fixtures/streams/auth-verify.demo-as-admin.invalid.json @@ -0,0 +1,18 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "verifyAuth", + "direction": "response", + "status": 200, + "principal": "anonymous_demo", + "schema": "streams.yaml#/components/schemas/AuthVerifyResponse", + "expect": "invalid", + "violates": "demo-mode anonymous principal is always a viewer", + "body": { + "authenticated": false, + "demo_mode": true, + "username": "demo", + "role": "admin", + "must_change_password": false + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/auth-verify.demo.valid.json b/tests/contracts/fixtures/streams/auth-verify.demo.valid.json new file mode 100644 index 000000000..429532074 --- /dev/null +++ b/tests/contracts/fixtures/streams/auth-verify.demo.valid.json @@ -0,0 +1,17 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "verifyAuth", + "direction": "response", + "status": 200, + "principal": "anonymous_demo", + "schema": "streams.yaml#/components/schemas/AuthVerifyResponse", + "expect": "valid", + "body": { + "authenticated": false, + "demo_mode": true, + "username": "demo", + "role": "viewer", + "must_change_password": false + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/auth-verify.user.valid.json b/tests/contracts/fixtures/streams/auth-verify.user.valid.json new file mode 100644 index 000000000..e0468480d --- /dev/null +++ b/tests/contracts/fixtures/streams/auth-verify.user.valid.json @@ -0,0 +1,25 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "verifyAuth", + "direction": "response", + "status": 200, + "principal": "viewer_user", + "schema": "streams.yaml#/components/schemas/AuthVerifyResponse", + "expect": "valid", + "body": { + "authenticated": true, + "id": 7, + "username": "synthetic-viewer", + "email": "", + "role": "viewer", + "role_id": 2, + "is_active": true, + "password_change_locked": false, + "must_change_password": false, + "auth_enabled": true, + "auth_timeout_hours": 24, + "auth_absolute_timeout_hours": 168, + "trusted_device_days": 30 + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/client-config.camelcase-only.invalid.json b/tests/contracts/fixtures/streams/client-config.camelcase-only.invalid.json new file mode 100644 index 000000000..57f537af3 --- /dev/null +++ b/tests/contracts/fixtures/streams/client-config.camelcase-only.invalid.json @@ -0,0 +1,30 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "getClientConfig", + "direction": "response", + "status": 200, + "principal": "live_viewer", + "schema": "streams.yaml#/components/schemas/ClientConfig", + "expect": "invalid", + "violates": "snake_case keys only (D-06); defaultPlaybackTransport is not emitted", + "body": { + "go2rtc_enabled": true, + "web_auth_enabled": true, + "demo_mode": false, + "audio_disabled": false, + "auto_disabled": false, + "go2rtc_available": true, + "go2rtc_api_port": 1984, + "go2rtc_base_path": "/go2rtc", + "webrtc_disabled": false, + "hls_disabled": false, + "mse_disabled": false, + "go2rtc_force_native_hls": false, + "webrtc_connection_timeout_ms": 15000, + "webrtc_ice_recovery_timeout_ms": 10000, + "generate_thumbnails": true, + "thumbnails_per_recording": 3, + "defaultPlaybackTransport": "auto" + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/client-config.valid.json b/tests/contracts/fixtures/streams/client-config.valid.json new file mode 100644 index 000000000..cecdc19a4 --- /dev/null +++ b/tests/contracts/fixtures/streams/client-config.valid.json @@ -0,0 +1,29 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "getClientConfig", + "direction": "response", + "status": 200, + "principal": "live_viewer", + "schema": "streams.yaml#/components/schemas/ClientConfig", + "expect": "valid", + "body": { + "go2rtc_enabled": true, + "web_auth_enabled": true, + "demo_mode": false, + "audio_disabled": false, + "auto_disabled": false, + "go2rtc_available": true, + "go2rtc_api_port": 1984, + "go2rtc_base_path": "/go2rtc", + "webrtc_disabled": false, + "hls_disabled": false, + "mse_disabled": false, + "default_playback_transport": "auto", + "go2rtc_force_native_hls": false, + "webrtc_connection_timeout_ms": 15000, + "webrtc_ice_recovery_timeout_ms": 10000, + "generate_thumbnails": true, + "thumbnails_per_recording": 3 + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/detection-models.403-viewer.valid.json b/tests/contracts/fixtures/streams/detection-models.403-viewer.valid.json new file mode 100644 index 000000000..8d49b6152 --- /dev/null +++ b/tests/contracts/fixtures/streams/detection-models.403-viewer.valid.json @@ -0,0 +1,14 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "listDetectionModels", + "direction": "response", + "status": 403, + "principal": "live_viewer", + "schema": "common.yaml#/components/schemas/ErrorResponse", + "expect": "valid", + "description": "Viewers without any camera.configure grant (D-04).", + "body": { + "error": "Forbidden" + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/detection-models.no-directory.valid.json b/tests/contracts/fixtures/streams/detection-models.no-directory.valid.json new file mode 100644 index 000000000..e56509a63 --- /dev/null +++ b/tests/contracts/fixtures/streams/detection-models.no-directory.valid.json @@ -0,0 +1,42 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "listDetectionModels", + "direction": "response", + "status": 200, + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/DetectionModelsResponse", + "expect": "valid", + "body": { + "models": [ + { + "id": "motion", + "name": "Built-in Motion Detection", + "path": "motion", + "type": "builtin", + "supported": true, + "description": "Built-in motion detection" + }, + { + "id": "api-detection", + "name": "API Detection", + "path": "api-detection", + "type": "api", + "supported": true, + "description": "External API-based object detection" + }, + { + "id": "onvif", + "name": "ONVIF Motion Events", + "path": "onvif", + "type": "onvif", + "supported": true, + "description": "ONVIF camera motion events detection" + } + ], + "litert_available": false, + "sod_available": true, + "message": "Models directory does not exist", + "count": 3 + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/detection-models.unsupported-without-reason.invalid.json b/tests/contracts/fixtures/streams/detection-models.unsupported-without-reason.invalid.json new file mode 100644 index 000000000..3d0042b73 --- /dev/null +++ b/tests/contracts/fixtures/streams/detection-models.unsupported-without-reason.invalid.json @@ -0,0 +1,49 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "listDetectionModels", + "direction": "response", + "status": 200, + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/DetectionModelsResponse", + "expect": "invalid", + "violates": "supported:false requires unsupported_reason", + "body": { + "models": [ + { + "id": "motion", + "name": "Built-in Motion Detection", + "path": "motion", + "type": "builtin", + "supported": true, + "description": "Built-in motion detection" + }, + { + "id": "api-detection", + "name": "API Detection", + "path": "api-detection", + "type": "api", + "supported": true, + "description": "External API-based object detection" + }, + { + "id": "onvif", + "name": "ONVIF Motion Events", + "path": "onvif", + "type": "onvif", + "supported": true, + "description": "ONVIF camera motion events detection" + }, + { + "id": "/m/x.sod", + "name": "x.sod", + "path": "/m/x.sod", + "type": "sod", + "supported": false + } + ], + "litert_available": false, + "sod_available": false, + "count": 4 + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/detection-models.valid.json b/tests/contracts/fixtures/streams/detection-models.valid.json new file mode 100644 index 000000000..6fc7470a2 --- /dev/null +++ b/tests/contracts/fixtures/streams/detection-models.valid.json @@ -0,0 +1,51 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "listDetectionModels", + "direction": "response", + "status": 200, + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/DetectionModelsResponse", + "expect": "valid", + "description": "Built-ins plus one unsupported TFLite file in a build without LiteRT.", + "body": { + "models": [ + { + "id": "motion", + "name": "Built-in Motion Detection", + "path": "motion", + "type": "builtin", + "supported": true, + "description": "Built-in motion detection" + }, + { + "id": "api-detection", + "name": "API Detection", + "path": "api-detection", + "type": "api", + "supported": true, + "description": "External API-based object detection" + }, + { + "id": "onvif", + "name": "ONVIF Motion Events", + "path": "onvif", + "type": "onvif", + "supported": true, + "description": "ONVIF camera motion events detection" + }, + { + "id": "/var/lib/lightnvr/models/synthetic.tflite", + "name": "synthetic.tflite", + "path": "/var/lib/lightnvr/models/synthetic.tflite", + "type": "tflite", + "supported": false, + "unsupported_reason": "This build has no in-process LiteRT engine (rebuild with -DENABLE_LITERT=ON and the third_party/litert submodule initialized)", + "size": 4194304 + } + ], + "litert_available": false, + "sod_available": false, + "count": 4 + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/error.400-retention.valid.json b/tests/contracts/fixtures/streams/error.400-retention.valid.json new file mode 100644 index 000000000..aaee92f56 --- /dev/null +++ b/tests/contracts/fixtures/streams/error.400-retention.valid.json @@ -0,0 +1,12 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "direction": "response", + "status": 400, + "principal": "configurer", + "schema": "common.yaml#/components/schemas/ErrorResponse", + "expect": "valid", + "body": { + "error": "retention_days must be between -1 and 365" + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/error.400-surface.valid.json b/tests/contracts/fixtures/streams/error.400-surface.valid.json new file mode 100644 index 000000000..a606e1073 --- /dev/null +++ b/tests/contracts/fixtures/streams/error.400-surface.valid.json @@ -0,0 +1,12 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "direction": "response", + "status": 400, + "principal": "live_viewer", + "schema": "common.yaml#/components/schemas/ErrorResponse", + "expect": "valid", + "body": { + "error": "surface must be admin, live or lpr" + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/error.401.valid.json b/tests/contracts/fixtures/streams/error.401.valid.json new file mode 100644 index 000000000..6eaf5903a --- /dev/null +++ b/tests/contracts/fixtures/streams/error.401.valid.json @@ -0,0 +1,12 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "direction": "response", + "status": 401, + "principal": "anonymous", + "schema": "common.yaml#/components/schemas/ErrorResponse", + "expect": "valid", + "body": { + "error": "Unauthorized" + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/error.403-put-viewer.valid.json b/tests/contracts/fixtures/streams/error.403-put-viewer.valid.json new file mode 100644 index 000000000..d466cce27 --- /dev/null +++ b/tests/contracts/fixtures/streams/error.403-put-viewer.valid.json @@ -0,0 +1,12 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "direction": "response", + "status": 403, + "principal": "live_viewer", + "schema": "common.yaml#/components/schemas/ErrorResponse", + "expect": "valid", + "body": { + "error": "Forbidden" + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/error.404-camera.valid.json b/tests/contracts/fixtures/streams/error.404-camera.valid.json new file mode 100644 index 000000000..e45a14a61 --- /dev/null +++ b/tests/contracts/fixtures/streams/error.404-camera.valid.json @@ -0,0 +1,12 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "direction": "response", + "status": 404, + "principal": "configurer", + "schema": "common.yaml#/components/schemas/ErrorResponse", + "expect": "valid", + "body": { + "error": "Camera not found" + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/error.404-stream.valid.json b/tests/contracts/fixtures/streams/error.404-stream.valid.json new file mode 100644 index 000000000..250559e50 --- /dev/null +++ b/tests/contracts/fixtures/streams/error.404-stream.valid.json @@ -0,0 +1,12 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "direction": "response", + "status": 404, + "principal": "anonymous", + "schema": "common.yaml#/components/schemas/ErrorResponse", + "expect": "valid", + "body": { + "error": "Stream not found" + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/error.413-publish-url.valid.json b/tests/contracts/fixtures/streams/error.413-publish-url.valid.json new file mode 100644 index 000000000..8455ce3b4 --- /dev/null +++ b/tests/contracts/fixtures/streams/error.413-publish-url.valid.json @@ -0,0 +1,12 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "direction": "response", + "status": 413, + "principal": "configurer", + "schema": "common.yaml#/components/schemas/ErrorResponse", + "expect": "valid", + "body": { + "error": "publish_url exceeds size limit" + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/error.empty-message.invalid.json b/tests/contracts/fixtures/streams/error.empty-message.invalid.json new file mode 100644 index 000000000..b27699f67 --- /dev/null +++ b/tests/contracts/fixtures/streams/error.empty-message.invalid.json @@ -0,0 +1,13 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "direction": "response", + "status": 400, + "principal": "configurer", + "schema": "common.yaml#/components/schemas/ErrorResponse", + "expect": "invalid", + "violates": "error message is non-empty", + "body": { + "error": "" + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/error.message-key.invalid.json b/tests/contracts/fixtures/streams/error.message-key.invalid.json new file mode 100644 index 000000000..cc27e62ba --- /dev/null +++ b/tests/contracts/fixtures/streams/error.message-key.invalid.json @@ -0,0 +1,13 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "direction": "response", + "status": 400, + "principal": "configurer", + "schema": "common.yaml#/components/schemas/ErrorResponse", + "expect": "invalid", + "violates": "error envelope key is 'error'", + "body": { + "message": "Invalid JSON in request body" + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/full.any.generic-schema.valid.json b/tests/contracts/fixtures/streams/full.any.generic-schema.valid.json new file mode 100644 index 000000000..e9f7f7856 --- /dev/null +++ b/tests/contracts/fixtures/streams/full.any.generic-schema.valid.json @@ -0,0 +1,413 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "getStreamFull", + "direction": "response", + "status": 200, + "principal": "live_viewer", + "schema": "streams.yaml#/components/schemas/StreamFullResponse", + "expect": "valid", + "description": "The operation-level oneOf accepts the live-only variant.", + "body": { + "stream": { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "name": "front-door", + "enabled": true, + "streaming_enabled": true, + "playback_transport": "auto", + "eptz_config": "", + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "priority": 5, + "record": true, + "segment_duration": 900, + "detection_based_recording": false, + "detection_model": "motion", + "detection_threshold": 50, + "detection_interval": 10, + "pre_detection_buffer": 5, + "post_detection_buffer": 10, + "detection_object_filter": "none", + "detection_object_filter_list": "", + "protocol": 0, + "record_audio": true, + "audio_voice_enhancement": false, + "isOnvif": true, + "backchannel_enabled": false, + "retention_days": -1, + "detection_retention_days": 0, + "max_storage_mb": 0, + "tier_critical_multiplier": 3, + "tier_important_multiplier": 2, + "tier_ephemeral_multiplier": 0.25, + "storage_priority": 5, + "ptz_enabled": false, + "ptz_max_x": 0, + "ptz_max_y": 0, + "ptz_max_z": 0, + "ptz_has_home": false, + "onvif_profile": "Profile_1", + "onvif_port": 0, + "record_on_schedule": true, + "recording_schedule": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ], + "detection_record_on_schedule": false, + "detection_recording_schedule": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "tags": "outdoor,entrance", + "privacy_mode": false, + "motion_trigger_source": "", + "has_sub_stream": true, + "status": "Running", + "go2rtc_hls_available": false, + "url": "rtsp://192.0.2.10:554/Streaming/Channels/101", + "onvif_username": "", + "onvif_password": "", + "admin_url": "", + "go2rtc_source_override": "", + "sub_stream_url": "", + "detection_url": "", + "publish_url": "", + "can_control_privacy": false + } + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/full.configurer.legacy-name-plain-credentials.valid.json b/tests/contracts/fixtures/streams/full.configurer.legacy-name-plain-credentials.valid.json new file mode 100644 index 000000000..787adf9b2 --- /dev/null +++ b/tests/contracts/fixtures/streams/full.configurer.legacy-name-plain-credentials.valid.json @@ -0,0 +1,417 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "getStreamFull", + "direction": "response", + "status": 200, + "principal": "configurer", + "request": { + "method": "GET", + "path": "/api/streams/Garage%20Cam/full" + }, + "schema": "streams.yaml#/components/schemas/StreamFullResponseConfigurable", + "expect": "valid", + "description": "Legacy name with a space (percent-encoded in the path). Non-ONVIF camera without separate credentials: configurers receive the raw URL including userinfo (current behavior). Finite retention 30/14 days.", + "body": { + "stream": { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "name": "Garage Cam", + "enabled": true, + "streaming_enabled": true, + "playback_transport": "webrtc_then_mse", + "eptz_config": "", + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "priority": 5, + "record": true, + "segment_duration": 900, + "detection_based_recording": false, + "detection_model": "motion", + "detection_threshold": 50, + "detection_interval": 10, + "pre_detection_buffer": 5, + "post_detection_buffer": 10, + "detection_object_filter": "none", + "detection_object_filter_list": "", + "protocol": 0, + "record_audio": true, + "audio_voice_enhancement": false, + "isOnvif": false, + "backchannel_enabled": false, + "retention_days": 30, + "detection_retention_days": 14, + "max_storage_mb": 0, + "tier_critical_multiplier": 3, + "tier_important_multiplier": 2, + "tier_ephemeral_multiplier": 0.25, + "storage_priority": 5, + "ptz_enabled": false, + "ptz_max_x": 0, + "ptz_max_y": 0, + "ptz_max_z": 0, + "ptz_has_home": false, + "onvif_profile": "", + "onvif_port": 0, + "record_on_schedule": false, + "recording_schedule": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "detection_record_on_schedule": false, + "detection_recording_schedule": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "tags": "outdoor,entrance", + "privacy_mode": false, + "motion_trigger_source": "", + "has_sub_stream": false, + "status": "Running", + "go2rtc_hls_available": false, + "url": "rtsp://synthetic-user:synthetic-pass-2@192.0.2.20:554/live", + "onvif_username": "", + "onvif_password": "", + "admin_url": "", + "go2rtc_source_override": "- rtsp://192.0.2.20:554/live\n- ffmpeg:Garage Cam#video=h264", + "sub_stream_url": "", + "detection_url": "rtsp://192.0.2.20:554/sub", + "publish_url": "rtmp://live.example.invalid/app/key1, rtmps://live2.example.invalid/app/key2", + "can_control_privacy": true + } + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/full.configurer.missing-onvif-password.invalid.json b/tests/contracts/fixtures/streams/full.configurer.missing-onvif-password.invalid.json new file mode 100644 index 000000000..08f66f6f3 --- /dev/null +++ b/tests/contracts/fixtures/streams/full.configurer.missing-onvif-password.invalid.json @@ -0,0 +1,412 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "getStreamFull", + "direction": "response", + "status": 200, + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamFullResponseConfigurable", + "expect": "invalid", + "violates": "configurable variant always carries every sensitive key", + "body": { + "stream": { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "name": "front-door", + "enabled": true, + "streaming_enabled": true, + "playback_transport": "auto", + "eptz_config": "", + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "priority": 5, + "record": true, + "segment_duration": 900, + "detection_based_recording": false, + "detection_model": "motion", + "detection_threshold": 50, + "detection_interval": 10, + "pre_detection_buffer": 5, + "post_detection_buffer": 10, + "detection_object_filter": "none", + "detection_object_filter_list": "", + "protocol": 0, + "record_audio": true, + "audio_voice_enhancement": false, + "isOnvif": true, + "backchannel_enabled": false, + "retention_days": -1, + "detection_retention_days": 0, + "max_storage_mb": 0, + "tier_critical_multiplier": 3, + "tier_important_multiplier": 2, + "tier_ephemeral_multiplier": 0.25, + "storage_priority": 5, + "ptz_enabled": false, + "ptz_max_x": 0, + "ptz_max_y": 0, + "ptz_max_z": 0, + "ptz_has_home": false, + "onvif_profile": "Profile_1", + "onvif_port": 0, + "record_on_schedule": true, + "recording_schedule": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ], + "detection_record_on_schedule": false, + "detection_recording_schedule": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "tags": "outdoor,entrance", + "privacy_mode": false, + "motion_trigger_source": "", + "has_sub_stream": true, + "status": "Running", + "go2rtc_hls_available": false, + "url": "rtsp://192.0.2.10:554/Streaming/Channels/101", + "onvif_username": "synthetic-user", + "admin_url": "http://192.0.2.10/", + "go2rtc_source_override": "", + "sub_stream_url": "rtsp://192.0.2.10:554/Streaming/Channels/102", + "detection_url": "", + "publish_url": "", + "can_control_privacy": true + } + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/full.configurer.onvif-url-userinfo.invalid.json b/tests/contracts/fixtures/streams/full.configurer.onvif-url-userinfo.invalid.json new file mode 100644 index 000000000..0ecd5a616 --- /dev/null +++ b/tests/contracts/fixtures/streams/full.configurer.onvif-url-userinfo.invalid.json @@ -0,0 +1,413 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "getStreamFull", + "direction": "response", + "status": 200, + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamFullResponseConfigurable", + "expect": "invalid", + "violates": "with separate ONVIF credentials the server strips userinfo from url", + "body": { + "stream": { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "name": "front-door", + "enabled": true, + "streaming_enabled": true, + "playback_transport": "auto", + "eptz_config": "", + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "priority": 5, + "record": true, + "segment_duration": 900, + "detection_based_recording": false, + "detection_model": "motion", + "detection_threshold": 50, + "detection_interval": 10, + "pre_detection_buffer": 5, + "post_detection_buffer": 10, + "detection_object_filter": "none", + "detection_object_filter_list": "", + "protocol": 0, + "record_audio": true, + "audio_voice_enhancement": false, + "isOnvif": true, + "backchannel_enabled": false, + "retention_days": -1, + "detection_retention_days": 0, + "max_storage_mb": 0, + "tier_critical_multiplier": 3, + "tier_important_multiplier": 2, + "tier_ephemeral_multiplier": 0.25, + "storage_priority": 5, + "ptz_enabled": false, + "ptz_max_x": 0, + "ptz_max_y": 0, + "ptz_max_z": 0, + "ptz_has_home": false, + "onvif_profile": "Profile_1", + "onvif_port": 0, + "record_on_schedule": true, + "recording_schedule": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ], + "detection_record_on_schedule": false, + "detection_recording_schedule": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "tags": "outdoor,entrance", + "privacy_mode": false, + "motion_trigger_source": "", + "has_sub_stream": true, + "status": "Running", + "go2rtc_hls_available": false, + "url": "rtsp://synthetic-user:synthetic-pass-1@192.0.2.10:554/live", + "onvif_username": "synthetic-user", + "onvif_password": "synthetic-pass-1", + "admin_url": "http://192.0.2.10/", + "go2rtc_source_override": "", + "sub_stream_url": "rtsp://192.0.2.10:554/Streaming/Channels/102", + "detection_url": "", + "publish_url": "", + "can_control_privacy": true + } + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/full.configurer.onvif.valid.json b/tests/contracts/fixtures/streams/full.configurer.onvif.valid.json new file mode 100644 index 000000000..5d3c5ce50 --- /dev/null +++ b/tests/contracts/fixtures/streams/full.configurer.onvif.valid.json @@ -0,0 +1,417 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "getStreamFull", + "direction": "response", + "status": 200, + "principal": "configurer", + "request": { + "method": "GET", + "path": "/api/streams/front-door/full" + }, + "schema": "streams.yaml#/components/schemas/StreamFullResponseConfigurable", + "expect": "valid", + "description": "ONVIF camera seen by a camera.configure principal: url has no userinfo, credentials surface via onvif_* fields; retention inherits (-1), detection retention unlimited (0); weekday 08-18 schedule.", + "body": { + "stream": { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "name": "front-door", + "enabled": true, + "streaming_enabled": true, + "playback_transport": "auto", + "eptz_config": "", + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "priority": 5, + "record": true, + "segment_duration": 900, + "detection_based_recording": false, + "detection_model": "motion", + "detection_threshold": 50, + "detection_interval": 10, + "pre_detection_buffer": 5, + "post_detection_buffer": 10, + "detection_object_filter": "none", + "detection_object_filter_list": "", + "protocol": 0, + "record_audio": true, + "audio_voice_enhancement": false, + "isOnvif": true, + "backchannel_enabled": false, + "retention_days": -1, + "detection_retention_days": 0, + "max_storage_mb": 0, + "tier_critical_multiplier": 3, + "tier_important_multiplier": 2, + "tier_ephemeral_multiplier": 0.25, + "storage_priority": 5, + "ptz_enabled": false, + "ptz_max_x": 0, + "ptz_max_y": 0, + "ptz_max_z": 0, + "ptz_has_home": false, + "onvif_profile": "Profile_1", + "onvif_port": 0, + "record_on_schedule": true, + "recording_schedule": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ], + "detection_record_on_schedule": false, + "detection_recording_schedule": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "tags": "outdoor,entrance", + "privacy_mode": false, + "motion_trigger_source": "", + "has_sub_stream": true, + "status": "Running", + "go2rtc_hls_available": false, + "url": "rtsp://192.0.2.10:554/Streaming/Channels/101", + "onvif_username": "synthetic-user", + "onvif_password": "synthetic-pass-1", + "admin_url": "http://192.0.2.10/", + "go2rtc_source_override": "", + "sub_stream_url": "rtsp://192.0.2.10:554/Streaming/Channels/102", + "detection_url": "", + "publish_url": "", + "can_control_privacy": true + } + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/full.error-message-without-error.invalid.json b/tests/contracts/fixtures/streams/full.error-message-without-error.invalid.json new file mode 100644 index 000000000..5c4f9189b --- /dev/null +++ b/tests/contracts/fixtures/streams/full.error-message-without-error.invalid.json @@ -0,0 +1,414 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "getStreamFull", + "direction": "response", + "status": 200, + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamFullResponseConfigurable", + "expect": "invalid", + "violates": "error_message is only emitted when status is Error", + "body": { + "stream": { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "name": "front-door", + "enabled": true, + "streaming_enabled": true, + "playback_transport": "auto", + "eptz_config": "", + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "priority": 5, + "record": true, + "segment_duration": 900, + "detection_based_recording": false, + "detection_model": "motion", + "detection_threshold": 50, + "detection_interval": 10, + "pre_detection_buffer": 5, + "post_detection_buffer": 10, + "detection_object_filter": "none", + "detection_object_filter_list": "", + "protocol": 0, + "record_audio": true, + "audio_voice_enhancement": false, + "isOnvif": true, + "backchannel_enabled": false, + "retention_days": -1, + "detection_retention_days": 0, + "max_storage_mb": 0, + "tier_critical_multiplier": 3, + "tier_important_multiplier": 2, + "tier_ephemeral_multiplier": 0.25, + "storage_priority": 5, + "ptz_enabled": false, + "ptz_max_x": 0, + "ptz_max_y": 0, + "ptz_max_z": 0, + "ptz_has_home": false, + "onvif_profile": "Profile_1", + "onvif_port": 0, + "record_on_schedule": true, + "recording_schedule": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ], + "detection_record_on_schedule": false, + "detection_recording_schedule": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "tags": "outdoor,entrance", + "privacy_mode": false, + "motion_trigger_source": "", + "has_sub_stream": true, + "status": "Running", + "go2rtc_hls_available": false, + "url": "rtsp://192.0.2.10:554/Streaming/Channels/101", + "onvif_username": "synthetic-user", + "onvif_password": "synthetic-pass-1", + "admin_url": "http://192.0.2.10/", + "go2rtc_source_override": "", + "sub_stream_url": "rtsp://192.0.2.10:554/Streaming/Channels/102", + "detection_url": "", + "publish_url": "", + "can_control_privacy": true, + "error_message": "stale" + } + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/full.live-only.claims-configure.invalid.json b/tests/contracts/fixtures/streams/full.live-only.claims-configure.invalid.json new file mode 100644 index 000000000..836dc545d --- /dev/null +++ b/tests/contracts/fixtures/streams/full.live-only.claims-configure.invalid.json @@ -0,0 +1,413 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "getStreamFull", + "direction": "response", + "status": 200, + "principal": "live_viewer", + "schema": "streams.yaml#/components/schemas/StreamFullResponseLiveOnly", + "expect": "invalid", + "violates": "live-only variant requires can_control_privacy false", + "body": { + "stream": { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "name": "front-door", + "enabled": true, + "streaming_enabled": true, + "playback_transport": "auto", + "eptz_config": "", + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "priority": 5, + "record": true, + "segment_duration": 900, + "detection_based_recording": false, + "detection_model": "motion", + "detection_threshold": 50, + "detection_interval": 10, + "pre_detection_buffer": 5, + "post_detection_buffer": 10, + "detection_object_filter": "none", + "detection_object_filter_list": "", + "protocol": 0, + "record_audio": true, + "audio_voice_enhancement": false, + "isOnvif": true, + "backchannel_enabled": false, + "retention_days": -1, + "detection_retention_days": 0, + "max_storage_mb": 0, + "tier_critical_multiplier": 3, + "tier_important_multiplier": 2, + "tier_ephemeral_multiplier": 0.25, + "storage_priority": 5, + "ptz_enabled": false, + "ptz_max_x": 0, + "ptz_max_y": 0, + "ptz_max_z": 0, + "ptz_has_home": false, + "onvif_profile": "Profile_1", + "onvif_port": 0, + "record_on_schedule": true, + "recording_schedule": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ], + "detection_record_on_schedule": false, + "detection_recording_schedule": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "tags": "outdoor,entrance", + "privacy_mode": false, + "motion_trigger_source": "", + "has_sub_stream": true, + "status": "Running", + "go2rtc_hls_available": false, + "url": "rtsp://192.0.2.10:554/Streaming/Channels/101", + "onvif_username": "", + "onvif_password": "", + "admin_url": "", + "go2rtc_source_override": "", + "sub_stream_url": "", + "detection_url": "", + "publish_url": "", + "can_control_privacy": true + } + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/full.live-only.error-status.valid.json b/tests/contracts/fixtures/streams/full.live-only.error-status.valid.json new file mode 100644 index 000000000..d9a6ee9d4 --- /dev/null +++ b/tests/contracts/fixtures/streams/full.live-only.error-status.valid.json @@ -0,0 +1,414 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "getStreamFull", + "direction": "response", + "status": 200, + "principal": "live_viewer", + "schema": "streams.yaml#/components/schemas/StreamFullResponseLiveOnly", + "expect": "valid", + "description": "status Error carries error_message (only case in which it is emitted).", + "body": { + "stream": { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "name": "front-door", + "enabled": true, + "streaming_enabled": true, + "playback_transport": "auto", + "eptz_config": "", + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "priority": 5, + "record": true, + "segment_duration": 900, + "detection_based_recording": true, + "detection_model": "/var/lib/lightnvr/models/synthetic.tflite", + "detection_threshold": 50, + "detection_interval": 10, + "pre_detection_buffer": 5, + "post_detection_buffer": 10, + "detection_object_filter": "none", + "detection_object_filter_list": "", + "protocol": 0, + "record_audio": true, + "audio_voice_enhancement": false, + "isOnvif": true, + "backchannel_enabled": false, + "retention_days": -1, + "detection_retention_days": 0, + "max_storage_mb": 0, + "tier_critical_multiplier": 3, + "tier_important_multiplier": 2, + "tier_ephemeral_multiplier": 0.25, + "storage_priority": 5, + "ptz_enabled": false, + "ptz_max_x": 0, + "ptz_max_y": 0, + "ptz_max_z": 0, + "ptz_has_home": false, + "onvif_profile": "Profile_1", + "onvif_port": 0, + "record_on_schedule": true, + "recording_schedule": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ], + "detection_record_on_schedule": false, + "detection_recording_schedule": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "tags": "outdoor,entrance", + "privacy_mode": false, + "motion_trigger_source": "", + "has_sub_stream": true, + "status": "Error", + "go2rtc_hls_available": false, + "url": "rtsp://192.0.2.10:554/Streaming/Channels/101", + "onvif_username": "", + "onvif_password": "", + "admin_url": "", + "go2rtc_source_override": "", + "sub_stream_url": "", + "detection_url": "", + "publish_url": "", + "can_control_privacy": false, + "error_message": "Failed to load detection model: /var/lib/lightnvr/models/synthetic.tflite" + } + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/full.live-only.leaked-admin-url.invalid.json b/tests/contracts/fixtures/streams/full.live-only.leaked-admin-url.invalid.json new file mode 100644 index 000000000..747e22098 --- /dev/null +++ b/tests/contracts/fixtures/streams/full.live-only.leaked-admin-url.invalid.json @@ -0,0 +1,413 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "getStreamFull", + "direction": "response", + "status": 200, + "principal": "live_viewer", + "schema": "streams.yaml#/components/schemas/StreamFullResponseLiveOnly", + "expect": "invalid", + "violates": "admin_url must be \"\" for viewers", + "body": { + "stream": { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "name": "front-door", + "enabled": true, + "streaming_enabled": true, + "playback_transport": "auto", + "eptz_config": "", + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "priority": 5, + "record": true, + "segment_duration": 900, + "detection_based_recording": false, + "detection_model": "motion", + "detection_threshold": 50, + "detection_interval": 10, + "pre_detection_buffer": 5, + "post_detection_buffer": 10, + "detection_object_filter": "none", + "detection_object_filter_list": "", + "protocol": 0, + "record_audio": true, + "audio_voice_enhancement": false, + "isOnvif": true, + "backchannel_enabled": false, + "retention_days": -1, + "detection_retention_days": 0, + "max_storage_mb": 0, + "tier_critical_multiplier": 3, + "tier_important_multiplier": 2, + "tier_ephemeral_multiplier": 0.25, + "storage_priority": 5, + "ptz_enabled": false, + "ptz_max_x": 0, + "ptz_max_y": 0, + "ptz_max_z": 0, + "ptz_has_home": false, + "onvif_profile": "Profile_1", + "onvif_port": 0, + "record_on_schedule": true, + "recording_schedule": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ], + "detection_record_on_schedule": false, + "detection_recording_schedule": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "tags": "outdoor,entrance", + "privacy_mode": false, + "motion_trigger_source": "", + "has_sub_stream": true, + "status": "Running", + "go2rtc_hls_available": false, + "url": "rtsp://192.0.2.10:554/Streaming/Channels/101", + "onvif_username": "", + "onvif_password": "", + "admin_url": "http://192.0.2.10/", + "go2rtc_source_override": "", + "sub_stream_url": "", + "detection_url": "", + "publish_url": "", + "can_control_privacy": false + } + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/full.live-only.leaked-detection-url.invalid.json b/tests/contracts/fixtures/streams/full.live-only.leaked-detection-url.invalid.json new file mode 100644 index 000000000..7a677ce5e --- /dev/null +++ b/tests/contracts/fixtures/streams/full.live-only.leaked-detection-url.invalid.json @@ -0,0 +1,413 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "getStreamFull", + "direction": "response", + "status": 200, + "principal": "live_viewer", + "schema": "streams.yaml#/components/schemas/StreamFullResponseLiveOnly", + "expect": "invalid", + "violates": "detection_url must be \"\" for viewers", + "body": { + "stream": { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "name": "front-door", + "enabled": true, + "streaming_enabled": true, + "playback_transport": "auto", + "eptz_config": "", + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "priority": 5, + "record": true, + "segment_duration": 900, + "detection_based_recording": false, + "detection_model": "motion", + "detection_threshold": 50, + "detection_interval": 10, + "pre_detection_buffer": 5, + "post_detection_buffer": 10, + "detection_object_filter": "none", + "detection_object_filter_list": "", + "protocol": 0, + "record_audio": true, + "audio_voice_enhancement": false, + "isOnvif": true, + "backchannel_enabled": false, + "retention_days": -1, + "detection_retention_days": 0, + "max_storage_mb": 0, + "tier_critical_multiplier": 3, + "tier_important_multiplier": 2, + "tier_ephemeral_multiplier": 0.25, + "storage_priority": 5, + "ptz_enabled": false, + "ptz_max_x": 0, + "ptz_max_y": 0, + "ptz_max_z": 0, + "ptz_has_home": false, + "onvif_profile": "Profile_1", + "onvif_port": 0, + "record_on_schedule": true, + "recording_schedule": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ], + "detection_record_on_schedule": false, + "detection_recording_schedule": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "tags": "outdoor,entrance", + "privacy_mode": false, + "motion_trigger_source": "", + "has_sub_stream": true, + "status": "Running", + "go2rtc_hls_available": false, + "url": "rtsp://192.0.2.10:554/Streaming/Channels/101", + "onvif_username": "", + "onvif_password": "", + "admin_url": "", + "go2rtc_source_override": "", + "sub_stream_url": "", + "detection_url": "rtsp://192.0.2.10:554/sub", + "publish_url": "", + "can_control_privacy": false + } + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/full.live-only.leaked-go2rtc-override.invalid.json b/tests/contracts/fixtures/streams/full.live-only.leaked-go2rtc-override.invalid.json new file mode 100644 index 000000000..2a38e7960 --- /dev/null +++ b/tests/contracts/fixtures/streams/full.live-only.leaked-go2rtc-override.invalid.json @@ -0,0 +1,413 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "getStreamFull", + "direction": "response", + "status": 200, + "principal": "live_viewer", + "schema": "streams.yaml#/components/schemas/StreamFullResponseLiveOnly", + "expect": "invalid", + "violates": "go2rtc_source_override must be \"\" for viewers", + "body": { + "stream": { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "name": "front-door", + "enabled": true, + "streaming_enabled": true, + "playback_transport": "auto", + "eptz_config": "", + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "priority": 5, + "record": true, + "segment_duration": 900, + "detection_based_recording": false, + "detection_model": "motion", + "detection_threshold": 50, + "detection_interval": 10, + "pre_detection_buffer": 5, + "post_detection_buffer": 10, + "detection_object_filter": "none", + "detection_object_filter_list": "", + "protocol": 0, + "record_audio": true, + "audio_voice_enhancement": false, + "isOnvif": true, + "backchannel_enabled": false, + "retention_days": -1, + "detection_retention_days": 0, + "max_storage_mb": 0, + "tier_critical_multiplier": 3, + "tier_important_multiplier": 2, + "tier_ephemeral_multiplier": 0.25, + "storage_priority": 5, + "ptz_enabled": false, + "ptz_max_x": 0, + "ptz_max_y": 0, + "ptz_max_z": 0, + "ptz_has_home": false, + "onvif_profile": "Profile_1", + "onvif_port": 0, + "record_on_schedule": true, + "recording_schedule": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ], + "detection_record_on_schedule": false, + "detection_recording_schedule": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "tags": "outdoor,entrance", + "privacy_mode": false, + "motion_trigger_source": "", + "has_sub_stream": true, + "status": "Running", + "go2rtc_hls_available": false, + "url": "rtsp://192.0.2.10:554/Streaming/Channels/101", + "onvif_username": "", + "onvif_password": "", + "admin_url": "", + "go2rtc_source_override": "rtsp://u:p@192.0.2.10/live", + "sub_stream_url": "", + "detection_url": "", + "publish_url": "", + "can_control_privacy": false + } + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/full.live-only.leaked-onvif-password.invalid.json b/tests/contracts/fixtures/streams/full.live-only.leaked-onvif-password.invalid.json new file mode 100644 index 000000000..9a519ee3e --- /dev/null +++ b/tests/contracts/fixtures/streams/full.live-only.leaked-onvif-password.invalid.json @@ -0,0 +1,413 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "getStreamFull", + "direction": "response", + "status": 200, + "principal": "live_viewer", + "schema": "streams.yaml#/components/schemas/StreamFullResponseLiveOnly", + "expect": "invalid", + "violates": "onvif_password must be \"\" for viewers", + "body": { + "stream": { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "name": "front-door", + "enabled": true, + "streaming_enabled": true, + "playback_transport": "auto", + "eptz_config": "", + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "priority": 5, + "record": true, + "segment_duration": 900, + "detection_based_recording": false, + "detection_model": "motion", + "detection_threshold": 50, + "detection_interval": 10, + "pre_detection_buffer": 5, + "post_detection_buffer": 10, + "detection_object_filter": "none", + "detection_object_filter_list": "", + "protocol": 0, + "record_audio": true, + "audio_voice_enhancement": false, + "isOnvif": true, + "backchannel_enabled": false, + "retention_days": -1, + "detection_retention_days": 0, + "max_storage_mb": 0, + "tier_critical_multiplier": 3, + "tier_important_multiplier": 2, + "tier_ephemeral_multiplier": 0.25, + "storage_priority": 5, + "ptz_enabled": false, + "ptz_max_x": 0, + "ptz_max_y": 0, + "ptz_max_z": 0, + "ptz_has_home": false, + "onvif_profile": "Profile_1", + "onvif_port": 0, + "record_on_schedule": true, + "recording_schedule": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ], + "detection_record_on_schedule": false, + "detection_recording_schedule": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "tags": "outdoor,entrance", + "privacy_mode": false, + "motion_trigger_source": "", + "has_sub_stream": true, + "status": "Running", + "go2rtc_hls_available": false, + "url": "rtsp://192.0.2.10:554/Streaming/Channels/101", + "onvif_username": "", + "onvif_password": "synthetic-pass-1", + "admin_url": "", + "go2rtc_source_override": "", + "sub_stream_url": "", + "detection_url": "", + "publish_url": "", + "can_control_privacy": false + } + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/full.live-only.leaked-onvif-username.invalid.json b/tests/contracts/fixtures/streams/full.live-only.leaked-onvif-username.invalid.json new file mode 100644 index 000000000..c3f239bb0 --- /dev/null +++ b/tests/contracts/fixtures/streams/full.live-only.leaked-onvif-username.invalid.json @@ -0,0 +1,413 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "getStreamFull", + "direction": "response", + "status": 200, + "principal": "live_viewer", + "schema": "streams.yaml#/components/schemas/StreamFullResponseLiveOnly", + "expect": "invalid", + "violates": "onvif_username must be \"\" for viewers", + "body": { + "stream": { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "name": "front-door", + "enabled": true, + "streaming_enabled": true, + "playback_transport": "auto", + "eptz_config": "", + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "priority": 5, + "record": true, + "segment_duration": 900, + "detection_based_recording": false, + "detection_model": "motion", + "detection_threshold": 50, + "detection_interval": 10, + "pre_detection_buffer": 5, + "post_detection_buffer": 10, + "detection_object_filter": "none", + "detection_object_filter_list": "", + "protocol": 0, + "record_audio": true, + "audio_voice_enhancement": false, + "isOnvif": true, + "backchannel_enabled": false, + "retention_days": -1, + "detection_retention_days": 0, + "max_storage_mb": 0, + "tier_critical_multiplier": 3, + "tier_important_multiplier": 2, + "tier_ephemeral_multiplier": 0.25, + "storage_priority": 5, + "ptz_enabled": false, + "ptz_max_x": 0, + "ptz_max_y": 0, + "ptz_max_z": 0, + "ptz_has_home": false, + "onvif_profile": "Profile_1", + "onvif_port": 0, + "record_on_schedule": true, + "recording_schedule": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ], + "detection_record_on_schedule": false, + "detection_recording_schedule": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "tags": "outdoor,entrance", + "privacy_mode": false, + "motion_trigger_source": "", + "has_sub_stream": true, + "status": "Running", + "go2rtc_hls_available": false, + "url": "rtsp://192.0.2.10:554/Streaming/Channels/101", + "onvif_username": "synthetic-user", + "onvif_password": "", + "admin_url": "", + "go2rtc_source_override": "", + "sub_stream_url": "", + "detection_url": "", + "publish_url": "", + "can_control_privacy": false + } + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/full.live-only.leaked-publish-url.invalid.json b/tests/contracts/fixtures/streams/full.live-only.leaked-publish-url.invalid.json new file mode 100644 index 000000000..5717d1b5f --- /dev/null +++ b/tests/contracts/fixtures/streams/full.live-only.leaked-publish-url.invalid.json @@ -0,0 +1,413 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "getStreamFull", + "direction": "response", + "status": 200, + "principal": "live_viewer", + "schema": "streams.yaml#/components/schemas/StreamFullResponseLiveOnly", + "expect": "invalid", + "violates": "publish_url must be \"\" for viewers", + "body": { + "stream": { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "name": "front-door", + "enabled": true, + "streaming_enabled": true, + "playback_transport": "auto", + "eptz_config": "", + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "priority": 5, + "record": true, + "segment_duration": 900, + "detection_based_recording": false, + "detection_model": "motion", + "detection_threshold": 50, + "detection_interval": 10, + "pre_detection_buffer": 5, + "post_detection_buffer": 10, + "detection_object_filter": "none", + "detection_object_filter_list": "", + "protocol": 0, + "record_audio": true, + "audio_voice_enhancement": false, + "isOnvif": true, + "backchannel_enabled": false, + "retention_days": -1, + "detection_retention_days": 0, + "max_storage_mb": 0, + "tier_critical_multiplier": 3, + "tier_important_multiplier": 2, + "tier_ephemeral_multiplier": 0.25, + "storage_priority": 5, + "ptz_enabled": false, + "ptz_max_x": 0, + "ptz_max_y": 0, + "ptz_max_z": 0, + "ptz_has_home": false, + "onvif_profile": "Profile_1", + "onvif_port": 0, + "record_on_schedule": true, + "recording_schedule": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ], + "detection_record_on_schedule": false, + "detection_recording_schedule": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "tags": "outdoor,entrance", + "privacy_mode": false, + "motion_trigger_source": "", + "has_sub_stream": true, + "status": "Running", + "go2rtc_hls_available": false, + "url": "rtsp://192.0.2.10:554/Streaming/Channels/101", + "onvif_username": "", + "onvif_password": "", + "admin_url": "", + "go2rtc_source_override": "", + "sub_stream_url": "", + "detection_url": "", + "publish_url": "rtmp://live.example.invalid/app/key1", + "can_control_privacy": false + } + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/full.live-only.leaked-sub-stream-url.invalid.json b/tests/contracts/fixtures/streams/full.live-only.leaked-sub-stream-url.invalid.json new file mode 100644 index 000000000..5f74420c4 --- /dev/null +++ b/tests/contracts/fixtures/streams/full.live-only.leaked-sub-stream-url.invalid.json @@ -0,0 +1,413 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "getStreamFull", + "direction": "response", + "status": 200, + "principal": "live_viewer", + "schema": "streams.yaml#/components/schemas/StreamFullResponseLiveOnly", + "expect": "invalid", + "violates": "sub_stream_url must be \"\" for viewers", + "body": { + "stream": { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "name": "front-door", + "enabled": true, + "streaming_enabled": true, + "playback_transport": "auto", + "eptz_config": "", + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "priority": 5, + "record": true, + "segment_duration": 900, + "detection_based_recording": false, + "detection_model": "motion", + "detection_threshold": 50, + "detection_interval": 10, + "pre_detection_buffer": 5, + "post_detection_buffer": 10, + "detection_object_filter": "none", + "detection_object_filter_list": "", + "protocol": 0, + "record_audio": true, + "audio_voice_enhancement": false, + "isOnvif": true, + "backchannel_enabled": false, + "retention_days": -1, + "detection_retention_days": 0, + "max_storage_mb": 0, + "tier_critical_multiplier": 3, + "tier_important_multiplier": 2, + "tier_ephemeral_multiplier": 0.25, + "storage_priority": 5, + "ptz_enabled": false, + "ptz_max_x": 0, + "ptz_max_y": 0, + "ptz_max_z": 0, + "ptz_has_home": false, + "onvif_profile": "Profile_1", + "onvif_port": 0, + "record_on_schedule": true, + "recording_schedule": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ], + "detection_record_on_schedule": false, + "detection_recording_schedule": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "tags": "outdoor,entrance", + "privacy_mode": false, + "motion_trigger_source": "", + "has_sub_stream": true, + "status": "Running", + "go2rtc_hls_available": false, + "url": "rtsp://192.0.2.10:554/Streaming/Channels/101", + "onvif_username": "", + "onvif_password": "", + "admin_url": "", + "go2rtc_source_override": "", + "sub_stream_url": "rtsp://192.0.2.10:554/Streaming/Channels/102", + "detection_url": "", + "publish_url": "", + "can_control_privacy": false + } + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/full.live-only.redacted.valid.json b/tests/contracts/fixtures/streams/full.live-only.redacted.valid.json new file mode 100644 index 000000000..f0b7c39ef --- /dev/null +++ b/tests/contracts/fixtures/streams/full.live-only.redacted.valid.json @@ -0,0 +1,417 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "getStreamFull", + "direction": "response", + "status": 200, + "principal": "live_viewer", + "request": { + "method": "GET", + "path": "/api/streams/front-door/full" + }, + "schema": "streams.yaml#/components/schemas/StreamFullResponseLiveOnly", + "expect": "valid", + "description": "Same camera for a live.view-only principal: every credential-bearing key is empty, url credential-free, can_control_privacy false, has_sub_stream still true.", + "body": { + "stream": { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "name": "front-door", + "enabled": true, + "streaming_enabled": true, + "playback_transport": "auto", + "eptz_config": "", + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "priority": 5, + "record": true, + "segment_duration": 900, + "detection_based_recording": false, + "detection_model": "motion", + "detection_threshold": 50, + "detection_interval": 10, + "pre_detection_buffer": 5, + "post_detection_buffer": 10, + "detection_object_filter": "none", + "detection_object_filter_list": "", + "protocol": 0, + "record_audio": true, + "audio_voice_enhancement": false, + "isOnvif": true, + "backchannel_enabled": false, + "retention_days": -1, + "detection_retention_days": 0, + "max_storage_mb": 0, + "tier_critical_multiplier": 3, + "tier_important_multiplier": 2, + "tier_ephemeral_multiplier": 0.25, + "storage_priority": 5, + "ptz_enabled": false, + "ptz_max_x": 0, + "ptz_max_y": 0, + "ptz_max_z": 0, + "ptz_has_home": false, + "onvif_profile": "Profile_1", + "onvif_port": 0, + "record_on_schedule": true, + "recording_schedule": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ], + "detection_record_on_schedule": false, + "detection_recording_schedule": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "tags": "outdoor,entrance", + "privacy_mode": false, + "motion_trigger_source": "", + "has_sub_stream": true, + "status": "Running", + "go2rtc_hls_available": false, + "url": "rtsp://192.0.2.10:554/Streaming/Channels/101", + "onvif_username": "", + "onvif_password": "", + "admin_url": "", + "go2rtc_source_override": "", + "sub_stream_url": "", + "detection_url": "", + "publish_url": "", + "can_control_privacy": false + } + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/full.live-only.sensitive-keys-absent.valid.json b/tests/contracts/fixtures/streams/full.live-only.sensitive-keys-absent.valid.json new file mode 100644 index 000000000..15a7c3005 --- /dev/null +++ b/tests/contracts/fixtures/streams/full.live-only.sensitive-keys-absent.valid.json @@ -0,0 +1,405 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "getStreamFull", + "direction": "response", + "status": 200, + "principal": "live_viewer", + "schema": "streams.yaml#/components/schemas/StreamFullResponseLiveOnly", + "expect": "valid", + "description": "Policy check: sensitive keys are optional in the viewer model, so a server that stops sending them stays compatible.", + "body": { + "stream": { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "name": "front-door", + "enabled": true, + "streaming_enabled": true, + "playback_transport": "auto", + "eptz_config": "", + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "priority": 5, + "record": true, + "segment_duration": 900, + "detection_based_recording": false, + "detection_model": "motion", + "detection_threshold": 50, + "detection_interval": 10, + "pre_detection_buffer": 5, + "post_detection_buffer": 10, + "detection_object_filter": "none", + "detection_object_filter_list": "", + "protocol": 0, + "record_audio": true, + "audio_voice_enhancement": false, + "isOnvif": true, + "backchannel_enabled": false, + "retention_days": -1, + "detection_retention_days": 0, + "max_storage_mb": 0, + "tier_critical_multiplier": 3, + "tier_important_multiplier": 2, + "tier_ephemeral_multiplier": 0.25, + "storage_priority": 5, + "ptz_enabled": false, + "ptz_max_x": 0, + "ptz_max_y": 0, + "ptz_max_z": 0, + "ptz_has_home": false, + "onvif_profile": "Profile_1", + "onvif_port": 0, + "record_on_schedule": true, + "recording_schedule": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ], + "detection_record_on_schedule": false, + "detection_recording_schedule": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "tags": "outdoor,entrance", + "privacy_mode": false, + "motion_trigger_source": "", + "has_sub_stream": true, + "status": "Running", + "go2rtc_hls_available": false, + "can_control_privacy": false + } + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/full.live-only.url-query-secret.invalid.json b/tests/contracts/fixtures/streams/full.live-only.url-query-secret.invalid.json new file mode 100644 index 000000000..7882288d2 --- /dev/null +++ b/tests/contracts/fixtures/streams/full.live-only.url-query-secret.invalid.json @@ -0,0 +1,413 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "getStreamFull", + "direction": "response", + "status": 200, + "principal": "live_viewer", + "schema": "streams.yaml#/components/schemas/StreamFullResponseLiveOnly", + "expect": "invalid", + "violates": "url must not carry secret-like query parameters (F-T11-03: current C redaction does NOT strip these)", + "body": { + "stream": { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "name": "front-door", + "enabled": true, + "streaming_enabled": true, + "playback_transport": "auto", + "eptz_config": "", + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "priority": 5, + "record": true, + "segment_duration": 900, + "detection_based_recording": false, + "detection_model": "motion", + "detection_threshold": 50, + "detection_interval": 10, + "pre_detection_buffer": 5, + "post_detection_buffer": 10, + "detection_object_filter": "none", + "detection_object_filter_list": "", + "protocol": 0, + "record_audio": true, + "audio_voice_enhancement": false, + "isOnvif": true, + "backchannel_enabled": false, + "retention_days": -1, + "detection_retention_days": 0, + "max_storage_mb": 0, + "tier_critical_multiplier": 3, + "tier_important_multiplier": 2, + "tier_ephemeral_multiplier": 0.25, + "storage_priority": 5, + "ptz_enabled": false, + "ptz_max_x": 0, + "ptz_max_y": 0, + "ptz_max_z": 0, + "ptz_has_home": false, + "onvif_profile": "Profile_1", + "onvif_port": 0, + "record_on_schedule": true, + "recording_schedule": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ], + "detection_record_on_schedule": false, + "detection_recording_schedule": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "tags": "outdoor,entrance", + "privacy_mode": false, + "motion_trigger_source": "", + "has_sub_stream": true, + "status": "Running", + "go2rtc_hls_available": false, + "url": "rtsp://192.0.2.10:554/cam/realmonitor?channel=1&user=admin&password=synthetic-pass-3", + "onvif_username": "", + "onvif_password": "", + "admin_url": "", + "go2rtc_source_override": "", + "sub_stream_url": "", + "detection_url": "", + "publish_url": "", + "can_control_privacy": false + } + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/full.live-only.url-userinfo.invalid.json b/tests/contracts/fixtures/streams/full.live-only.url-userinfo.invalid.json new file mode 100644 index 000000000..efbad3e20 --- /dev/null +++ b/tests/contracts/fixtures/streams/full.live-only.url-userinfo.invalid.json @@ -0,0 +1,413 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "getStreamFull", + "direction": "response", + "status": 200, + "principal": "live_viewer", + "schema": "streams.yaml#/components/schemas/StreamFullResponseLiveOnly", + "expect": "invalid", + "violates": "url must not carry userinfo for viewers", + "body": { + "stream": { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "name": "front-door", + "enabled": true, + "streaming_enabled": true, + "playback_transport": "auto", + "eptz_config": "", + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "priority": 5, + "record": true, + "segment_duration": 900, + "detection_based_recording": false, + "detection_model": "motion", + "detection_threshold": 50, + "detection_interval": 10, + "pre_detection_buffer": 5, + "post_detection_buffer": 10, + "detection_object_filter": "none", + "detection_object_filter_list": "", + "protocol": 0, + "record_audio": true, + "audio_voice_enhancement": false, + "isOnvif": true, + "backchannel_enabled": false, + "retention_days": -1, + "detection_retention_days": 0, + "max_storage_mb": 0, + "tier_critical_multiplier": 3, + "tier_important_multiplier": 2, + "tier_ephemeral_multiplier": 0.25, + "storage_priority": 5, + "ptz_enabled": false, + "ptz_max_x": 0, + "ptz_max_y": 0, + "ptz_max_z": 0, + "ptz_has_home": false, + "onvif_profile": "Profile_1", + "onvif_port": 0, + "record_on_schedule": true, + "recording_schedule": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ], + "detection_record_on_schedule": false, + "detection_recording_schedule": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "tags": "outdoor,entrance", + "privacy_mode": false, + "motion_trigger_source": "", + "has_sub_stream": true, + "status": "Running", + "go2rtc_hls_available": false, + "url": "rtsp://synthetic-user:synthetic-pass-1@192.0.2.10:554/Streaming/Channels/101", + "onvif_username": "", + "onvif_password": "", + "admin_url": "", + "go2rtc_source_override": "", + "sub_stream_url": "", + "detection_url": "", + "publish_url": "", + "can_control_privacy": false + } + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/full.live-only.url-username-only.invalid.json b/tests/contracts/fixtures/streams/full.live-only.url-username-only.invalid.json new file mode 100644 index 000000000..24501cfee --- /dev/null +++ b/tests/contracts/fixtures/streams/full.live-only.url-username-only.invalid.json @@ -0,0 +1,413 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "getStreamFull", + "direction": "response", + "status": 200, + "principal": "live_viewer", + "schema": "streams.yaml#/components/schemas/StreamFullResponseLiveOnly", + "expect": "invalid", + "violates": "url must not carry userinfo (username only) for viewers", + "body": { + "stream": { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "name": "front-door", + "enabled": true, + "streaming_enabled": true, + "playback_transport": "auto", + "eptz_config": "", + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "priority": 5, + "record": true, + "segment_duration": 900, + "detection_based_recording": false, + "detection_model": "motion", + "detection_threshold": 50, + "detection_interval": 10, + "pre_detection_buffer": 5, + "post_detection_buffer": 10, + "detection_object_filter": "none", + "detection_object_filter_list": "", + "protocol": 0, + "record_audio": true, + "audio_voice_enhancement": false, + "isOnvif": true, + "backchannel_enabled": false, + "retention_days": -1, + "detection_retention_days": 0, + "max_storage_mb": 0, + "tier_critical_multiplier": 3, + "tier_important_multiplier": 2, + "tier_ephemeral_multiplier": 0.25, + "storage_priority": 5, + "ptz_enabled": false, + "ptz_max_x": 0, + "ptz_max_y": 0, + "ptz_max_z": 0, + "ptz_has_home": false, + "onvif_profile": "Profile_1", + "onvif_port": 0, + "record_on_schedule": true, + "recording_schedule": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ], + "detection_record_on_schedule": false, + "detection_recording_schedule": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "tags": "outdoor,entrance", + "privacy_mode": false, + "motion_trigger_source": "", + "has_sub_stream": true, + "status": "Running", + "go2rtc_hls_available": false, + "url": "rtsp://synthetic-user@192.0.2.10:554/live", + "onvif_username": "", + "onvif_password": "", + "admin_url": "", + "go2rtc_source_override": "", + "sub_stream_url": "", + "detection_url": "", + "publish_url": "", + "can_control_privacy": false + } + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/full.null-tags.invalid.json b/tests/contracts/fixtures/streams/full.null-tags.invalid.json new file mode 100644 index 000000000..99437309b --- /dev/null +++ b/tests/contracts/fixtures/streams/full.null-tags.invalid.json @@ -0,0 +1,413 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "getStreamFull", + "direction": "response", + "status": 200, + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamFullResponseConfigurable", + "expect": "invalid", + "violates": "the server never emits null; absent text is \"\"", + "body": { + "stream": { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "name": "front-door", + "enabled": true, + "streaming_enabled": true, + "playback_transport": "auto", + "eptz_config": "", + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "priority": 5, + "record": true, + "segment_duration": 900, + "detection_based_recording": false, + "detection_model": "motion", + "detection_threshold": 50, + "detection_interval": 10, + "pre_detection_buffer": 5, + "post_detection_buffer": 10, + "detection_object_filter": "none", + "detection_object_filter_list": "", + "protocol": 0, + "record_audio": true, + "audio_voice_enhancement": false, + "isOnvif": true, + "backchannel_enabled": false, + "retention_days": -1, + "detection_retention_days": 0, + "max_storage_mb": 0, + "tier_critical_multiplier": 3, + "tier_important_multiplier": 2, + "tier_ephemeral_multiplier": 0.25, + "storage_priority": 5, + "ptz_enabled": false, + "ptz_max_x": 0, + "ptz_max_y": 0, + "ptz_max_z": 0, + "ptz_has_home": false, + "onvif_profile": "Profile_1", + "onvif_port": 0, + "record_on_schedule": true, + "recording_schedule": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ], + "detection_record_on_schedule": false, + "detection_recording_schedule": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "tags": null, + "privacy_mode": false, + "motion_trigger_source": "", + "has_sub_stream": true, + "status": "Running", + "go2rtc_hls_available": false, + "url": "rtsp://192.0.2.10:554/Streaming/Channels/101", + "onvif_username": "synthetic-user", + "onvif_password": "synthetic-pass-1", + "admin_url": "http://192.0.2.10/", + "go2rtc_source_override": "", + "sub_stream_url": "rtsp://192.0.2.10:554/Streaming/Channels/102", + "detection_url": "", + "publish_url": "", + "can_control_privacy": true + } + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/full.protocol-out-of-enum.invalid.json b/tests/contracts/fixtures/streams/full.protocol-out-of-enum.invalid.json new file mode 100644 index 000000000..1f6d45de7 --- /dev/null +++ b/tests/contracts/fixtures/streams/full.protocol-out-of-enum.invalid.json @@ -0,0 +1,413 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "getStreamFull", + "direction": "response", + "status": 200, + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamFullResponseConfigurable", + "expect": "invalid", + "violates": "protocol is 0 (TCP) or 1 (UDP)", + "body": { + "stream": { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "name": "front-door", + "enabled": true, + "streaming_enabled": true, + "playback_transport": "auto", + "eptz_config": "", + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "priority": 5, + "record": true, + "segment_duration": 900, + "detection_based_recording": false, + "detection_model": "motion", + "detection_threshold": 50, + "detection_interval": 10, + "pre_detection_buffer": 5, + "post_detection_buffer": 10, + "detection_object_filter": "none", + "detection_object_filter_list": "", + "protocol": 2, + "record_audio": true, + "audio_voice_enhancement": false, + "isOnvif": true, + "backchannel_enabled": false, + "retention_days": -1, + "detection_retention_days": 0, + "max_storage_mb": 0, + "tier_critical_multiplier": 3, + "tier_important_multiplier": 2, + "tier_ephemeral_multiplier": 0.25, + "storage_priority": 5, + "ptz_enabled": false, + "ptz_max_x": 0, + "ptz_max_y": 0, + "ptz_max_z": 0, + "ptz_has_home": false, + "onvif_profile": "Profile_1", + "onvif_port": 0, + "record_on_schedule": true, + "recording_schedule": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ], + "detection_record_on_schedule": false, + "detection_recording_schedule": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "tags": "outdoor,entrance", + "privacy_mode": false, + "motion_trigger_source": "", + "has_sub_stream": true, + "status": "Running", + "go2rtc_hls_available": false, + "url": "rtsp://192.0.2.10:554/Streaming/Channels/101", + "onvif_username": "synthetic-user", + "onvif_password": "synthetic-pass-1", + "admin_url": "http://192.0.2.10/", + "go2rtc_source_override": "", + "sub_stream_url": "rtsp://192.0.2.10:554/Streaming/Channels/102", + "detection_url": "", + "publish_url": "", + "can_control_privacy": true + } + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/full.retention-below-inherit.invalid.json b/tests/contracts/fixtures/streams/full.retention-below-inherit.invalid.json new file mode 100644 index 000000000..0da8a82d5 --- /dev/null +++ b/tests/contracts/fixtures/streams/full.retention-below-inherit.invalid.json @@ -0,0 +1,413 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "getStreamFull", + "direction": "response", + "status": 200, + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamFullResponseConfigurable", + "expect": "invalid", + "violates": "retention_days is tri-state -1 | 0 | 1..365", + "body": { + "stream": { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "name": "front-door", + "enabled": true, + "streaming_enabled": true, + "playback_transport": "auto", + "eptz_config": "", + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "priority": 5, + "record": true, + "segment_duration": 900, + "detection_based_recording": false, + "detection_model": "motion", + "detection_threshold": 50, + "detection_interval": 10, + "pre_detection_buffer": 5, + "post_detection_buffer": 10, + "detection_object_filter": "none", + "detection_object_filter_list": "", + "protocol": 0, + "record_audio": true, + "audio_voice_enhancement": false, + "isOnvif": true, + "backchannel_enabled": false, + "retention_days": -2, + "detection_retention_days": 0, + "max_storage_mb": 0, + "tier_critical_multiplier": 3, + "tier_important_multiplier": 2, + "tier_ephemeral_multiplier": 0.25, + "storage_priority": 5, + "ptz_enabled": false, + "ptz_max_x": 0, + "ptz_max_y": 0, + "ptz_max_z": 0, + "ptz_has_home": false, + "onvif_profile": "Profile_1", + "onvif_port": 0, + "record_on_schedule": true, + "recording_schedule": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ], + "detection_record_on_schedule": false, + "detection_recording_schedule": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "tags": "outdoor,entrance", + "privacy_mode": false, + "motion_trigger_source": "", + "has_sub_stream": true, + "status": "Running", + "go2rtc_hls_available": false, + "url": "rtsp://192.0.2.10:554/Streaming/Channels/101", + "onvif_username": "synthetic-user", + "onvif_password": "synthetic-pass-1", + "admin_url": "http://192.0.2.10/", + "go2rtc_source_override": "", + "sub_stream_url": "rtsp://192.0.2.10:554/Streaming/Channels/102", + "detection_url": "", + "publish_url": "", + "can_control_privacy": true + } + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/full.retention-over-max.invalid.json b/tests/contracts/fixtures/streams/full.retention-over-max.invalid.json new file mode 100644 index 000000000..1b2a54ad2 --- /dev/null +++ b/tests/contracts/fixtures/streams/full.retention-over-max.invalid.json @@ -0,0 +1,413 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "getStreamFull", + "direction": "response", + "status": 200, + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamFullResponseConfigurable", + "expect": "invalid", + "violates": "detection_retention_days max is 365", + "body": { + "stream": { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "name": "front-door", + "enabled": true, + "streaming_enabled": true, + "playback_transport": "auto", + "eptz_config": "", + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "priority": 5, + "record": true, + "segment_duration": 900, + "detection_based_recording": false, + "detection_model": "motion", + "detection_threshold": 50, + "detection_interval": 10, + "pre_detection_buffer": 5, + "post_detection_buffer": 10, + "detection_object_filter": "none", + "detection_object_filter_list": "", + "protocol": 0, + "record_audio": true, + "audio_voice_enhancement": false, + "isOnvif": true, + "backchannel_enabled": false, + "retention_days": -1, + "detection_retention_days": 366, + "max_storage_mb": 0, + "tier_critical_multiplier": 3, + "tier_important_multiplier": 2, + "tier_ephemeral_multiplier": 0.25, + "storage_priority": 5, + "ptz_enabled": false, + "ptz_max_x": 0, + "ptz_max_y": 0, + "ptz_max_z": 0, + "ptz_has_home": false, + "onvif_profile": "Profile_1", + "onvif_port": 0, + "record_on_schedule": true, + "recording_schedule": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ], + "detection_record_on_schedule": false, + "detection_recording_schedule": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "tags": "outdoor,entrance", + "privacy_mode": false, + "motion_trigger_source": "", + "has_sub_stream": true, + "status": "Running", + "go2rtc_hls_available": false, + "url": "rtsp://192.0.2.10:554/Streaming/Channels/101", + "onvif_username": "synthetic-user", + "onvif_password": "synthetic-pass-1", + "admin_url": "http://192.0.2.10/", + "go2rtc_source_override": "", + "sub_stream_url": "rtsp://192.0.2.10:554/Streaming/Channels/102", + "detection_url": "", + "publish_url": "", + "can_control_privacy": true + } + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/full.schedule-167-entries.invalid.json b/tests/contracts/fixtures/streams/full.schedule-167-entries.invalid.json new file mode 100644 index 000000000..66ddea6f7 --- /dev/null +++ b/tests/contracts/fixtures/streams/full.schedule-167-entries.invalid.json @@ -0,0 +1,412 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "getStreamFull", + "direction": "response", + "status": 200, + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamFullResponseConfigurable", + "expect": "invalid", + "violates": "recording_schedule must have exactly 168 entries", + "body": { + "stream": { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "name": "front-door", + "enabled": true, + "streaming_enabled": true, + "playback_transport": "auto", + "eptz_config": "", + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "priority": 5, + "record": true, + "segment_duration": 900, + "detection_based_recording": false, + "detection_model": "motion", + "detection_threshold": 50, + "detection_interval": 10, + "pre_detection_buffer": 5, + "post_detection_buffer": 10, + "detection_object_filter": "none", + "detection_object_filter_list": "", + "protocol": 0, + "record_audio": true, + "audio_voice_enhancement": false, + "isOnvif": true, + "backchannel_enabled": false, + "retention_days": -1, + "detection_retention_days": 0, + "max_storage_mb": 0, + "tier_critical_multiplier": 3, + "tier_important_multiplier": 2, + "tier_ephemeral_multiplier": 0.25, + "storage_priority": 5, + "ptz_enabled": false, + "ptz_max_x": 0, + "ptz_max_y": 0, + "ptz_max_z": 0, + "ptz_has_home": false, + "onvif_profile": "Profile_1", + "onvif_port": 0, + "record_on_schedule": true, + "recording_schedule": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "detection_record_on_schedule": false, + "detection_recording_schedule": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "tags": "outdoor,entrance", + "privacy_mode": false, + "motion_trigger_source": "", + "has_sub_stream": true, + "status": "Running", + "go2rtc_hls_available": false, + "url": "rtsp://192.0.2.10:554/Streaming/Channels/101", + "onvif_username": "synthetic-user", + "onvif_password": "synthetic-pass-1", + "admin_url": "http://192.0.2.10/", + "go2rtc_source_override": "", + "sub_stream_url": "rtsp://192.0.2.10:554/Streaming/Channels/102", + "detection_url": "", + "publish_url": "", + "can_control_privacy": true + } + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/full.status-docs-value.invalid.json b/tests/contracts/fixtures/streams/full.status-docs-value.invalid.json new file mode 100644 index 000000000..2922803df --- /dev/null +++ b/tests/contracts/fixtures/streams/full.status-docs-value.invalid.json @@ -0,0 +1,413 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "getStreamFull", + "direction": "response", + "status": 200, + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamFullResponseConfigurable", + "expect": "invalid", + "violates": "status enum is Running/Degraded/Error/Stopped/Unknown/Starting/Stopping/Reconnecting (docs/API.md shows 'connected')", + "body": { + "stream": { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "name": "front-door", + "enabled": true, + "streaming_enabled": true, + "playback_transport": "auto", + "eptz_config": "", + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "priority": 5, + "record": true, + "segment_duration": 900, + "detection_based_recording": false, + "detection_model": "motion", + "detection_threshold": 50, + "detection_interval": 10, + "pre_detection_buffer": 5, + "post_detection_buffer": 10, + "detection_object_filter": "none", + "detection_object_filter_list": "", + "protocol": 0, + "record_audio": true, + "audio_voice_enhancement": false, + "isOnvif": true, + "backchannel_enabled": false, + "retention_days": -1, + "detection_retention_days": 0, + "max_storage_mb": 0, + "tier_critical_multiplier": 3, + "tier_important_multiplier": 2, + "tier_ephemeral_multiplier": 0.25, + "storage_priority": 5, + "ptz_enabled": false, + "ptz_max_x": 0, + "ptz_max_y": 0, + "ptz_max_z": 0, + "ptz_has_home": false, + "onvif_profile": "Profile_1", + "onvif_port": 0, + "record_on_schedule": true, + "recording_schedule": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ], + "detection_record_on_schedule": false, + "detection_recording_schedule": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "tags": "outdoor,entrance", + "privacy_mode": false, + "motion_trigger_source": "", + "has_sub_stream": true, + "status": "connected", + "go2rtc_hls_available": false, + "url": "rtsp://192.0.2.10:554/Streaming/Channels/101", + "onvif_username": "synthetic-user", + "onvif_password": "synthetic-pass-1", + "admin_url": "http://192.0.2.10/", + "go2rtc_source_override": "", + "sub_stream_url": "rtsp://192.0.2.10:554/Streaming/Channels/102", + "detection_url": "", + "publish_url": "", + "can_control_privacy": true + } + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/full.threshold-as-fraction.invalid.json b/tests/contracts/fixtures/streams/full.threshold-as-fraction.invalid.json new file mode 100644 index 000000000..9aee30dc9 --- /dev/null +++ b/tests/contracts/fixtures/streams/full.threshold-as-fraction.invalid.json @@ -0,0 +1,413 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "getStreamFull", + "direction": "response", + "status": 200, + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamFullResponseConfigurable", + "expect": "invalid", + "violates": "detection_threshold is an integer percent on the wire, not a 0..1 float (docs/API.md example is wrong)", + "body": { + "stream": { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "name": "front-door", + "enabled": true, + "streaming_enabled": true, + "playback_transport": "auto", + "eptz_config": "", + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "priority": 5, + "record": true, + "segment_duration": 900, + "detection_based_recording": false, + "detection_model": "motion", + "detection_threshold": 0.5, + "detection_interval": 10, + "pre_detection_buffer": 5, + "post_detection_buffer": 10, + "detection_object_filter": "none", + "detection_object_filter_list": "", + "protocol": 0, + "record_audio": true, + "audio_voice_enhancement": false, + "isOnvif": true, + "backchannel_enabled": false, + "retention_days": -1, + "detection_retention_days": 0, + "max_storage_mb": 0, + "tier_critical_multiplier": 3, + "tier_important_multiplier": 2, + "tier_ephemeral_multiplier": 0.25, + "storage_priority": 5, + "ptz_enabled": false, + "ptz_max_x": 0, + "ptz_max_y": 0, + "ptz_max_z": 0, + "ptz_has_home": false, + "onvif_profile": "Profile_1", + "onvif_port": 0, + "record_on_schedule": true, + "recording_schedule": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ], + "detection_record_on_schedule": false, + "detection_recording_schedule": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "tags": "outdoor,entrance", + "privacy_mode": false, + "motion_trigger_source": "", + "has_sub_stream": true, + "status": "Running", + "go2rtc_hls_available": false, + "url": "rtsp://192.0.2.10:554/Streaming/Channels/101", + "onvif_username": "synthetic-user", + "onvif_password": "synthetic-pass-1", + "admin_url": "http://192.0.2.10/", + "go2rtc_source_override": "", + "sub_stream_url": "rtsp://192.0.2.10:554/Streaming/Channels/102", + "detection_url": "", + "publish_url": "", + "can_control_privacy": true + } + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/full.unwrapped-object.invalid.json b/tests/contracts/fixtures/streams/full.unwrapped-object.invalid.json new file mode 100644 index 000000000..137140eaa --- /dev/null +++ b/tests/contracts/fixtures/streams/full.unwrapped-object.invalid.json @@ -0,0 +1,411 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "getStreamFull", + "direction": "response", + "status": 200, + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamFullResponse", + "expect": "invalid", + "violates": "/full wraps the object as {stream:{...}}; the bare object is GET /api/streams/{name}", + "body": { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "name": "front-door", + "enabled": true, + "streaming_enabled": true, + "playback_transport": "auto", + "eptz_config": "", + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "priority": 5, + "record": true, + "segment_duration": 900, + "detection_based_recording": false, + "detection_model": "motion", + "detection_threshold": 50, + "detection_interval": 10, + "pre_detection_buffer": 5, + "post_detection_buffer": 10, + "detection_object_filter": "none", + "detection_object_filter_list": "", + "protocol": 0, + "record_audio": true, + "audio_voice_enhancement": false, + "isOnvif": true, + "backchannel_enabled": false, + "retention_days": -1, + "detection_retention_days": 0, + "max_storage_mb": 0, + "tier_critical_multiplier": 3, + "tier_important_multiplier": 2, + "tier_ephemeral_multiplier": 0.25, + "storage_priority": 5, + "ptz_enabled": false, + "ptz_max_x": 0, + "ptz_max_y": 0, + "ptz_max_z": 0, + "ptz_has_home": false, + "onvif_profile": "Profile_1", + "onvif_port": 0, + "record_on_schedule": true, + "recording_schedule": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ], + "detection_record_on_schedule": false, + "detection_recording_schedule": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "tags": "outdoor,entrance", + "privacy_mode": false, + "motion_trigger_source": "", + "has_sub_stream": true, + "status": "Running", + "go2rtc_hls_available": false, + "url": "rtsp://192.0.2.10:554/Streaming/Channels/101", + "onvif_username": "synthetic-user", + "onvif_password": "synthetic-pass-1", + "admin_url": "http://192.0.2.10/", + "go2rtc_source_override": "", + "sub_stream_url": "rtsp://192.0.2.10:554/Streaming/Channels/102", + "detection_url": "", + "publish_url": "", + "can_control_privacy": true + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/index.json b/tests/contracts/fixtures/streams/index.json new file mode 100644 index 000000000..aaeca0ec8 --- /dev/null +++ b/tests/contracts/fixtures/streams/index.json @@ -0,0 +1,726 @@ +{ + "$comment": "Fixture manifest for T12 (schema validation) and T18 (C contract tests). schema refs are relative to schema_base. expect=invalid fixtures MUST fail validation; expected_server_response records current C behavior for requests.", + "schema_base": "docs/api/contracts/", + "path_cases": "path-encoding.cases.json", + "fixtures": [ + { + "file": "full.configurer.onvif.valid.json", + "schema": "streams.yaml#/components/schemas/StreamFullResponseConfigurable", + "expect": "valid", + "direction": "response", + "operation": "getStreamFull", + "principal": "configurer" + }, + { + "file": "full.configurer.legacy-name-plain-credentials.valid.json", + "schema": "streams.yaml#/components/schemas/StreamFullResponseConfigurable", + "expect": "valid", + "direction": "response", + "operation": "getStreamFull", + "principal": "configurer" + }, + { + "file": "full.live-only.redacted.valid.json", + "schema": "streams.yaml#/components/schemas/StreamFullResponseLiveOnly", + "expect": "valid", + "direction": "response", + "operation": "getStreamFull", + "principal": "live_viewer" + }, + { + "file": "full.live-only.sensitive-keys-absent.valid.json", + "schema": "streams.yaml#/components/schemas/StreamFullResponseLiveOnly", + "expect": "valid", + "direction": "response", + "operation": "getStreamFull", + "principal": "live_viewer" + }, + { + "file": "full.live-only.error-status.valid.json", + "schema": "streams.yaml#/components/schemas/StreamFullResponseLiveOnly", + "expect": "valid", + "direction": "response", + "operation": "getStreamFull", + "principal": "live_viewer" + }, + { + "file": "full.any.generic-schema.valid.json", + "schema": "streams.yaml#/components/schemas/StreamFullResponse", + "expect": "valid", + "direction": "response", + "operation": "getStreamFull", + "principal": "live_viewer" + }, + { + "file": "full.live-only.leaked-onvif-password.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamFullResponseLiveOnly", + "expect": "invalid", + "direction": "response", + "operation": "getStreamFull", + "principal": "live_viewer" + }, + { + "file": "full.live-only.leaked-onvif-username.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamFullResponseLiveOnly", + "expect": "invalid", + "direction": "response", + "operation": "getStreamFull", + "principal": "live_viewer" + }, + { + "file": "full.live-only.url-userinfo.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamFullResponseLiveOnly", + "expect": "invalid", + "direction": "response", + "operation": "getStreamFull", + "principal": "live_viewer" + }, + { + "file": "full.live-only.url-username-only.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamFullResponseLiveOnly", + "expect": "invalid", + "direction": "response", + "operation": "getStreamFull", + "principal": "live_viewer" + }, + { + "file": "full.live-only.url-query-secret.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamFullResponseLiveOnly", + "expect": "invalid", + "direction": "response", + "operation": "getStreamFull", + "principal": "live_viewer" + }, + { + "file": "full.live-only.leaked-admin-url.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamFullResponseLiveOnly", + "expect": "invalid", + "direction": "response", + "operation": "getStreamFull", + "principal": "live_viewer" + }, + { + "file": "full.live-only.leaked-sub-stream-url.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamFullResponseLiveOnly", + "expect": "invalid", + "direction": "response", + "operation": "getStreamFull", + "principal": "live_viewer" + }, + { + "file": "full.live-only.leaked-detection-url.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamFullResponseLiveOnly", + "expect": "invalid", + "direction": "response", + "operation": "getStreamFull", + "principal": "live_viewer" + }, + { + "file": "full.live-only.leaked-publish-url.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamFullResponseLiveOnly", + "expect": "invalid", + "direction": "response", + "operation": "getStreamFull", + "principal": "live_viewer" + }, + { + "file": "full.live-only.leaked-go2rtc-override.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamFullResponseLiveOnly", + "expect": "invalid", + "direction": "response", + "operation": "getStreamFull", + "principal": "live_viewer" + }, + { + "file": "full.live-only.claims-configure.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamFullResponseLiveOnly", + "expect": "invalid", + "direction": "response", + "operation": "getStreamFull", + "principal": "live_viewer" + }, + { + "file": "full.configurer.onvif-url-userinfo.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamFullResponseConfigurable", + "expect": "invalid", + "direction": "response", + "operation": "getStreamFull", + "principal": "configurer" + }, + { + "file": "full.configurer.missing-onvif-password.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamFullResponseConfigurable", + "expect": "invalid", + "direction": "response", + "operation": "getStreamFull", + "principal": "configurer" + }, + { + "file": "full.schedule-167-entries.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamFullResponseConfigurable", + "expect": "invalid", + "direction": "response", + "operation": "getStreamFull", + "principal": "configurer" + }, + { + "file": "full.threshold-as-fraction.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamFullResponseConfigurable", + "expect": "invalid", + "direction": "response", + "operation": "getStreamFull", + "principal": "configurer" + }, + { + "file": "full.retention-below-inherit.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamFullResponseConfigurable", + "expect": "invalid", + "direction": "response", + "operation": "getStreamFull", + "principal": "configurer" + }, + { + "file": "full.retention-over-max.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamFullResponseConfigurable", + "expect": "invalid", + "direction": "response", + "operation": "getStreamFull", + "principal": "configurer" + }, + { + "file": "full.status-docs-value.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamFullResponseConfigurable", + "expect": "invalid", + "direction": "response", + "operation": "getStreamFull", + "principal": "configurer" + }, + { + "file": "full.error-message-without-error.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamFullResponseConfigurable", + "expect": "invalid", + "direction": "response", + "operation": "getStreamFull", + "principal": "configurer" + }, + { + "file": "full.protocol-out-of-enum.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamFullResponseConfigurable", + "expect": "invalid", + "direction": "response", + "operation": "getStreamFull", + "principal": "configurer" + }, + { + "file": "full.null-tags.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamFullResponseConfigurable", + "expect": "invalid", + "direction": "response", + "operation": "getStreamFull", + "principal": "configurer" + }, + { + "file": "full.unwrapped-object.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamFullResponse", + "expect": "invalid", + "direction": "response", + "operation": "getStreamFull", + "principal": "configurer" + }, + { + "file": "summary.admin.configurer-with-admin-url.valid.json", + "schema": "streams.yaml#/components/schemas/StreamSummaryPageAdmin", + "expect": "valid", + "direction": "response", + "operation": "listStreams", + "principal": "configurer_of_front_door_only" + }, + { + "file": "summary.admin.viewer.valid.json", + "schema": "streams.yaml#/components/schemas/StreamSummaryPageAdmin", + "expect": "valid", + "direction": "response", + "operation": "listStreams", + "principal": "live_viewer" + }, + { + "file": "summary.live.viewer.valid.json", + "schema": "streams.yaml#/components/schemas/StreamSummaryPageLive", + "expect": "valid", + "direction": "response", + "operation": "listStreams", + "principal": "live_viewer" + }, + { + "file": "summary.lpr.valid.json", + "schema": "streams.yaml#/components/schemas/StreamSummaryPageLpr", + "expect": "valid", + "direction": "response", + "operation": "listStreams", + "principal": "lpr_searcher" + }, + { + "file": "summary.admin.page-beyond-end.valid.json", + "schema": "streams.yaml#/components/schemas/StreamSummaryPageAdmin", + "expect": "valid", + "direction": "response", + "operation": "listStreams", + "principal": "live_viewer" + }, + { + "file": "summary.admin.empty.valid.json", + "schema": "streams.yaml#/components/schemas/StreamSummaryPageAdmin", + "expect": "valid", + "direction": "response", + "operation": "listStreams", + "principal": "no_camera_grants" + }, + { + "file": "summary.admin.contains-url.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamSummaryPageAdmin", + "expect": "invalid", + "direction": "response", + "operation": "listStreams", + "principal": "configurer" + }, + { + "file": "summary.admin.admin-url-without-configure.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamSummaryPageAdmin", + "expect": "invalid", + "direction": "response", + "operation": "listStreams", + "principal": "live_viewer" + }, + { + "file": "summary.live.contains-onvif-password.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamSummaryPageLive", + "expect": "invalid", + "direction": "response", + "operation": "listStreams", + "principal": "live_viewer" + }, + { + "file": "summary.live.contains-admin-url.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamSummaryPageLive", + "expect": "invalid", + "direction": "response", + "operation": "listStreams", + "principal": "configurer" + }, + { + "file": "summary.lpr.leaks-location.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamSummaryPageLpr", + "expect": "invalid", + "direction": "response", + "operation": "listStreams", + "principal": "lpr_searcher" + }, + { + "file": "summary.admin.page-size-over-max.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamSummaryPageAdmin", + "expect": "invalid", + "direction": "response", + "operation": "listStreams", + "principal": "live_viewer" + }, + { + "file": "summary.admin.status-from-detail-enum.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamSummaryPageAdmin", + "expect": "invalid", + "direction": "response", + "operation": "listStreams", + "principal": "live_viewer" + }, + { + "file": "summary.admin.missing-can-configure.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamSummaryPageAdmin", + "expect": "invalid", + "direction": "response", + "operation": "listStreams", + "principal": "live_viewer" + }, + { + "file": "put.edit-form.valid.json", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "valid", + "direction": "request", + "operation": "updateStream", + "principal": "configurer" + }, + { + "file": "put.retention-tristate.valid.json", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "valid", + "direction": "request", + "operation": "updateStream", + "principal": "configurer" + }, + { + "file": "put.retention-finite-boundary.valid.json", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "valid", + "direction": "request", + "operation": "updateStream", + "principal": "configurer" + }, + { + "file": "put.clear-with-null.valid.json", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "valid", + "direction": "request", + "operation": "updateStream", + "principal": "configurer" + }, + { + "file": "put.schedule-weekday.valid.json", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "valid", + "direction": "request", + "operation": "updateStream", + "principal": "configurer" + }, + { + "file": "put.publish-and-detection-url.valid.json", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "valid", + "direction": "request", + "operation": "updateStream", + "principal": "configurer" + }, + { + "file": "put.empty-object.valid.json", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "valid", + "direction": "request", + "operation": "updateStream", + "principal": "configurer" + }, + { + "file": "put.set-privacy-mode.valid.json", + "schema": "streams.yaml#/components/schemas/StreamPrivacyModeRequest", + "expect": "valid", + "direction": "request", + "operation": "updateStream", + "principal": "configurer" + }, + { + "file": "put.is-deleted.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "invalid", + "direction": "request", + "operation": "updateStream", + "principal": "configurer" + }, + { + "file": "put.name-in-body.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "invalid", + "direction": "request", + "operation": "updateStream", + "principal": "configurer" + }, + { + "file": "put.retention-366.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "invalid", + "direction": "request", + "operation": "updateStream", + "principal": "configurer" + }, + { + "file": "put.detection-retention-minus-2.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "invalid", + "direction": "request", + "operation": "updateStream", + "principal": "configurer" + }, + { + "file": "put.detection-url-file-scheme.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "invalid", + "direction": "request", + "operation": "updateStream", + "principal": "configurer" + }, + { + "file": "put.detection-url-too-long.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "invalid", + "direction": "request", + "operation": "updateStream", + "principal": "configurer" + }, + { + "file": "put.publish-url-http.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "invalid", + "direction": "request", + "operation": "updateStream", + "principal": "configurer" + }, + { + "file": "put.publish-url-quote.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "invalid", + "direction": "request", + "operation": "updateStream", + "principal": "configurer" + }, + { + "file": "put.playback-transport-bogus.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "invalid", + "direction": "request", + "operation": "updateStream", + "principal": "configurer" + }, + { + "file": "put.eptz-wrong-projection.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "invalid", + "direction": "request", + "operation": "updateStream", + "principal": "configurer" + }, + { + "file": "put.eptz-not-string.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "invalid", + "direction": "request", + "operation": "updateStream", + "principal": "configurer" + }, + { + "file": "put.schedule-wrong-length.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "invalid", + "direction": "request", + "operation": "updateStream", + "principal": "configurer" + }, + { + "file": "put.record-as-string.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "invalid", + "direction": "request", + "operation": "updateStream", + "principal": "configurer" + }, + { + "file": "put.protocol-out-of-enum.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "invalid", + "direction": "request", + "operation": "updateStream", + "principal": "configurer" + }, + { + "file": "put.privacy-mixed-with-edit.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamPrivacyModeRequest", + "expect": "invalid", + "direction": "request", + "operation": "updateStream", + "principal": "configurer" + }, + { + "file": "put.tags-too-long.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "invalid", + "direction": "request", + "operation": "updateStream", + "principal": "configurer" + }, + { + "file": "put-response.202.valid.json", + "schema": "streams.yaml#/components/schemas/StreamUpdateAccepted", + "expect": "valid", + "direction": "response", + "operation": "updateStream", + "principal": "configurer" + }, + { + "file": "put-response.202-onvif-failed.valid.json", + "schema": "streams.yaml#/components/schemas/StreamUpdateAccepted", + "expect": "valid", + "direction": "response", + "operation": "updateStream", + "principal": "configurer" + }, + { + "file": "put-response.200-privacy.valid.json", + "schema": "streams.yaml#/components/schemas/StreamPrivacyModeResponse", + "expect": "valid", + "direction": "response", + "operation": "updateStream", + "principal": "configurer" + }, + { + "file": "put-response.202-onvif-status-without-message.invalid.json", + "schema": "streams.yaml#/components/schemas/StreamUpdateAccepted", + "expect": "invalid", + "direction": "response", + "operation": "updateStream", + "principal": "configurer" + }, + { + "file": "error.401.valid.json", + "schema": "common.yaml#/components/schemas/ErrorResponse", + "expect": "valid", + "direction": "response", + "principal": "anonymous" + }, + { + "file": "error.403-put-viewer.valid.json", + "schema": "common.yaml#/components/schemas/ErrorResponse", + "expect": "valid", + "direction": "response", + "principal": "live_viewer" + }, + { + "file": "error.404-stream.valid.json", + "schema": "common.yaml#/components/schemas/ErrorResponse", + "expect": "valid", + "direction": "response", + "principal": "anonymous" + }, + { + "file": "error.404-camera.valid.json", + "schema": "common.yaml#/components/schemas/ErrorResponse", + "expect": "valid", + "direction": "response", + "principal": "configurer" + }, + { + "file": "error.400-surface.valid.json", + "schema": "common.yaml#/components/schemas/ErrorResponse", + "expect": "valid", + "direction": "response", + "principal": "live_viewer" + }, + { + "file": "error.400-retention.valid.json", + "schema": "common.yaml#/components/schemas/ErrorResponse", + "expect": "valid", + "direction": "response", + "principal": "configurer" + }, + { + "file": "error.413-publish-url.valid.json", + "schema": "common.yaml#/components/schemas/ErrorResponse", + "expect": "valid", + "direction": "response", + "principal": "configurer" + }, + { + "file": "error.message-key.invalid.json", + "schema": "common.yaml#/components/schemas/ErrorResponse", + "expect": "invalid", + "direction": "response", + "principal": "configurer" + }, + { + "file": "error.empty-message.invalid.json", + "schema": "common.yaml#/components/schemas/ErrorResponse", + "expect": "invalid", + "direction": "response", + "principal": "configurer" + }, + { + "file": "client-config.valid.json", + "schema": "streams.yaml#/components/schemas/ClientConfig", + "expect": "valid", + "direction": "response", + "operation": "getClientConfig", + "principal": "live_viewer" + }, + { + "file": "client-config.camelcase-only.invalid.json", + "schema": "streams.yaml#/components/schemas/ClientConfig", + "expect": "invalid", + "direction": "response", + "operation": "getClientConfig", + "principal": "live_viewer" + }, + { + "file": "detection-models.valid.json", + "schema": "streams.yaml#/components/schemas/DetectionModelsResponse", + "expect": "valid", + "direction": "response", + "operation": "listDetectionModels", + "principal": "configurer" + }, + { + "file": "detection-models.no-directory.valid.json", + "schema": "streams.yaml#/components/schemas/DetectionModelsResponse", + "expect": "valid", + "direction": "response", + "operation": "listDetectionModels", + "principal": "configurer" + }, + { + "file": "detection-models.unsupported-without-reason.invalid.json", + "schema": "streams.yaml#/components/schemas/DetectionModelsResponse", + "expect": "invalid", + "direction": "response", + "operation": "listDetectionModels", + "principal": "configurer" + }, + { + "file": "detection-models.403-viewer.valid.json", + "schema": "common.yaml#/components/schemas/ErrorResponse", + "expect": "valid", + "direction": "response", + "operation": "listDetectionModels", + "principal": "live_viewer" + }, + { + "file": "auth-verify.user.valid.json", + "schema": "streams.yaml#/components/schemas/AuthVerifyResponse", + "expect": "valid", + "direction": "response", + "operation": "verifyAuth", + "principal": "viewer_user" + }, + { + "file": "auth-verify.auth-disabled.valid.json", + "schema": "streams.yaml#/components/schemas/AuthVerifyResponse", + "expect": "valid", + "direction": "response", + "operation": "verifyAuth", + "principal": "anonymous_auth_disabled" + }, + { + "file": "auth-verify.demo.valid.json", + "schema": "streams.yaml#/components/schemas/AuthVerifyResponse", + "expect": "valid", + "direction": "response", + "operation": "verifyAuth", + "principal": "anonymous_demo" + }, + { + "file": "auth-verify.demo-as-admin.invalid.json", + "schema": "streams.yaml#/components/schemas/AuthVerifyResponse", + "expect": "invalid", + "direction": "response", + "operation": "verifyAuth", + "principal": "anonymous_demo" + }, + { + "file": "zones.valid.json", + "schema": "streams.yaml#/components/schemas/ZonesResponse", + "expect": "valid", + "direction": "response", + "operation": "getStreamZones", + "principal": "live_viewer" + }, + { + "file": "zones.empty.valid.json", + "schema": "streams.yaml#/components/schemas/ZonesResponse", + "expect": "valid", + "direction": "response", + "operation": "getStreamZones", + "principal": "live_viewer" + } + ] +} diff --git a/tests/contracts/fixtures/streams/path-encoding.cases.json b/tests/contracts/fixtures/streams/path-encoding.cases.json new file mode 100644 index 000000000..23fe8c0c2 --- /dev/null +++ b/tests/contracts/fixtures/streams/path-encoding.cases.json @@ -0,0 +1,84 @@ +{ + "$comment": "Synthetic path-encoding cases for T18/T19 (not schema fixtures). 'expected' is the current C behavior; F-T11-xx marks a finding candidate.", + "cases": [ + { + "name": "front-door", + "path": "/api/streams/front-door/full", + "expected": "resolves to front-door" + }, + { + "name": "Garage Cam", + "path": "/api/streams/Garage%20Cam/full", + "expected": "resolves to 'Garage Cam' (legacy name; new names cannot contain spaces)" + }, + { + "name": "Garage Cam", + "path": "/api/streams/Garage+Cam/full", + "expected": "also resolves to 'Garage Cam': path decoding maps '+' to space" + }, + { + "name": "a+b", + "path": "/api/streams/a%2Bb", + "expected": "resolves to 'a+b' (encodeURIComponent output)" + }, + { + "name": "a+b", + "path": "/api/streams/a+b", + "expected": "resolves to 'a b' (wrong stream / 404) because '+' decodes to space" + }, + { + "name": "cam.v2_east-1", + "path": "/api/streams/cam.v2_east-1", + "expected": "resolves; '.', '-' and '_' need no encoding" + }, + { + "name": "lobby/east", + "path": "/api/streams/lobby%2Feast/full", + "expected": "F-T11-08: /full truncates the decoded name at '/' and reads stream 'lobby'" + }, + { + "name": "lobby/east", + "path": "/api/streams/lobby%2Feast", + "expected": "PUT resolves to 'lobby/east'" + }, + { + "name": "..", + "path": "/api/streams/%2E%2E/full", + "expected": "rejected by the HTTP parser before routing (dot segment)" + }, + { + "name": "<255 x 'e'>", + "path": "/api/streams/<255 x 'e'>", + "expected": "resolves (255-byte name, 255-byte segment)" + }, + { + "name": "<100 x U+00E9>", + "path": "/api/streams/<100 x %C3%A9>", + "expected": "F-T11-09: 400 'Invalid request path' because the encoded segment is 600 bytes although the decoded name is 200" + }, + { + "name": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "path": "/api/streams/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee/full", + "expected": "resolves to the complete name (assuming the named stream and authorization exist)", + "encoded_suffix_bytes": 255 + }, + { + "name": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "path": "/api/streams/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee/full", + "expected": "F-T11-09: 400 because the encoded suffix including /full is 256 bytes", + "encoded_suffix_bytes": 256 + }, + { + "name": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "path": "/api/streams/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee/zones", + "expected": "resolves to the complete name (assuming the named stream and authorization exist)", + "encoded_suffix_bytes": 255 + }, + { + "name": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "path": "/api/streams/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee/zones", + "expected": "F-T11-09: 400 because the encoded suffix including /zones is 256 bytes", + "encoded_suffix_bytes": 256 + } + ] +} diff --git a/tests/contracts/fixtures/streams/put-response.200-privacy.valid.json b/tests/contracts/fixtures/streams/put-response.200-privacy.valid.json new file mode 100644 index 000000000..7418067c2 --- /dev/null +++ b/tests/contracts/fixtures/streams/put-response.200-privacy.valid.json @@ -0,0 +1,14 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "updateStream", + "direction": "response", + "status": 200, + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamPrivacyModeResponse", + "expect": "valid", + "body": { + "success": true, + "privacy_mode": true + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/put-response.202-onvif-failed.valid.json b/tests/contracts/fixtures/streams/put-response.202-onvif-failed.valid.json new file mode 100644 index 000000000..a20c7cac1 --- /dev/null +++ b/tests/contracts/fixtures/streams/put-response.202-onvif-failed.valid.json @@ -0,0 +1,17 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "updateStream", + "direction": "response", + "status": 202, + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamUpdateAccepted", + "expect": "valid", + "description": "ONVIF stream whose inline capability test failed; update still accepted.", + "body": { + "success": true, + "message": "Stream update request accepted and processing", + "onvif_status": "error", + "onvif_message": "Failed to detect ONVIF capabilities" + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/put-response.202-onvif-status-without-message.invalid.json b/tests/contracts/fixtures/streams/put-response.202-onvif-status-without-message.invalid.json new file mode 100644 index 000000000..48dfe0bcf --- /dev/null +++ b/tests/contracts/fixtures/streams/put-response.202-onvif-status-without-message.invalid.json @@ -0,0 +1,16 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "updateStream", + "direction": "response", + "status": 202, + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamUpdateAccepted", + "expect": "invalid", + "violates": "onvif_status and onvif_message appear together", + "body": { + "success": true, + "message": "Stream update request accepted and processing", + "onvif_status": "success" + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/put-response.202.valid.json b/tests/contracts/fixtures/streams/put-response.202.valid.json new file mode 100644 index 000000000..960a8a2db --- /dev/null +++ b/tests/contracts/fixtures/streams/put-response.202.valid.json @@ -0,0 +1,15 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "updateStream", + "direction": "response", + "status": 202, + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamUpdateAccepted", + "expect": "valid", + "description": "Non-ONVIF stream.", + "body": { + "success": true, + "message": "Stream update request accepted and processing" + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/put.clear-with-null.valid.json b/tests/contracts/fixtures/streams/put.clear-with-null.valid.json new file mode 100644 index 000000000..a2b64c792 --- /dev/null +++ b/tests/contracts/fixtures/streams/put.clear-with-null.valid.json @@ -0,0 +1,22 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "updateStream", + "direction": "request", + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "valid", + "expected_server_response": { + "status": 202 + }, + "description": "JSON null clears the seven clearable text fields.", + "body": { + "tags": null, + "admin_url": null, + "motion_trigger_source": null, + "go2rtc_source_override": null, + "sub_stream_url": null, + "detection_url": null, + "publish_url": null + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/put.detection-retention-minus-2.invalid.json b/tests/contracts/fixtures/streams/put.detection-retention-minus-2.invalid.json new file mode 100644 index 000000000..c57785016 --- /dev/null +++ b/tests/contracts/fixtures/streams/put.detection-retention-minus-2.invalid.json @@ -0,0 +1,19 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "updateStream", + "direction": "request", + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "invalid", + "violates": "detection_retention_days min -1", + "expected_server_response": { + "status": 400, + "body": { + "error": "detection_retention_days must be between -1 and 365" + } + }, + "body": { + "detection_retention_days": -2 + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/put.detection-url-file-scheme.invalid.json b/tests/contracts/fixtures/streams/put.detection-url-file-scheme.invalid.json new file mode 100644 index 000000000..aaef6f94c --- /dev/null +++ b/tests/contracts/fixtures/streams/put.detection-url-file-scheme.invalid.json @@ -0,0 +1,19 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "updateStream", + "direction": "request", + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "invalid", + "violates": "detection_url scheme allow-list", + "expected_server_response": { + "status": 400, + "body": { + "error": "detection_url must use http, https, rtsp, or rtsps" + } + }, + "body": { + "detection_url": "file:///etc/passwd" + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/put.detection-url-too-long.invalid.json b/tests/contracts/fixtures/streams/put.detection-url-too-long.invalid.json new file mode 100644 index 000000000..95122de25 --- /dev/null +++ b/tests/contracts/fixtures/streams/put.detection-url-too-long.invalid.json @@ -0,0 +1,19 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "updateStream", + "direction": "request", + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "invalid", + "violates": "detection_url >= 512 bytes", + "expected_server_response": { + "status": 413, + "body": { + "error": "detection_url exceeds size limit" + } + }, + "body": { + "detection_url": "rtsp://192.0.2.10/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/put.edit-form.valid.json b/tests/contracts/fixtures/streams/put.edit-form.valid.json new file mode 100644 index 000000000..e7a00fce6 --- /dev/null +++ b/tests/contracts/fixtures/streams/put.edit-form.valid.json @@ -0,0 +1,407 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "updateStream", + "direction": "request", + "principal": "configurer", + "request": { + "method": "PUT", + "path": "/api/streams/front-door" + }, + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "valid", + "expected_server_response": { + "status": 202, + "schema": "streams.yaml#/components/schemas/StreamUpdateAccepted" + }, + "description": "Full edit-form payload as StreamsView.handleSubmit builds it, minus name and is_deleted.", + "body": { + "url": "rtsp://192.0.2.10:554/Streaming/Channels/101", + "admin_url": "http://192.0.2.10/", + "enabled": true, + "streaming_enabled": true, + "playback_transport": "auto", + "codec": "h264", + "protocol": 0, + "priority": 5, + "segment_duration": 900, + "record": true, + "detection_based_recording": false, + "detection_model": "motion", + "isOnvif": true, + "onvif_username": "synthetic-user", + "onvif_password": "synthetic-pass-1", + "onvif_profile": "Profile_1", + "onvif_port": 0, + "detection_threshold": 50, + "detection_interval": 10, + "pre_detection_buffer": 5, + "post_detection_buffer": 10, + "record_audio": true, + "audio_voice_enhancement": false, + "backchannel_enabled": false, + "ptz_enabled": false, + "ptz_max_x": 0, + "ptz_max_y": 0, + "ptz_max_z": 0, + "ptz_has_home": false, + "detection_object_filter": "none", + "detection_object_filter_list": "", + "retention_days": -1, + "detection_retention_days": 0, + "max_storage_mb": 0, + "tier_critical_multiplier": 3, + "tier_important_multiplier": 2, + "tier_ephemeral_multiplier": 0.25, + "storage_priority": 5, + "record_on_schedule": true, + "recording_schedule": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ], + "detection_record_on_schedule": false, + "detection_recording_schedule": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "tags": "outdoor,entrance", + "motion_trigger_source": "", + "go2rtc_source_override": "", + "publish_url": "", + "sub_stream_url": "rtsp://192.0.2.10:554/Streaming/Channels/102", + "detection_url": "", + "eptz_config": "" + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/put.empty-object.valid.json b/tests/contracts/fixtures/streams/put.empty-object.valid.json new file mode 100644 index 000000000..5c42a03bb --- /dev/null +++ b/tests/contracts/fixtures/streams/put.empty-object.valid.json @@ -0,0 +1,14 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "updateStream", + "direction": "request", + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "valid", + "expected_server_response": { + "status": 202 + }, + "description": "Empty partial update is accepted (no-op apart from isOnvif recomputation, F-T11-11).", + "body": {}, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/put.eptz-not-string.invalid.json b/tests/contracts/fixtures/streams/put.eptz-not-string.invalid.json new file mode 100644 index 000000000..bfa15b1ce --- /dev/null +++ b/tests/contracts/fixtures/streams/put.eptz-not-string.invalid.json @@ -0,0 +1,21 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "updateStream", + "direction": "request", + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "invalid", + "violates": "eptz_config is JSON text, not an object", + "expected_server_response": { + "status": 400, + "body": { + "error": "eptz_config must be a JSON string" + } + }, + "body": { + "eptz_config": { + "version": 1 + } + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/put.eptz-wrong-projection.invalid.json b/tests/contracts/fixtures/streams/put.eptz-wrong-projection.invalid.json new file mode 100644 index 000000000..ad8d68454 --- /dev/null +++ b/tests/contracts/fixtures/streams/put.eptz-wrong-projection.invalid.json @@ -0,0 +1,19 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "updateStream", + "direction": "request", + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "invalid", + "violates": "eptz_config must be a v1 equidistant ceiling document (contentSchema; annotation-only in 2020-12, so a validator may need explicit contentSchema support)", + "expected_server_response": { + "status": 400, + "body": { + "error": "eptz_config is not a supported version-1 equidistant ceiling configuration" + } + }, + "body": { + "eptz_config": "{\"version\":1,\"projection\":\"rectilinear\"}" + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/put.is-deleted.invalid.json b/tests/contracts/fixtures/streams/put.is-deleted.invalid.json new file mode 100644 index 000000000..3e10c5679 --- /dev/null +++ b/tests/contracts/fixtures/streams/put.is-deleted.invalid.json @@ -0,0 +1,404 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "updateStream", + "direction": "request", + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "invalid", + "violates": "unknown key is_deleted (D-01)", + "expected_server_response": { + "status": 202, + "note": "server ignores the key" + }, + "body": { + "url": "rtsp://192.0.2.10:554/Streaming/Channels/101", + "admin_url": "http://192.0.2.10/", + "enabled": true, + "streaming_enabled": true, + "playback_transport": "auto", + "codec": "h264", + "protocol": 0, + "priority": 5, + "segment_duration": 900, + "record": true, + "detection_based_recording": false, + "detection_model": "motion", + "isOnvif": true, + "onvif_username": "synthetic-user", + "onvif_password": "synthetic-pass-1", + "onvif_profile": "Profile_1", + "onvif_port": 0, + "detection_threshold": 50, + "detection_interval": 10, + "pre_detection_buffer": 5, + "post_detection_buffer": 10, + "record_audio": true, + "audio_voice_enhancement": false, + "backchannel_enabled": false, + "ptz_enabled": false, + "ptz_max_x": 0, + "ptz_max_y": 0, + "ptz_max_z": 0, + "ptz_has_home": false, + "detection_object_filter": "none", + "detection_object_filter_list": "", + "retention_days": -1, + "detection_retention_days": 0, + "max_storage_mb": 0, + "tier_critical_multiplier": 3, + "tier_important_multiplier": 2, + "tier_ephemeral_multiplier": 0.25, + "storage_priority": 5, + "record_on_schedule": true, + "recording_schedule": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ], + "detection_record_on_schedule": false, + "detection_recording_schedule": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "tags": "outdoor,entrance", + "motion_trigger_source": "", + "go2rtc_source_override": "", + "publish_url": "", + "sub_stream_url": "rtsp://192.0.2.10:554/Streaming/Channels/102", + "detection_url": "", + "eptz_config": "", + "is_deleted": false + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/put.name-in-body.invalid.json b/tests/contracts/fixtures/streams/put.name-in-body.invalid.json new file mode 100644 index 000000000..78e15102d --- /dev/null +++ b/tests/contracts/fixtures/streams/put.name-in-body.invalid.json @@ -0,0 +1,18 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "updateStream", + "direction": "request", + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "invalid", + "violates": "name is the path key; rename is unsupported", + "expected_server_response": { + "status": 202, + "note": "server ignores name" + }, + "body": { + "name": "renamed", + "tags": "x" + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/put.playback-transport-bogus.invalid.json b/tests/contracts/fixtures/streams/put.playback-transport-bogus.invalid.json new file mode 100644 index 000000000..334efae02 --- /dev/null +++ b/tests/contracts/fixtures/streams/put.playback-transport-bogus.invalid.json @@ -0,0 +1,19 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "updateStream", + "direction": "request", + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "invalid", + "violates": "playback_transport enum", + "expected_server_response": { + "status": 400, + "body": { + "error": "playback_transport is invalid" + } + }, + "body": { + "playback_transport": "webrtc" + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/put.privacy-mixed-with-edit.invalid.json b/tests/contracts/fixtures/streams/put.privacy-mixed-with-edit.invalid.json new file mode 100644 index 000000000..69f2237bb --- /dev/null +++ b/tests/contracts/fixtures/streams/put.privacy-mixed-with-edit.invalid.json @@ -0,0 +1,18 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "updateStream", + "direction": "request", + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamPrivacyModeRequest", + "expect": "invalid", + "violates": "set_privacy_mode cannot be combined with edits (the edits would be discarded)", + "expected_server_response": { + "status": 200, + "note": "server sets privacy_mode and discards retention_days (F-T11-12)" + }, + "body": { + "set_privacy_mode": true, + "retention_days": 30 + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/put.protocol-out-of-enum.invalid.json b/tests/contracts/fixtures/streams/put.protocol-out-of-enum.invalid.json new file mode 100644 index 000000000..83a6c69c0 --- /dev/null +++ b/tests/contracts/fixtures/streams/put.protocol-out-of-enum.invalid.json @@ -0,0 +1,17 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "updateStream", + "direction": "request", + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "invalid", + "violates": "protocol is 0 or 1", + "expected_server_response": { + "status": 202, + "note": "server stores any integer (F-T11-06)" + }, + "body": { + "protocol": 7 + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/put.publish-and-detection-url.valid.json b/tests/contracts/fixtures/streams/put.publish-and-detection-url.valid.json new file mode 100644 index 000000000..a79249a6a --- /dev/null +++ b/tests/contracts/fixtures/streams/put.publish-and-detection-url.valid.json @@ -0,0 +1,17 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "updateStream", + "direction": "request", + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "valid", + "expected_server_response": { + "status": 202 + }, + "description": "Mixed-case schemes and a two-destination publish list.", + "body": { + "detection_url": "HTTP://192.0.2.10/mjpeg", + "publish_url": " RTMPS://live.example.invalid/app/k1,rtmp://b.example.invalid/x " + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/put.publish-url-http.invalid.json b/tests/contracts/fixtures/streams/put.publish-url-http.invalid.json new file mode 100644 index 000000000..c4bce2af1 --- /dev/null +++ b/tests/contracts/fixtures/streams/put.publish-url-http.invalid.json @@ -0,0 +1,19 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "updateStream", + "direction": "request", + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "invalid", + "violates": "publish_url must be rtmp/rtmps", + "expected_server_response": { + "status": 400, + "body": { + "error": "publish_url destinations must be rtmp:// or rtmps:// URLs" + } + }, + "body": { + "publish_url": "http://live.example.invalid/app" + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/put.publish-url-quote.invalid.json b/tests/contracts/fixtures/streams/put.publish-url-quote.invalid.json new file mode 100644 index 000000000..303117f15 --- /dev/null +++ b/tests/contracts/fixtures/streams/put.publish-url-quote.invalid.json @@ -0,0 +1,19 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "updateStream", + "direction": "request", + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "invalid", + "violates": "publish_url rejects quote characters", + "expected_server_response": { + "status": 400, + "body": { + "error": "publish_url destinations must be rtmp:// or rtmps:// URLs" + } + }, + "body": { + "publish_url": "rtmp://live.example.invalid/a\"b" + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/put.record-as-string.invalid.json b/tests/contracts/fixtures/streams/put.record-as-string.invalid.json new file mode 100644 index 000000000..82d2dc622 --- /dev/null +++ b/tests/contracts/fixtures/streams/put.record-as-string.invalid.json @@ -0,0 +1,17 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "updateStream", + "direction": "request", + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "invalid", + "violates": "record must be boolean", + "expected_server_response": { + "status": 202, + "note": "server silently ignores wrong-typed values (F-T11-05)" + }, + "body": { + "record": "true" + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/put.retention-366.invalid.json b/tests/contracts/fixtures/streams/put.retention-366.invalid.json new file mode 100644 index 000000000..edfb8c865 --- /dev/null +++ b/tests/contracts/fixtures/streams/put.retention-366.invalid.json @@ -0,0 +1,19 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "updateStream", + "direction": "request", + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "invalid", + "violates": "retention_days max 365", + "expected_server_response": { + "status": 400, + "body": { + "error": "retention_days must be between -1 and 365" + } + }, + "body": { + "retention_days": 366 + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/put.retention-finite-boundary.valid.json b/tests/contracts/fixtures/streams/put.retention-finite-boundary.valid.json new file mode 100644 index 000000000..04b2b7951 --- /dev/null +++ b/tests/contracts/fixtures/streams/put.retention-finite-boundary.valid.json @@ -0,0 +1,17 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "updateStream", + "direction": "request", + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "valid", + "expected_server_response": { + "status": 202 + }, + "description": "Upper boundary 365 days for both retention fields.", + "body": { + "retention_days": 365, + "detection_retention_days": 1 + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/put.retention-tristate.valid.json b/tests/contracts/fixtures/streams/put.retention-tristate.valid.json new file mode 100644 index 000000000..ed6bb32f5 --- /dev/null +++ b/tests/contracts/fixtures/streams/put.retention-tristate.valid.json @@ -0,0 +1,22 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "updateStream", + "direction": "request", + "principal": "configurer", + "request": { + "method": "PUT", + "path": "/api/streams/front-door" + }, + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "valid", + "expected_server_response": { + "status": 202 + }, + "description": "Partial update: recordings inherit global retention (-1), detection recordings unlimited (0), quota 2048 MB.", + "body": { + "retention_days": -1, + "detection_retention_days": 0, + "max_storage_mb": 2048 + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/put.schedule-weekday.valid.json b/tests/contracts/fixtures/streams/put.schedule-weekday.valid.json new file mode 100644 index 000000000..062b163e3 --- /dev/null +++ b/tests/contracts/fixtures/streams/put.schedule-weekday.valid.json @@ -0,0 +1,186 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "updateStream", + "direction": "request", + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "valid", + "expected_server_response": { + "status": 202 + }, + "description": "Enable schedule gating: Mon-Fri 08:00-17:59 server local time (index day*24+hour, Sunday=0).", + "body": { + "record_on_schedule": true, + "recording_schedule": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ] + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/put.schedule-wrong-length.invalid.json b/tests/contracts/fixtures/streams/put.schedule-wrong-length.invalid.json new file mode 100644 index 000000000..6549d78ee --- /dev/null +++ b/tests/contracts/fixtures/streams/put.schedule-wrong-length.invalid.json @@ -0,0 +1,42 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "updateStream", + "direction": "request", + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "invalid", + "violates": "schedule must have 168 entries", + "expected_server_response": { + "status": 202, + "note": "server silently ignores the array (F-T11-07)" + }, + "body": { + "recording_schedule": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ] + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/put.set-privacy-mode.valid.json b/tests/contracts/fixtures/streams/put.set-privacy-mode.valid.json new file mode 100644 index 000000000..066a864c2 --- /dev/null +++ b/tests/contracts/fixtures/streams/put.set-privacy-mode.valid.json @@ -0,0 +1,21 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "updateStream", + "direction": "request", + "principal": "configurer", + "request": { + "method": "PUT", + "path": "/api/streams/front-door" + }, + "schema": "streams.yaml#/components/schemas/StreamPrivacyModeRequest", + "expect": "valid", + "expected_server_response": { + "status": 200, + "schema": "streams.yaml#/components/schemas/StreamPrivacyModeResponse" + }, + "description": "Live cell privacy toggle (out of pilot flow, same operation).", + "body": { + "set_privacy_mode": true + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/put.tags-too-long.invalid.json b/tests/contracts/fixtures/streams/put.tags-too-long.invalid.json new file mode 100644 index 000000000..eea50d405 --- /dev/null +++ b/tests/contracts/fixtures/streams/put.tags-too-long.invalid.json @@ -0,0 +1,17 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "updateStream", + "direction": "request", + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamUpdateRequest", + "expect": "invalid", + "violates": "tags max 255 bytes", + "expected_server_response": { + "status": 202, + "note": "server silently truncates to 255 bytes (F-T11-14)" + }, + "body": { + "tags": "tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt" + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/summary.admin.admin-url-without-configure.invalid.json b/tests/contracts/fixtures/streams/summary.admin.admin-url-without-configure.invalid.json new file mode 100644 index 000000000..aa856f8e2 --- /dev/null +++ b/tests/contracts/fixtures/streams/summary.admin.admin-url-without-configure.invalid.json @@ -0,0 +1,46 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "listStreams", + "direction": "response", + "status": 200, + "principal": "live_viewer", + "schema": "streams.yaml#/components/schemas/StreamSummaryPageAdmin", + "expect": "invalid", + "violates": "admin_url must be \"\" on rows where can_configure is false", + "body": { + "streams": [ + { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "name": "front-door", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "location_name": "North Gate", + "location_path": "Campus / North Gate", + "enabled": true, + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "protocol": 0, + "record": true, + "record_on_schedule": true, + "detection_based_recording": false, + "isOnvif": true, + "tags": "outdoor,entrance", + "status": "Running", + "availability": "live", + "first_video_at": 1767225600, + "last_frame_ts": 1793404800, + "current_fps": 14.8, + "recording_active": true, + "last_recording_at": 1793404740, + "can_configure": false, + "admin_url": "http://192.0.2.10/" + } + ], + "total": 1, + "page": 1, + "page_size": 50, + "total_pages": 1 + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/summary.admin.configurer-with-admin-url.valid.json b/tests/contracts/fixtures/streams/summary.admin.configurer-with-admin-url.valid.json new file mode 100644 index 000000000..e8cc4edcf --- /dev/null +++ b/tests/contracts/fixtures/streams/summary.admin.configurer-with-admin-url.valid.json @@ -0,0 +1,84 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "listStreams", + "direction": "response", + "status": 200, + "principal": "configurer_of_front_door_only", + "request": { + "method": "GET", + "path": "/api/streams", + "query": { + "summary": "true", + "surface": "admin", + "include_admin_url": "true", + "page": "1", + "page_size": "50" + } + }, + "schema": "streams.yaml#/components/schemas/StreamSummaryPageAdmin", + "expect": "valid", + "description": "Mixed per-camera permissions: admin_url real where can_configure, \"\" where not. Legacy row with empty location and never_connected.", + "body": { + "streams": [ + { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "name": "front-door", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "location_name": "North Gate", + "location_path": "Campus / North Gate", + "enabled": true, + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "protocol": 0, + "record": true, + "record_on_schedule": true, + "detection_based_recording": false, + "isOnvif": true, + "tags": "outdoor,entrance", + "status": "Running", + "availability": "live", + "first_video_at": 1767225600, + "last_frame_ts": 1793404800, + "current_fps": 14.8, + "recording_active": true, + "last_recording_at": 1793404740, + "can_configure": true, + "admin_url": "http://192.0.2.10/" + }, + { + "camera_uuid": "7a2b3c4d-5e6f-4a1b-9c2d-3e4f5a6b7c8d", + "name": "lobby", + "location_uuid": "", + "location_name": "", + "location_path": "", + "enabled": true, + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "protocol": 0, + "record": true, + "record_on_schedule": true, + "detection_based_recording": false, + "isOnvif": false, + "tags": "", + "status": "Unknown", + "availability": "never_connected", + "first_video_at": 0, + "last_frame_ts": 0, + "current_fps": 0, + "recording_active": false, + "last_recording_at": 0, + "can_configure": false, + "admin_url": "" + } + ], + "total": 2, + "page": 1, + "page_size": 50, + "total_pages": 1 + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/summary.admin.contains-url.invalid.json b/tests/contracts/fixtures/streams/summary.admin.contains-url.invalid.json new file mode 100644 index 000000000..dc5928f51 --- /dev/null +++ b/tests/contracts/fixtures/streams/summary.admin.contains-url.invalid.json @@ -0,0 +1,46 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "listStreams", + "direction": "response", + "status": 200, + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamSummaryPageAdmin", + "expect": "invalid", + "violates": "summary rows never carry url (even for configurers)", + "body": { + "streams": [ + { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "name": "front-door", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "location_name": "North Gate", + "location_path": "Campus / North Gate", + "enabled": true, + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "protocol": 0, + "record": true, + "record_on_schedule": true, + "detection_based_recording": false, + "isOnvif": true, + "tags": "outdoor,entrance", + "status": "Running", + "availability": "live", + "first_video_at": 1767225600, + "last_frame_ts": 1793404800, + "current_fps": 14.8, + "recording_active": true, + "last_recording_at": 1793404740, + "can_configure": true, + "url": "rtsp://192.0.2.10/live" + } + ], + "total": 1, + "page": 1, + "page_size": 50, + "total_pages": 1 + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/summary.admin.empty.valid.json b/tests/contracts/fixtures/streams/summary.admin.empty.valid.json new file mode 100644 index 000000000..31c7ea95f --- /dev/null +++ b/tests/contracts/fixtures/streams/summary.admin.empty.valid.json @@ -0,0 +1,25 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "listStreams", + "direction": "response", + "status": 200, + "principal": "no_camera_grants", + "request": { + "method": "GET", + "path": "/api/streams", + "query": { + "summary": "true" + } + }, + "schema": "streams.yaml#/components/schemas/StreamSummaryPageAdmin", + "expect": "valid", + "description": "No visible cameras: total 0, total_pages 0.", + "body": { + "streams": [], + "total": 0, + "page": 1, + "page_size": 50, + "total_pages": 0 + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/summary.admin.missing-can-configure.invalid.json b/tests/contracts/fixtures/streams/summary.admin.missing-can-configure.invalid.json new file mode 100644 index 000000000..a534e46ac --- /dev/null +++ b/tests/contracts/fixtures/streams/summary.admin.missing-can-configure.invalid.json @@ -0,0 +1,44 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "listStreams", + "direction": "response", + "status": 200, + "principal": "live_viewer", + "schema": "streams.yaml#/components/schemas/StreamSummaryPageAdmin", + "expect": "invalid", + "violates": "can_configure is always emitted", + "body": { + "streams": [ + { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "name": "front-door", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "location_name": "North Gate", + "location_path": "Campus / North Gate", + "enabled": true, + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "protocol": 0, + "record": true, + "record_on_schedule": true, + "detection_based_recording": false, + "isOnvif": true, + "tags": "outdoor,entrance", + "status": "Running", + "availability": "live", + "first_video_at": 1767225600, + "last_frame_ts": 1793404800, + "current_fps": 14.8, + "recording_active": true, + "last_recording_at": 1793404740 + } + ], + "total": 1, + "page": 1, + "page_size": 50, + "total_pages": 1 + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/summary.admin.page-beyond-end.valid.json b/tests/contracts/fixtures/streams/summary.admin.page-beyond-end.valid.json new file mode 100644 index 000000000..552a6c37d --- /dev/null +++ b/tests/contracts/fixtures/streams/summary.admin.page-beyond-end.valid.json @@ -0,0 +1,26 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "listStreams", + "direction": "response", + "status": 200, + "principal": "live_viewer", + "request": { + "method": "GET", + "path": "/api/streams", + "query": { + "summary": "true", + "page": "9" + } + }, + "schema": "streams.yaml#/components/schemas/StreamSummaryPageAdmin", + "expect": "valid", + "description": "A page past the end is empty with real totals.", + "body": { + "streams": [], + "total": 3, + "page": 9, + "page_size": 50, + "total_pages": 1 + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/summary.admin.page-size-over-max.invalid.json b/tests/contracts/fixtures/streams/summary.admin.page-size-over-max.invalid.json new file mode 100644 index 000000000..ffce2f466 --- /dev/null +++ b/tests/contracts/fixtures/streams/summary.admin.page-size-over-max.invalid.json @@ -0,0 +1,18 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "listStreams", + "direction": "response", + "status": 200, + "principal": "live_viewer", + "schema": "streams.yaml#/components/schemas/StreamSummaryPageAdmin", + "expect": "invalid", + "violates": "page_size maximum is 100", + "body": { + "streams": [], + "total": 0, + "page": 1, + "page_size": 101, + "total_pages": 0 + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/summary.admin.status-from-detail-enum.invalid.json b/tests/contracts/fixtures/streams/summary.admin.status-from-detail-enum.invalid.json new file mode 100644 index 000000000..ee9833095 --- /dev/null +++ b/tests/contracts/fixtures/streams/summary.admin.status-from-detail-enum.invalid.json @@ -0,0 +1,45 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "listStreams", + "direction": "response", + "status": 200, + "principal": "live_viewer", + "schema": "streams.yaml#/components/schemas/StreamSummaryPageAdmin", + "expect": "invalid", + "violates": "summary status never uses Reconnecting (detail-only states)", + "body": { + "streams": [ + { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "name": "front-door", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "location_name": "North Gate", + "location_path": "Campus / North Gate", + "enabled": true, + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "protocol": 0, + "record": true, + "record_on_schedule": true, + "detection_based_recording": false, + "isOnvif": true, + "tags": "outdoor,entrance", + "status": "Reconnecting", + "availability": "live", + "first_video_at": 1767225600, + "last_frame_ts": 1793404800, + "current_fps": 14.8, + "recording_active": true, + "last_recording_at": 1793404740, + "can_configure": false + } + ], + "total": 1, + "page": 1, + "page_size": 50, + "total_pages": 1 + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/summary.admin.viewer.valid.json b/tests/contracts/fixtures/streams/summary.admin.viewer.valid.json new file mode 100644 index 000000000..bfb605528 --- /dev/null +++ b/tests/contracts/fixtures/streams/summary.admin.viewer.valid.json @@ -0,0 +1,52 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "listStreams", + "direction": "response", + "status": 200, + "principal": "live_viewer", + "request": { + "method": "GET", + "path": "/api/streams", + "query": { + "summary": "1" + } + }, + "schema": "streams.yaml#/components/schemas/StreamSummaryPageAdmin", + "expect": "valid", + "description": "Defaults (surface=admin, page 1, size 50), no include_admin_url.", + "body": { + "streams": [ + { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "name": "front-door", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "location_name": "North Gate", + "location_path": "Campus / North Gate", + "enabled": true, + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "protocol": 0, + "record": true, + "record_on_schedule": true, + "detection_based_recording": false, + "isOnvif": true, + "tags": "outdoor,entrance", + "status": "Running", + "availability": "live", + "first_video_at": 1767225600, + "last_frame_ts": 1793404800, + "current_fps": 14.8, + "recording_active": true, + "last_recording_at": 1793404740, + "can_configure": false + } + ], + "total": 1, + "page": 1, + "page_size": 50, + "total_pages": 1 + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/summary.live.contains-admin-url.invalid.json b/tests/contracts/fixtures/streams/summary.live.contains-admin-url.invalid.json new file mode 100644 index 000000000..b6d7f64e8 --- /dev/null +++ b/tests/contracts/fixtures/streams/summary.live.contains-admin-url.invalid.json @@ -0,0 +1,56 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "listStreams", + "direction": "response", + "status": 200, + "principal": "configurer", + "schema": "streams.yaml#/components/schemas/StreamSummaryPageLive", + "expect": "invalid", + "violates": "the live surface never emits admin_url", + "body": { + "streams": [ + { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "name": "front-door", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "location_name": "North Gate", + "location_path": "Campus / North Gate", + "enabled": true, + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "protocol": 0, + "record": true, + "record_on_schedule": true, + "detection_based_recording": false, + "isOnvif": true, + "tags": "outdoor,entrance", + "status": "Running", + "availability": "live", + "first_video_at": 1767225600, + "last_frame_ts": 1793404800, + "current_fps": 14.8, + "recording_active": true, + "last_recording_at": 1793404740, + "can_configure": true, + "admin_url": "", + "streaming_enabled": true, + "playback_transport": "mse_then_hls", + "eptz_config": "{\"version\":1,\"projection\":\"equidistant\",\"mount\":\"ceiling\",\"centerX\":0.5,\"centerY\":0.5,\"radius\":0.48,\"fov\":180,\"rotation\":0,\"defaultYaw\":0,\"defaultTilt\":-45,\"defaultViewFov\":75}", + "detection_model": "motion", + "privacy_mode": false, + "can_control_privacy": true, + "has_sub_stream": true, + "ptz_enabled": false, + "backchannel_enabled": false, + "go2rtc_hls_available": true + } + ], + "total": 1, + "page": 1, + "page_size": 50, + "total_pages": 1 + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/summary.live.contains-onvif-password.invalid.json b/tests/contracts/fixtures/streams/summary.live.contains-onvif-password.invalid.json new file mode 100644 index 000000000..f73c4f428 --- /dev/null +++ b/tests/contracts/fixtures/streams/summary.live.contains-onvif-password.invalid.json @@ -0,0 +1,56 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "listStreams", + "direction": "response", + "status": 200, + "principal": "live_viewer", + "schema": "streams.yaml#/components/schemas/StreamSummaryPageLive", + "expect": "invalid", + "violates": "summary rows never carry onvif_password, even empty", + "body": { + "streams": [ + { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "name": "front-door", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "location_name": "North Gate", + "location_path": "Campus / North Gate", + "enabled": true, + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "protocol": 0, + "record": true, + "record_on_schedule": true, + "detection_based_recording": false, + "isOnvif": true, + "tags": "outdoor,entrance", + "status": "Running", + "availability": "live", + "first_video_at": 1767225600, + "last_frame_ts": 1793404800, + "current_fps": 14.8, + "recording_active": true, + "last_recording_at": 1793404740, + "can_configure": false, + "onvif_password": "", + "streaming_enabled": true, + "playback_transport": "mse_then_hls", + "eptz_config": "{\"version\":1,\"projection\":\"equidistant\",\"mount\":\"ceiling\",\"centerX\":0.5,\"centerY\":0.5,\"radius\":0.48,\"fov\":180,\"rotation\":0,\"defaultYaw\":0,\"defaultTilt\":-45,\"defaultViewFov\":75}", + "detection_model": "motion", + "privacy_mode": false, + "can_control_privacy": false, + "has_sub_stream": true, + "ptz_enabled": false, + "backchannel_enabled": false, + "go2rtc_hls_available": true + } + ], + "total": 1, + "page": 1, + "page_size": 50, + "total_pages": 1 + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/summary.live.viewer.valid.json b/tests/contracts/fixtures/streams/summary.live.viewer.valid.json new file mode 100644 index 000000000..9b89c2525 --- /dev/null +++ b/tests/contracts/fixtures/streams/summary.live.viewer.valid.json @@ -0,0 +1,64 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "listStreams", + "direction": "response", + "status": 200, + "principal": "live_viewer", + "request": { + "method": "GET", + "path": "/api/streams", + "query": { + "summary": "true", + "surface": "live", + "page_size": "100" + } + }, + "schema": "streams.yaml#/components/schemas/StreamSummaryPageLive", + "expect": "valid", + "description": "Live surface row with ePTZ config.", + "body": { + "streams": [ + { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "name": "front-door", + "location_uuid": "0a1b2c3d-4e5f-4061-8273-94a5b6c7d8e9", + "location_name": "North Gate", + "location_path": "Campus / North Gate", + "enabled": true, + "width": 1920, + "height": 1080, + "fps": 15, + "codec": "h264", + "protocol": 0, + "record": true, + "record_on_schedule": true, + "detection_based_recording": false, + "isOnvif": true, + "tags": "outdoor,entrance", + "status": "Running", + "availability": "live", + "first_video_at": 1767225600, + "last_frame_ts": 1793404800, + "current_fps": 14.8, + "recording_active": true, + "last_recording_at": 1793404740, + "can_configure": false, + "streaming_enabled": true, + "playback_transport": "mse_then_hls", + "eptz_config": "{\"version\":1,\"projection\":\"equidistant\",\"mount\":\"ceiling\",\"centerX\":0.5,\"centerY\":0.5,\"radius\":0.48,\"fov\":180,\"rotation\":0,\"defaultYaw\":0,\"defaultTilt\":-45,\"defaultViewFov\":75}", + "detection_model": "motion", + "privacy_mode": false, + "can_control_privacy": false, + "has_sub_stream": true, + "ptz_enabled": false, + "backchannel_enabled": false, + "go2rtc_hls_available": true + } + ], + "total": 1, + "page": 1, + "page_size": 100, + "total_pages": 1 + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/summary.lpr.leaks-location.invalid.json b/tests/contracts/fixtures/streams/summary.lpr.leaks-location.invalid.json new file mode 100644 index 000000000..9e6225c97 --- /dev/null +++ b/tests/contracts/fixtures/streams/summary.lpr.leaks-location.invalid.json @@ -0,0 +1,24 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "listStreams", + "direction": "response", + "status": 200, + "principal": "lpr_searcher", + "schema": "streams.yaml#/components/schemas/StreamSummaryPageLpr", + "expect": "invalid", + "violates": "LPR rows are identity-only (closed object)", + "body": { + "streams": [ + { + "camera_uuid": "6f1c2a9e-3b4d-4e5f-8a7b-0c1d2e3f4a5b", + "name": "front-door", + "location_path": "Campus / North Gate" + } + ], + "total": 1, + "page": 1, + "page_size": 50, + "total_pages": 1 + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/summary.lpr.valid.json b/tests/contracts/fixtures/streams/summary.lpr.valid.json new file mode 100644 index 000000000..341404426 --- /dev/null +++ b/tests/contracts/fixtures/streams/summary.lpr.valid.json @@ -0,0 +1,33 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "listStreams", + "direction": "response", + "status": 200, + "principal": "lpr_searcher", + "request": { + "method": "GET", + "path": "/api/streams", + "query": { + "summary": "true", + "surface": "lpr", + "page": "2", + "page_size": "1" + } + }, + "schema": "streams.yaml#/components/schemas/StreamSummaryPageLpr", + "expect": "valid", + "description": "LPR identity-only rows, second page of 2.", + "body": { + "streams": [ + { + "camera_uuid": "7a2b3c4d-5e6f-4a1b-9c2d-3e4f5a6b7c8d", + "name": "lobby" + } + ], + "total": 2, + "page": 2, + "page_size": 1, + "total_pages": 2 + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/zones.empty.valid.json b/tests/contracts/fixtures/streams/zones.empty.valid.json new file mode 100644 index 000000000..a4202973e --- /dev/null +++ b/tests/contracts/fixtures/streams/zones.empty.valid.json @@ -0,0 +1,13 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "getStreamZones", + "direction": "response", + "status": 200, + "principal": "live_viewer", + "schema": "streams.yaml#/components/schemas/ZonesResponse", + "expect": "valid", + "body": { + "zones": [] + }, + "schema_base": "docs/api/contracts/" +} diff --git a/tests/contracts/fixtures/streams/zones.valid.json b/tests/contracts/fixtures/streams/zones.valid.json new file mode 100644 index 000000000..58bae80a5 --- /dev/null +++ b/tests/contracts/fixtures/streams/zones.valid.json @@ -0,0 +1,37 @@ +{ + "$comment": "Synthetic, manually reviewed contract fixture (T11). Not a capture of server output. No real credentials: synthetic-* values and RFC 5737/.invalid hosts only.", + "operation": "getStreamZones", + "direction": "response", + "status": 200, + "principal": "live_viewer", + "schema": "streams.yaml#/components/schemas/ZonesResponse", + "expect": "valid", + "body": { + "zones": [ + { + "id": "zone-1", + "stream_name": "front-door", + "name": "Driveway", + "enabled": true, + "color": "#3b82f6", + "polygon": [ + { + "x": 0.1, + "y": 0.2 + }, + { + "x": 0.9, + "y": 0.2 + }, + { + "x": 0.5, + "y": 0.95 + } + ], + "filter_classes": "person,car", + "min_confidence": 0 + } + ] + }, + "schema_base": "docs/api/contracts/" +} From c285a0c24905fcc065239d759f4cfdf35374a530 Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Sat, 31 Oct 2026 03:33:02 -0400 Subject: [PATCH 009/230] fix(quality): require recorded approval for findings exceptions --- quality/evidence/T7.1.md | 32 ++++++++ quality/findings-policy.json | 3 +- scripts/quality/findings.py | 29 +++++++ .../fixtures/findings/base/inventory.json | 70 +++++++++++++++-- tests/quality/test_findings.py | 75 ++++++++++++++++++- 5 files changed, 200 insertions(+), 9 deletions(-) create mode 100644 quality/evidence/T7.1.md diff --git a/quality/evidence/T7.1.md b/quality/evidence/T7.1.md new file mode 100644 index 000000000..b88846745 --- /dev/null +++ b/quality/evidence/T7.1.md @@ -0,0 +1,32 @@ +# T7.1: Explicit approval for findings exceptions + +The resumed T6 implementation accepted gaps whose status was `proposed-by-T6`, +and treated proposed inventory exception expiry dates as consent. The checker +now fails closed until a review is recorded. No production approval was added. + +Both coverage gaps and exception dispositions require a nonempty owner and +reason, plus `approval` containing `status: approved`, `approved_by`, +`approved_on` (a valid date no later than the evaluation date), and `evidence` +(a review reference). A conflicting top-level proposed status also fails. +Missing approval is a configuration failure, so `--update-baseline --reason` +cannot turn it into acceptance. This validates the recorded review metadata; +repository review controls remain responsible for authenticating the reviewer. + +## Verification + +- RED: added approval regressions before implementation; 65 tests ran with 28 + failing assertions/subcases. Log: `build/eng-artifacts/T7.1/red.log`. +- GREEN: `python3 -m unittest discover -s tests/quality -p test_findings.py`: + 65 tests pass. Log: `build/eng-artifacts/T7.1/green.log`. +- Synthetic approvals exist only in the test inventory/helper. Tests cover + missing/proposed/incomplete approvals, malformed values, future dates, + missing owner/reason, expiry, release behavior, and baseline-write refusal. +- Real T1 report check exits 1 with zero accepted gaps: 575 unapproved inventory + exceptions, 4 unapproved coverage exceptions, 2 not-scanned scanners, one + partial scanner, and one missing report. Raw output and JSON: + `build/eng-artifacts/T7.1/real.{log,json}`. + +The original T6 passing result remains historical evidence of the old checker; +it is not the current policy outcome. T33 cannot close until missing scans and +unapproved dispositions are resolved. Physical-device deferral does not waive +these security/quality requirements. diff --git a/quality/findings-policy.json b/quality/findings-policy.json index bf6e24efb..46ba1a11c 100644 --- a/quality/findings-policy.json +++ b/quality/findings-policy.json @@ -7,7 +7,8 @@ "Identity is the line-independent T1 fingerprint (quality/scanners.json#fingerprint_schemes). New fingerprints fail even when others disappear; bucket counts fail on any increase.", "Expiry dates are the last valid day: an exception or gap fails when today > expires.", "Accepted gaps are known coverage holes, printed as ACCEPTED GAP / NOT SCANNED and never counted as clean results. --release ignores all accepted gaps.", - "All owners/expiries below with status proposed-by-T6 need maintainer confirmation (no CODEOWNERS exists; see GAP-no-codeowners)." + "All owners/expiries below with status proposed-by-T6 need maintainer confirmation (no CODEOWNERS exists; see GAP-no-codeowners).", + "T7.1: Coverage gaps and exception dispositions require owner, reason, and approval={status: approved, approved_by: reviewer identity, approved_on: YYYY-MM-DD, evidence: review reference}. Proposed or missing approvals fail closed; no approval is inferred from an expiry. Approval must be recorded through review, never by --update-baseline." ], "dispositions": { "needs-triage": {"exception": false, "release_blocking": true, "meaning": "open, unreviewed; tolerated by --check only because it is inventoried"}, diff --git a/scripts/quality/findings.py b/scripts/quality/findings.py index 997feb07c..0c25e101b 100644 --- a/scripts/quality/findings.py +++ b/scripts/quality/findings.py @@ -665,6 +665,31 @@ def fail(kind, detail, scanner=None, fingerprint=None): fail("policy-error", "policy has no dispositions table") warn_days = int(policy.get("expiry_warning_days", 30)) + def approved_exception(record, where, kind, scanner=None, fingerprint=None): + """Approval is recorded explicitly; a proposed owner/expiry is not consent.""" + def reject(detail): + fail(kind, f"{where}: {detail}", scanner, fingerprint) + return False + + for key in ("owner", "reason"): + if not isinstance(record.get(key), str) or not record[key].strip(): + return reject(f"exception requires a nonempty {key}") + approval = record.get("approval") + if not isinstance(approval, dict) or approval.get("status") != "approved": + return reject("exception has no recorded approval (proposals are not acceptance)") + if record.get("status") not in (None, "approved"): + return reject("exception status conflicts with recorded approval") + for key in ("approved_by", "approved_on", "evidence"): + if not isinstance(approval.get(key), str) or not approval[key].strip(): + return reject(f"approval requires a nonempty {key}") + try: + approved_on = parse_date(approval["approved_on"], f"{where}.approval.approved_on") + except ValueError as exc: + return reject(str(exc)) + if approved_on > today: + return reject("approval date is in the future") + return True + # ---- policy: accepted gaps ---- gaps = [] for i, g in enumerate(policy.get("accepted_gaps") or []): @@ -677,6 +702,8 @@ def fail(kind, detail, scanner=None, fingerprint=None): except ValueError as e: fail("policy-error", str(e), g.get("scanner")) continue + if not approved_exception(g, f"accepted_gaps[{i}]", "policy-error", g.get("scanner")): + continue g["_used"] = False gaps.append(g) @@ -701,6 +728,8 @@ def fail(kind, detail, scanner=None, fingerprint=None): fail("inventory-error", f"{where}: unknown disposition {d!r}", r.get("scanner_id"), f) continue exp = r.get("exception_expiry") + if dispositions[d].get("exception"): + approved_exception(r, where, "inventory-error", r.get("scanner_id"), f) if dispositions[d].get("exception") and not exp: fail("inventory-error", f"{where}: disposition {d!r} is an exception but has no exception_expiry " "(unbounded exceptions are not allowed)", r.get("scanner_id"), f) diff --git a/tests/quality/fixtures/findings/base/inventory.json b/tests/quality/fixtures/findings/base/inventory.json index 3d58a5971..a92aef1fb 100644 --- a/tests/quality/fixtures/findings/base/inventory.json +++ b/tests/quality/fixtures/findings/base/inventory.json @@ -26,7 +26,15 @@ "line": 20 }, "disposition": "exception-dismissed-false-positive", - "exception_expiry": "2027-01-31" + "exception_expiry": "2027-01-31", + "owner": "fixture-maintainer", + "reason": "Synthetic test-only reviewed exception", + "approval": { + "status": "approved", + "approved_by": "fixture-reviewer", + "approved_on": "2026-10-31", + "evidence": "synthetic:test-review" + } }, { "id": "CLANGTIDY-3971853557f6166d", @@ -39,7 +47,15 @@ "line": 5 }, "disposition": "baseline-debt", - "exception_expiry": "2027-04-30" + "exception_expiry": "2027-04-30", + "owner": "fixture-maintainer", + "reason": "Synthetic test-only reviewed exception", + "approval": { + "status": "approved", + "approved_by": "fixture-reviewer", + "approved_on": "2026-10-31", + "evidence": "synthetic:test-review" + } }, { "id": "CLANGTIDY-23b6d28e219f20e2", @@ -52,7 +68,15 @@ "line": 9 }, "disposition": "baseline-debt", - "exception_expiry": "2027-04-30" + "exception_expiry": "2027-04-30", + "owner": "fixture-maintainer", + "reason": "Synthetic test-only reviewed exception", + "approval": { + "status": "approved", + "approved_by": "fixture-reviewer", + "approved_on": "2026-10-31", + "evidence": "synthetic:test-review" + } }, { "id": "CLANGTIDY-6097ffe41888cb7e", @@ -65,7 +89,15 @@ "line": 7 }, "disposition": "baseline-debt", - "exception_expiry": "2027-04-30" + "exception_expiry": "2027-04-30", + "owner": "fixture-maintainer", + "reason": "Synthetic test-only reviewed exception", + "approval": { + "status": "approved", + "approved_by": "fixture-reviewer", + "approved_on": "2026-10-31", + "evidence": "synthetic:test-review" + } }, { "id": "CPPCHECK-032b81a083372145", @@ -116,7 +148,15 @@ "path": "src/core/b.c", "count": 2, "disposition": "baseline-debt", - "exception_expiry": "2027-04-30" + "exception_expiry": "2027-04-30", + "owner": "fixture-maintainer", + "reason": "Synthetic test-only reviewed exception", + "approval": { + "status": "approved", + "approved_by": "fixture-reviewer", + "approved_on": "2026-10-31", + "evidence": "synthetic:test-review" + } }, { "id": "CPPCHECK-BUCKET-2", @@ -136,7 +176,15 @@ "path": "web/js/x.jsx", "count": 2, "disposition": "baseline-debt", - "exception_expiry": "2027-04-30" + "exception_expiry": "2027-04-30", + "owner": "fixture-maintainer", + "reason": "Synthetic test-only reviewed exception", + "approval": { + "status": "approved", + "approved_by": "fixture-reviewer", + "approved_on": "2026-10-31", + "evidence": "synthetic:test-review" + } }, { "id": "ESLINT-BUCKET-2", @@ -146,7 +194,15 @@ "path": "web/js/x.jsx", "count": 1, "disposition": "baseline-debt", - "exception_expiry": "2027-04-30" + "exception_expiry": "2027-04-30", + "owner": "fixture-maintainer", + "reason": "Synthetic test-only reviewed exception", + "approval": { + "status": "approved", + "approved_by": "fixture-reviewer", + "approved_on": "2026-10-31", + "evidence": "synthetic:test-review" + } } ], "coverage_gaps": [] diff --git a/tests/quality/test_findings.py b/tests/quality/test_findings.py index ffd1ab21e..b8ac873fa 100644 --- a/tests/quality/test_findings.py +++ b/tests/quality/test_findings.py @@ -372,6 +372,48 @@ class ExceptionTests(Case): def test_unexpired_exception_passes(self): self.assertEqual(self.evaluate(today="2027-01-31")["failures"], []) # expiry day is still valid + def test_exception_requires_recorded_approval(self): + for collection in ("findings", "buckets"): + for approval in (None, {}, {"status": "proposed"}, {"status": "approved"}): + with self.subTest(collection=collection, approval=approval): + inv = self.load("inventory.json") + row = next(r for r in inv[collection] if r["disposition"] == "baseline-debt") + row["approval"] = approval + self.save("inventory.json", inv) + self.assertIn("inventory-error", self.kinds(self.evaluate())) + + def test_exception_approval_fields_are_nonempty_strings(self): + original = self.load("inventory.json") + for key in ("approved_by", "approved_on", "evidence"): + for value in (None, " ", [], 42): + with self.subTest(key=key, value=value): + inv = json.loads(json.dumps(original)) + inv["findings"][1]["approval"][key] = value + self.save("inventory.json", inv) + self.assertIn("inventory-error", self.kinds(self.evaluate())) + + def test_exception_requires_owner_reason_and_valid_approval_date(self): + original = self.load("inventory.json") + for field in ("owner", "reason"): + inv = json.loads(json.dumps(original)) + inv["findings"][1][field] = " " + self.save("inventory.json", inv) + self.assertIn("inventory-error", self.kinds(self.evaluate())) + for date in ("invalid", "2026-11-02"): + inv = json.loads(json.dumps(original)) + inv["findings"][1]["approval"]["approved_on"] = date + self.save("inventory.json", inv) + self.assertIn("inventory-error", self.kinds(self.evaluate())) + + def test_baseline_update_cannot_approve_an_exception(self): + inv = self.load("inventory.json") + del inv["findings"][1]["approval"] + self.save("inventory.json", inv) + before = sha(self.d / "inventory.json") + result = self.cli("--update-baseline", "--reason", "synthetic attempt") + self.assertNotEqual(result.returncode, 0) + self.assertEqual(sha(self.d / "inventory.json"), before) + def test_expired_exception_fails(self): r = self.evaluate(today="2027-02-01") exp = [f for f in r["failures"] if f["kind"] == "expired-exception"] @@ -414,7 +456,9 @@ def add_secret_scanner(self): def gap(self, expires): pol = self.load("policy.json") pol["accepted_gaps"] = [{"scanner": "secret-scanning", "condition": "not-scanned", "owner": "maintainers/security", - "expires": expires, "reason": "disabled upstream", "coverage_gap_ref": "GAP-x"}] + "expires": expires, "reason": "disabled upstream", "coverage_gap_ref": "GAP-x", + "approval": {"status": "approved", "approved_by": "fixture-reviewer", + "approved_on": "2026-09-01", "evidence": "synthetic:test-review"}}] self.save("policy.json", pol) def test_accepted_gap_is_visible_and_passes(self): @@ -429,6 +473,35 @@ def test_accepted_gap_is_visible_and_passes(self): self.assertIn("ACCEPTED GAP", p.stdout) self.assertIn("NOT SCANNED", p.stdout) + def test_unapproved_gaps_cannot_hide_missing_scans(self): + self.add_secret_scanner() + for approval in (None, {}, {"status": "proposed"}, {"status": "approved"}): + with self.subTest(approval=approval): + self.gap("2026-12-31") + pol = self.load("policy.json") + pol["accepted_gaps"][0]["approval"] = approval + self.save("policy.json", pol) + r = self.evaluate() + self.assertIn("policy-error", self.kinds(r)) + self.assertIn("not-scanned", self.kinds(r)) + self.assertEqual(r["accepted_gaps"], []) + + def test_proposed_status_conflicts_with_approval(self): + self.add_secret_scanner() + self.gap("2026-12-31") + pol = self.load("policy.json") + pol["accepted_gaps"][0]["status"] = "proposed-by-T6" + self.save("policy.json", pol) + self.assertIn("policy-error", self.kinds(self.evaluate())) + + def test_gap_future_approval_cannot_hide_missing_scan(self): + self.add_secret_scanner() + self.gap("2026-12-31") + pol = self.load("policy.json") + pol["accepted_gaps"][0]["approval"]["approved_on"] = "2026-11-02" + self.save("policy.json", pol) + self.assertIn("not-scanned", self.kinds(self.evaluate())) + def test_expired_gap_fails(self): self.add_secret_scanner() self.gap("2026-10-01") From 6111c7844daef8c347c49add08a0d312cc55226b Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Sat, 31 Oct 2026 03:33:43 -0400 Subject: [PATCH 010/230] docs: record resumed engineering foundation execution --- .../prd/ENG_01_Safety_Contracts_TypeScript.md | 423 ++++++++ engineering-foundation-plan.md | 908 ++++++++++++++++++ 2 files changed, 1331 insertions(+) create mode 100644 docs/prd/ENG_01_Safety_Contracts_TypeScript.md create mode 100644 engineering-foundation-plan.md diff --git a/docs/prd/ENG_01_Safety_Contracts_TypeScript.md b/docs/prd/ENG_01_Safety_Contracts_TypeScript.md new file mode 100644 index 000000000..71b0073c3 --- /dev/null +++ b/docs/prd/ENG_01_Safety_Contracts_TypeScript.md @@ -0,0 +1,423 @@ +# PRD — Security, Quality, and Typed Frontend Foundation + +**Status**: Draft — scoped for implementation; phase acceptance remains open +**Created**: 2026-10-31 +**Baseline**: `main` at `1b8d4332`, after PR #691 merged the Live views +**Owner**: LightNVR maintainers; assign an accountable owner to each delivery slice +**Priority**: Product reliability and maintainability +**Scope**: Security and quality remediation, enforceable CI checks, Preact +TypeScript/TSX adoption, executable API contracts, operational regression +coverage, embedded resource budgets, and targeted C boundary improvements. + +## 1. Problem and intended outcome + +LightNVR needs a stronger foundation for routine development and larger future +refactoring. Existing analysis, tests, and documentation provide a substantial +starting point, but several analysis jobs only report findings, frontend application +code has no dedicated type-check gate, and the API contract is primarily prose. +These gaps make it easier for changes to introduce mismatched data assumptions, +repeat resolved defects, or increase resource costs unnoticed. + +The next investment is to improve the current C backend and Preact frontend. +Every phase must provide independent value to the released product. A future +Rust implementation may reuse the resulting contracts and tests, but this PRD +does not depend on a language migration. + +Preact remains the frontend runtime. TSX adds TypeScript to JSX; it does not +require replacing Preact with React. Type annotations are removed during the +build. Preserving the embedded footprint still requires measuring the emitted +assets, dependencies, and runtime behavior. + +## 2. Current baseline + +The following describes the inspected revision, not completed acceptance for +this program. Current scanner results and GitHub alert counts must be collected +in P0; the presence of a workflow does not establish a clean security backlog. + +| Area | Present on main | Preparation needed | +| --- | --- | --- | +| Live view consolidation | PR #691 replaced the separate WebRTC view with the shared [LiveView](../../web/js/components/preact/LiveView.jsx), supported by [transport URL helpers](../../web/js/utils/live-view-url.js) and [compatibility tests](../../web/tests/liveViewTransportTabs.spec.js) | Preserve this completed refactor and its behavior during TSX adoption | +| Frontend build | [Vite](../../web/vite.config.js) targets Preact directly; application files use JS/JSX; [package scripts](../../web/package.json) have no dedicated type-check command | Add incremental TypeScript configuration, test support, and a required check | +| Frontend lint | [ESLint](../../web/eslint.config.js) targets JS/JSX, reports accessibility rules as warnings, disables hooks rules, and enforces an existing UI-string baseline | Extend coverage to TS/TSX and progressively enforce resolved categories | +| Native analysis | [clang-tidy and cppcheck](../../.github/workflows/static-analysis.yml) intentionally report without blocking; [CodeQL](../../.github/workflows/codeql-analysis.yml) analyzes C/C++ | Triage findings and establish explicit regression and release policies; cover frontend security analysis too | +| Dependency/container analysis | [Trivy](../../.github/workflows/container-scan.yml) reports findings with a zero finding exit code | Inventory shipped dependencies and make actionable findings enforceable | +| API contract | [API documentation](../API.md) describes routes, role-dependent responses, and compatibility behavior; no first-party OpenAPI definition was found in the scoped review | Establish a machine-readable contract and test it against C | +| Tests | C/SQLite tests, [ASan/UBSan](../../.github/workflows/sanitizer.yml), frontend unit tests, and [Playwright API/UI/go2rtc projects](../../playwright.config.ts) exist; the main browser CI step explicitly runs UI shards | Map actual execution to risks; make API contracts and relevant failure scenarios explicit CI jobs | +| Deployment | [Container release matrix](../../.github/workflows/docker-publish.yml) covers amd64, arm64, and arm/v7; Vite has default and modern-only browser build paths | Establish measured budgets for supported profiles and identify any additional embedded targets that remain required | + +## 3. Goals and scope boundaries + +### Goals + +- Resolve actionable security and quality findings and prevent their recurrence. +- Catch incorrect frontend props, API usage, state handling, and null assumptions + before release, with strict checking throughout migrated code. +- Make API compatibility executable and reusable by clients and future backends. +- Preserve recording, playback, authorization, recovery, and upgrade behavior. +- Keep resource costs visible on constrained NVRs and viewing devices. +- Clarify ownership and lifecycle boundaries in C where evidence justifies work. + +### Out of scope + +- A Rust backend, transpilation pipeline, or automatically generated release code. +- Replacing Preact, redesigning the UI, or changing the public API for typing convenience. +- Rewriting FFmpeg, go2rtc, SQLite, or other native dependencies. +- A simultaneous database/configuration format migration or broad framework upgrade. +- Treating scanner silence, a successful build, or a coverage percentage as proof + of security or behavioral equivalence. + +Necessary bug fixes can change incorrect behavior, but must be identified as +such and documented separately from mechanical typing or refactoring changes. + +## 4. Requirements + +### 4.1 Findings inventory, remediation, and enforcement + +**Q1 — Establish one findings inventory.** Collect current CodeQL, clang-tidy, +cppcheck, sanitizer, frontend lint, dependency, and container results. Reconcile +known security and quality issues with those results. Identify production, +optional-feature, build-only, and third-party findings without silently excluding +any category. Keep sensitive vulnerability details in the appropriate private +security channel; public tracking uses sanitized references. + +Each finding records its stable ID or fingerprint, source/tool version, affected +revision and configuration, severity, exposure, owner, disposition, and evidence. +Dispositions are: open, fixed, verified false positive, or time-bounded exception. +An exception requires a reason, owner, mitigation where applicable, and review +date. Expired exceptions fail the policy check. Baseline updates require an +explicit reviewed change and cannot automatically absorb new findings. + +**Q2 — Fix by product impact.** Prioritize reachable security defects and data +loss, then memory/lifetime problems, correctness, accessibility, and maintainability. +Review authorization, credential handling, path/file operations, external input, +and dependency exposure as relevant to actual findings. Use focused regression +tests for behavioral defects. Separate dependency upgrades from unrelated type +conversion and avoid indiscriminate forced upgrades. + +**Q3 — Make progress durable.** Introduce required checks that reject new +actionable findings, and promote cleaned rule categories to blocking. Baseline +comparison must use finding identity rather than total warning counts: removing +one old warning cannot conceal a new one. Scanner crashes, configuration errors, +missing expected reports, and accidentally empty scans are failures, not clean +results. Pin or record tool versions and scanner databases so changes are +explainable without indefinitely freezing security intelligence. + +The release gate requires no unresolved first-party security defects or known +data-loss defects. Remaining upstream/unfixable findings require documented, +current risk acceptance; all other actionable quality findings must be resolved +before final program acceptance. A suppression without supporting evidence is +not resolution. Apply checks to relevant feature configurations, including +production combinations omitted by lean analysis builds. + +**Acceptance:** Every collected finding has an owner and disposition; fixed +categories cannot regress unnoticed; deliberate sample violations and a failed +scanner demonstrably fail the gate; required checks are configured in repository +rules as well as workflow YAML. Capture this enforcement evidence once when +introducing each gate rather than adding tests that merely restate configuration. + +### 4.2 Incremental TypeScript and TSX + +**T1 — Add build-time checks without changing the runtime.** Add a frontend +`tsconfig` using `jsx: react-jsx`, `jsxImportSource: preact`, `strict`, +`noUncheckedIndexedAccess`, `isolatedModules`, and no emitted output from the +type checker. Configure module +resolution and compatibility aliases consistently with Vite. Introduce a +required `typecheck` command running `tsc --noEmit`; Vite's transpilation alone +does not check types. + +Allow JS/JSX alongside TS/TSX during migration. Use targeted JSDoc/checking or +narrow typed adapters at remaining JS boundaries. A migration inventory must +show what is still unchecked; `allowJs` alone does not mean that JS is checked. +New application modules use TS/TSX after the foundation lands. Existing modules +move in coherent feature slices, with their meaningful inputs and outputs typed. + +**T2 — Preserve all existing checks.** Update ESLint parser/configuration, file +globs, UI-string enforcement, hooks rules, Jest discovery and transforms, and +the relevant build/test entrypoints for TS/TSX. Run type checking separately for +first-party TypeScript integration/load tests as well; execution or type stripping +is insufficient. Keep Preact compatibility types aligned with runtime aliases. +Do not adopt a new test runner as a prerequisite. + +**T3 — Make types useful.** Type request helpers and query/mutation wrappers +before broad component conversion. Distinguish API data from editable form state +and persisted browser state. Model pending/success/error states and transport +choices explicitly. Handle optional/redacted values, cancellation, errors, +DOM refs, events, and storage parsing. Restrict explicit `any`, unchecked casts, +non-null assertions, and suppression comments; unavoidable third-party adapters +must be narrow, explained, and tracked. Do not use `@ts-nocheck` to mark a file +as migrated. Enable hooks correctness rules for migrated scopes and expand their +coverage as findings are resolved. + +**Acceptance:** Migrated files and their public boundaries pass strict checking; +incorrect props and response-field use fail the required check; migrated tests +are discovered and run; accessibility and localization checks still apply; no +React runtime is introduced; asset reports satisfy the applicable budgets. +Final scope is all first-party browser application code under `web/js`, with +generated/vendor files identified explicitly. Build configuration may remain JS +if checked, and does not count as an application migration exception. + +### 4.3 Executable API contracts + +**A1 — Create a canonical contract.** Add a first-party OpenAPI 3.1 definition +at the proposed path `docs/api/openapi.yaml`. Select and pin compatible validation +and generation tools in P2. Inventory method/path pairs from actual routing and +frontend usage, then reconcile them with the existing API documentation. Track +coverage explicitly; a partial initial schema must not imply whole-API coverage. + +For each covered operation, specify parameters, content types, request/response +schemas, status/error behavior, authentication, and authorization expectations. +Record null versus absent fields, defaults, enum values, units, timestamp formats, +identifier encoding, numeric limits, and pagination. Model summary/full and +role-dependent response variants separately. Preserve current wire behavior, +including tri-state retention values and redacted camera credentials. Do not +silently change integer representations or add privileged fields to make types +simpler. + +**A2 — Generate shared types and verify behavior.** Generate deterministic TS +request/response types from the schema and consume them through a small client +layer. Generated files are not hand-edited; CI regenerates and checks for drift. +Keep readable documentation aligned with the canonical contract. Run contract +tests against the actual C server, exercising successful, malformed, unauthorized, +forbidden, empty, and role-redacted cases where applicable. Tests assert policy +and side effects as well as response shape. Do not generate expected behavior +solely from the same implementation under test. + +**A3 — Validate external data deliberately.** Treat network/storage input as +untrusted until checked. A cast such as `as Stream` does not validate JSON. +Provide runtime validation at selected client boundaries, beginning with the +pilot's request results and persisted state. Measure the validator's emitted +cost; do not ship an entire schema/compiler runtime merely for type generation. +Server-side input validation and authorization remain authoritative. Define +compatible handling of additional fields and unknown values without hiding +missing required data or parsing errors. + +**Acceptance:** The pilot contract matches real C responses and permissions; +invalid fixtures fail validation; a schema/client mismatch fails CI; compatible +additive changes are supported by policy. Final coverage includes all operations +consumed by the first-party UI, plus an inventory of other supported public API +operations and their schema or explicit protocol-test coverage. Streaming/media +responses need protocol tests rather than pretending their bytes are JSON. + +### 4.4 Operational and compatibility regression coverage + +**R1 — Map risks to executed checks.** Reuse existing C, SQLite, frontend, +Playwright, media, and sanitizer fixtures. Record which job actually executes +each important scenario. Add explicit API-contract execution; UI shards alone +do not establish API-project coverage. Distinguish mocks from real server/media +tests and mark hardware-dependent evidence separately. + +| Scenario | Required observable outcome | Execution lane | +| --- | --- | --- | +| Authentication, permissions, and redaction | Each role receives permitted data/actions; denial produces no unauthorized mutation or credential disclosure | PR contract/API tests | +| Stream edit and async actions | Invalid input leaves configuration intact; pending/error UI is correct; repeated clicks do not duplicate a write | PR API/UI tests | +| Unified Live view | Existing index/HLS URLs, mode overrides, transport flags, filters, variant storage keys, fullscreen and substream behavior remain compatible | PR unit/UI; media smoke tests | +| Disconnect and audio/video recovery | Recording resumes within the fixture's declared deadline; resulting media is playable and timestamps remain within documented expectations | Targeted PR tests and scheduled media runs | +| Segment boundaries and retained recordings | Correct duration/order/metadata; retention protects held files and respects inherited, unlimited, and finite policies | PR C/SQLite tests and scheduled media runs | +| Full/read-only/unavailable storage | Failure is reported, cleanup respects policy, and recovery does not erase protected recordings or corrupt metadata | Isolated fault-injection tests | +| Shutdown, forced termination, and restart | Shutdown respects its deadline; restart reconciles incomplete work; database integrity and committed recordings remain recoverable | PR targeted tests and scheduled recovery runs | +| Upgrade and persisted state | A previous supported release's database, configuration, and browser preferences remain usable; incompatible changes are detected | Upgrade fixtures/release qualification | +| Repeated lifecycle activity | No sanitizer errors, deadlocks, unexplained recording gaps, or sustained unbounded growth in memory, threads, or file descriptors | Scheduled soak on declared target/workload | + +Each failure fixture specifies injected fault, expected state transitions, +deadlines/tolerances, and evidence. Establish numeric limits before using a +scenario as an acceptance gate. Compare playback and media metadata where +appropriate; byte-identical recordings are not required. Use isolated temporary +storage and test streams, never production recordings. Preserve existing +ASan/UBSan coverage and assess a focused race-detection job where dependencies +and platform support permit it. + +**Acceptance:** Required scenarios have passing execution evidence, independent +assertions, and retained diagnostics. Quarantined tests have an owner and expiry; +a mandatory acceptance scenario cannot be counted as passed while quarantined. +Retries expose flakes rather than erasing their history. The recent audio and +recorder recovery tests remain part of the applicable coverage. + +### 4.5 Embedded resource budgets + +**B1 — Establish reproducible baselines before migration.** Record commit, +lockfiles, build flags, architecture, browser/device, stream workload, and cache +state. Cover default and modern-only web builds, the supported release matrix, +and at least one named constrained deployment. Decide whether MIPS or additional +non-container targets remain release requirements and document their real build +and validation path. + +Measure installed web assets (including shipped compressed copies, locales, +fonts, and CSS), compressed first-load JS/CSS by page, lazy-loaded bytes, and +dependencies. Separately measure browser startup/interaction and memory, and +NVR binary size, idle/recording RSS, CPU, file descriptors, and recording gaps. +The NVR serves frontend assets; its memory budget is distinct from the viewing +browser's memory budget. + +**B2 — Enforce agreed budgets.** Check in a machine-readable baseline/budget +manifest with numeric limits for each required profile. Asset-size checks run on +PRs; noisy runtime measurements use a controlled runner, repeated samples, and a +documented comparison method. P0 must fill in the limits and name the target; +later acceptance cannot pass against placeholder budgets. No unreviewed budget +increase is allowed. Intentional increases require measured cost, product reason, +and an explicit manifest change. Type-only conversion is expected to preserve +runtime behavior and should not require a larger dependency footprint. + +**Acceptance:** CI publishes comparable before/after asset measurements; an +oversized change fails the gate; pilot and later migrations remain within the +agreed budgets. Emulation/build success is not recorded as physical-device +performance evidence. + +### 4.6 Targeted C boundary improvements + +**C1 — Document and simplify a bounded responsibility.** Identify ownership, +allocation/free responsibilities, thread affinity, callback lifetime, lock order, +cancellation, and shutdown behavior for selected interfaces. Separate pure +policy decisions from filesystem, database, and media side effects where useful. +Represent valid states/transitions and error outcomes explicitly. Use the +[stream-state interface](../../include/video/stream_state.h) and +[request/response abstraction](../../include/web/request_response.h) as existing +boundaries to assess, not justification for a broad rewrite. + +Choose the first refactor from a demonstrated finding or a heavily changed +responsibility, record its invariants, and add missing behavioral coverage before +changing ownership. Keep schema changes, public API changes, and structural +refactoring in distinct reviewable changes. Pure helpers such as the existing +Linux `/proc` parsers are candidates for bounded cleanup; no Rust port is part +of this phase. + +**Acceptance:** At least one selected boundary has documented invariants, +clear ownership, passing failure-path tests, and evidence that the targeted +problem was removed or the dependency surface reduced. Existing recording and +resource gates pass. Completion is based on this bounded improvement, not an +unmeasurable claim that the entire backend is clean. + +## 5. Delivery phases and dependencies + +Phases express dependencies rather than calendar promises. Security fixes start +as soon as findings are confirmed. TypeScript/contracts can progress while the +existing backlog is remediated; migration does not wait for every style warning. + +| Phase | Concrete work | Depends on | Exit gate | +| --- | --- | --- | --- | +| P0 — Inventory and baseline | Collect findings; map tests/jobs and API operations; record supported profiles and resource limits; preserve the merged Live baseline | Current main | Owned findings inventory, coverage map, measured budget manifest, explicit target list | +| P1 — Remediation and CI policy | Fix security/data-loss defects first; introduce identity-based finding checks; promote cleaned categories; add frontend security coverage and required-check rules | P0 | New violations fail; tooling failures fail; release-blocking findings resolved; remaining work owned | +| P2 — Type and contract foundation | Add strict incremental TS, test/lint support, API schema/toolchain, generated types, and explicit API-contract CI | P0; P1 policy applied to changed scope | Required checks demonstrably reject type/contract drift and preserve existing tests | +| P3 — Streams pilot | Type fetch/query boundaries and one Streams list/edit flow; add schemas, validation, C contract tests, UI states, and asset comparison | P2 and P0 budgets | Complete pilot acceptance below; review actual migration effort before expanding | +| P4 — Frontend rollout | Migrate remaining UI by feature; expand API contracts, hooks/accessibility enforcement, test typing, and localization coverage | P3 | All first-party browser application code typed; required endpoint coverage complete; budgets hold | +| P5 — Reliability and C boundaries | Fill operational coverage gaps; run recovery/upgrade/soak scenarios; implement one justified bounded C refactor | P0 coverage map; applicable P1 gates; contract/behavior tests before affected refactors | Operational matrix accepted; bounded refactor meets C1; supported targets qualified | +| P6 — Readiness review | Reconcile findings, contracts, migration inventory, CI enforcement, resources, and compatibility evidence | P1, P4, P5 | Program acceptance below; any future Rust experiment requires its own scoped decision | + +P5 test infrastructure may begin alongside P1/P2. A C refactor waits for its +relevant behavioral tests, not necessarily the entire frontend rollout. P1 +remediation continues until the final findings gate is satisfied. + +### 5.1 First end-to-end pilot + +Use the existing Streams list and edit workflow. Cover the actual operations +used by [StreamsView](../../web/js/components/preact/StreamsView.jsx), +[StreamCard](../../web/js/components/preact/StreamCard.jsx), and +[StreamConfigModal](../../web/js/components/preact/StreamConfigModal.jsx): +`GET /api/streams`, the detail/full variant used for editing, and +`PUT /api/streams/{name}`. Record the exact variants during P2 routing review. +Do not expand this pilot to deletion, bulk actions, or recording architecture. + +1. Capture existing requests, role-dependent results, edit semantics, and errors + in independent fixtures and tests; resolve inconsistencies explicitly. +2. Define the contract and generate request/response types. Keep redacted list + data separate from privileged edit data and editable form values. +3. Type the relevant fetch/query adapters and async-action interfaces; validate + external data and persist useful error/cancellation information. +4. Convert the pilot components and supporting code to TS/TSX with strict checks. + Keep the route, layout, localization, and Preact runtime behavior stable. +5. Verify empty/loading/error/success states, missing optional fields, malformed + responses, permitted/denied edits, invalid input, and duplicate-submit behavior. +6. Run actual C contract tests, focused UI/unit tests, applicable native tests, + and before/after asset measurements. Record implementation and review effort. + +**Pilot exit:** One real feature works from schema through C response and typed +UI, with no untracked type escapes, policy regressions, or budget overruns. +This validates the migration approach, not recording concurrency or whole-API +compatibility. The rollout must adjust if the pilot exposes oversized generated +clients, ineffective types, unstable tooling, or excessive review cost. + +### 5.2 Suggested reviewable PR sequence + +| Slice | Change | Evidence needed | +| --- | --- | --- | +| 1 | Findings/coverage inventories and resource measurement tooling | Reproducible baseline artifacts and named owners/profiles | +| 2 | Required findings gates and initial security/correctness fixes, split by root cause | Finding disposition, behavioral regression evidence, failed-gate demonstration | +| 3 | TS/TSX infrastructure and lint/test support, with a small existing helper migrated | Working strict check, discovered tests, unchanged runtime output or explained difference | +| 4 | Pilot OpenAPI contract, generation, and tests against C | Operation coverage, negative cases, deterministic generation | +| 5 | Typed fetch/query boundaries and Streams pilot | Full pilot acceptance and resource report | +| 6 onward | Separate feature migrations: auth/shared UI; unified Live; recordings/timeline; settings/system; remaining fleet/event/privacy surfaces | Feature contracts, typed tests, applicable compatibility and budget checks | +| Ongoing | Operational fixtures and bounded C improvements | Scenario evidence before/after each affected refactor | +| Final | Acceptance reconciliation and contributor documentation | All P6 gates met; outstanding exceptions explicitly reviewed | + +The order of feature slices may follow active development, but shared contracts +and adapters precede their consumers. Preserve PR #691's unified component; +do not recreate a second Live implementation to simplify migration. + +## 6. Program acceptance + +- Every finding in the P0 inventory is fixed, a verified false positive, or an + approved current upstream/unfixable exception; no actionable first-party + security, data-loss, or quality finding remains open. +- Required analysis, type, lint, generation-drift, contract, and relevant + regression checks prevent merges on failure; changed CI paths cannot silently + bypass them. Scheduled/release gates have named owners and retained evidence. +- The application migration inventory is complete. Strict type checks cover + first-party browser application code; integration tests have their own check; + generated/vendor exclusions and necessary boundary adapters are explicit. +- UI-consumed API operations have canonical contracts tested against C; + remaining public operations have documented coverage status and appropriate + schema/protocol checks. Authorization and sensitive-field behavior are tested. +- Unified Live compatibility, recording/recovery, retention, persistence, and + upgrade scenarios meet the recorded limits. No required acceptance case is + satisfied solely by mocks, quarantine, or a retry concealing a known defect. +- Default/constrained frontend profiles and supported deployment targets meet + recorded asset/runtime budgets, with physical evidence where performance is + claimed. Required measurements and limits are populated, not deferred. +- The selected C boundary improvement passes its invariants and regression + checks, and contributors can reproduce the applicable commands locally. + +Successful completion does not commit LightNVR to a second backend. A later Rust +proposal must identify a specific responsibility, expected ownership benefit, +compatibility evidence, target constraints, and maintenance cost. These decisions +remain separate from accepting improvements to the current product. + +## 7. Rollout, risks, and decisions + +| Risk or decision | Required handling | +| --- | --- | +| Old findings make every PR red | Establish the reviewed baseline first; block new findings immediately and remove baseline entries as fixed | +| Green CI means a scanner did not actually run | Check report presence/scope and tool errors; verify repository required-check behavior, including path filters | +| TSX becomes cosmetic through `any` or assertions | Review typed boundaries, restrict escapes, and require negative type-check evidence for the pilot | +| Generated types disagree with C | Test real responses and policy; change contracts only with reviewed compatibility intent | +| Validators or compatibility packages inflate the UI | Measure per-page and installed assets; use small generation/validation outputs and retain Preact | +| Existing tooling drops migrated tests or lint rules | Update discovery/transforms/scopes before feature conversion; retain localization and accessibility checks | +| Refactoring changes Live preferences or recording behavior | Preserve the merged compatibility fixtures and add operational assertions before structural changes | +| Noisy performance or flaky media tests block useful work | Use controlled profiles, declared tolerances, retained diagnostics, and owned expiry-bound quarantine; keep acceptance evidence explicit | +| Scope expands into a rewrite | Deliver bounded PRs and the pilot first; exclude language/backend replacement from this program | + +P0 must settle the accountable owners, exact constrained devices, required +architectures/browser profiles, numeric budgets, CI cadence/runner allocation, +and findings exception policy. P2 must settle generation/validation tooling and +the API compatibility policy. These are implementation decisions with named +phase deadlines, not reasons to defer inventory or confirmed security fixes. + +During rollout, existing JS and new TS may coexist. Revert a problematic feature +slice without disabling established security or type gates. Preserve current +database/configuration formats and browser storage keys; any necessary +compatibility change receives its own migration and rollback assessment. + +## 8. Related work and references + +- [Mobile-first foundation](UXD_01_MobileFirstFoundation.md) and + [Live view ergonomics](UXD_02_LiveViewErgonomics.md): preserve shared async, + accessibility, mobile, and playback behavior. +- [Scoped authorization and audit](FLEET_02_Scoped_Authorization_Audit.md): reuse + action/scope semantics in contracts and negative tests. +- [Storage lifecycle](STORAGE_01_Multi_Target_Lifecycle.md) and + [retention policies](PRD_Recording_Retention_Policies.md): define protected + data and cleanup behavior for operational tests. +- [Host and hardware health](OPS_03_Host_Hardware_Health.md): reuse existing + resource signals and fault fixtures. +- [Preact TypeScript guide](https://preactjs.com/guide/v10/typescript/), + [Vite TypeScript checking](https://vite.dev/guide/features.html#typescript), + [TypeScript incremental JS support](https://www.typescriptlang.org/tsconfig/allowJs.html), + and [erased types](https://www.typescriptlang.org/docs/handbook/2/basic-types.html#erased-types). diff --git a/engineering-foundation-plan.md b/engineering-foundation-plan.md new file mode 100644 index 000000000..1f3195d23 --- /dev/null +++ b/engineering-foundation-plan.md @@ -0,0 +1,908 @@ +# Plan: Security, Quality, and Typed Frontend Foundation + +**Generated**: 2026-10-31 +**Mode**: Swarm-ready dependency plan +**Source**: [Engineering foundation PRD](docs/prd/ENG_01_Safety_Contracts_TypeScript.md) +**Inspected baseline**: `main`, `1b8d4332` (PR #691's unified Live view) +**Execution status**: In progress; resumed under user authorization on 2026-10-31. T1–T4 and T6 were committed before resumption. Physical-device measurements in T5/T36 are deferred at the user's request; this is not passing qualification evidence. + +## Overview + +Strengthen the existing C/Preact product through enforceable findings checks, +strict TS/TSX, executable API contracts, a Streams list/edit pilot, operational +regressions, resource budgets, and one justified C boundary improvement. + +The foundation and pilot have concrete tasks below. Three discovery gates expand +work that cannot honestly be enumerated yet: actual scanner findings (T7), the +remaining application rollout after measuring the pilot (T25), and the selected +C improvement (T31). These tasks produce **additional executable task records in +this plan**, not permission for a worker to undertake a whole backlog. Their +integration gates cannot run until the new dependencies have been inserted and +completed. P6 is not complete merely because the scaffolding or pilot passes. + +Keep shared manifests, generated outputs, workflow integration, and repository +rules under a local integrator. Parallel workers own isolated implementations or +fixtures. Prefer a maximum of three active workers; the coordinator occupies the +fourth available slot. Do not parallelize tests that share ports or output paths. + +## Assumptions + +- Preserve C, Preact, Vite, Jest, existing public behavior, and stored data. Rust, + React adoption, a new test runner, and a database redesign are outside scope. +- The dirty working tree contains the source PRD/index and unrelated documents, + investigations, `homeassistant/`, and other local files. Workers are not alone: + edit only assigned files directly, never reset/revert unrelated work, and report + changed paths. No commits, pushes, PR publication, or production deployment are + required unless separately requested. +- Confirm the working revision and changed paths before starting each task; adapt + this plan if main advances. Do not reimplement PR #691 or restore WebRTCView. +- Every new path/command named below is a **planned deliverable**, not an existing + feature. Its producer task is identified. Names may change only through a + coordinated plan update covering every consumer. +- P0 records actual findings, targets, workload limits, and measurements. No alert + count, fixed dependency version, or performance result is assumed here. +- Default target coverage starts with amd64, arm64, arm/v7 and both current web + build modes. Additional embedded/MIPS requirements need an explicit target + record. Missing hardware blocks its acceptance evidence, not unrelated work. +- Preserve `web/package.json`'s Node 24 range and installed major versions. Select + compatible pinned additions; do not upgrade Preact/Vite/Babel/Jest incidentally. +- The pilot is list/edit only. `StreamsView.jsx` also handles create/delete, + bulk operations, discovery, and ONVIF: extract a typed feature boundary when + needed rather than making those flows unplanned pilot requirements. +- Existing tests sometimes read literal `.jsx` source paths or bundle modules + with extension-based stubs. Rename planning includes those consumers and the + path-keyed i18n baseline; a successful Vite build is insufficient evidence. + +## Prerequisites + +- Node from `.nvmrc`, npm lockfiles, Python 3, CMake, a C/C++ compiler, and the + dependencies in the current workflows. In particular current CMake requires + FFmpeg development libraries at the versions declared there, SQLite, libuv, + llhttp, curl, TLS dependencies, and initialized FAAC/Unity sources. +- Go, FFmpeg/ffprobe, a built go2rtc, and Playwright Chromium for media/UI runs; + optional feature matrices also need their actual dependencies. Lean builds + cannot qualify omitted production features. +- Read access to GitHub findings/workflow artifacts and dependency/container + reports for T1. Insufficient access is recorded explicitly; an empty accessible + result is not proof that all private findings were inspected. +- Repository administration is needed only to configure/verify required checks + in T38/T35. Prepare a concrete ruleset diff first; use existing authorization + or request the missing authority before changing remote settings. +- A named constrained device and controlled workloads for T5/T36. Keep physical + performance evidence distinct from cross-builds and emulation. +- All integration/upgrade/fault tests use disposable storage and synthetic + streams. No production camera credentials or recordings enter fixtures. + +### Shared ownership and validation conventions + +- T8 initially owns both package manifests/lockfiles and shared web configs; + T15, explicit local T25.* integration checkpoints, T26, then T34/T35 own + subsequent coordinated changes. Other workers + submit dependency/config needs to that owner instead of editing shared files. +- T10 owns lint rule compatibility and establishes extension-independent source + identity before conversion. A JSX-to-TSX rename therefore retains the same + allowance without waiting for a later integration task. Never regenerate a + larger i18n allowance or let two implementations share duplicate allowances. +- T12 owns generation tooling and the initial generated output. Later schema + workers edit assigned fragments only. Explicit local T25.* checkpoints + aggregate/generate outputs before dependent consumer tasks begin; T26 performs + final reconciliation after those tasks. Concurrent code generation is prohibited. +- Keep small checked JS re-export shims at old import paths during a migration + wave when necessary. They contain no duplicate implementation, are inventoried, + and T34 removes them or verifies narrowly justified interop exceptions. +- Each task writes evidence to its own `quality/evidence/T.md`; raw reports + go under ignored `build/eng-artifacts/T/`. Evidence must omit secrets. + Only the coordinator updates task statuses/logs and consolidated inventories. +- Run all commands from the repo root. T13 creates `run-native.py` and + `run-integration.mjs` wrappers: they isolate build directories, configurations, + ports, PIDs, database/storage paths, and report directories by task ID, fail + on zero selected tests, and forward subprocess failure codes. Until that is + proven, all server/media runs are serial under the coordinator. +- `npm ci`, Vite builds, code generation, and whole-tree checks need an exclusive + validation lease in a shared checkout. Workers can run isolated tests while + unrelated edits continue, but final evidence comes from a stable integrated + snapshot. Do not attribute another worker's intermediate failure to your task. + +### Mandatory expansion protocol + +T7, T25, and T31 are bounded **planning/integration preparation** tasks. For each: + +1. Append full task records in the format below with stable IDs: T7.1, T7.2, etc.; + T25.1, etc.; T31.1, etc. Give every task exact paths, dependencies, assertions, + and root-runnable validation. Split a fix by root cause and a migration by + a small component/helper cluster; normally no more than six application + implementation files per worker. A single large view may be its own task. +2. Assign related tests, schema fragments, and all extension-sensitive consumers. + Put shared imports, schemas, generation, and manifests in explicit local + integration tasks. Serialize overlaps with existing tasks, including pilot + files and native operational tests. +3. Update the dependency graph and wave table. Add every leaf/integration task + to the designated gate's `depends_on`: T33 for T7, T26 for T25, T32 for T31. + Validate all IDs, acyclicity, ownership, artifact producers, and resource + leases **before marking the expansion task completed**. +4. Execute the resulting tasks under the later executor's authorization. A gate + refuses completion when expansion records are absent, unresolved, or merely + marked skipped. Zero remediation tasks is valid only with complete evidence + that no actionable findings remain. T25 must account for every remaining file. + +This makes unknown work explicit without assigning an unbounded rewrite to one +agent or letting a nominally completed planning task satisfy implementation. +If T9 discovers substantial pre-existing test typing work, apply the same rules +to T9.* tasks and insert their terminal IDs into both T13 and T15 before marking +T9 complete. The initial producer T8 must already provide the test-check command. + +## Dependency Graph + +```text +T1 findings ──> T6 policy ──> T14 scanners ────────────────┐ +T1,T2,T3,T4 ─> T7 expand fixes ──> [T7.*] ──> T33 ──────┤ +T2 inventory ──> T11 contract ──┐ │ +T2,T4,T11 ───> T8 toolchain ───┼─> T12 generation ──┐ │ + ├─> T9 test typing ──┐ │ │ + └─> T10 lint ────────┤ │ │ +T3 coverage ───────────────────> T13 harness ┤ │ │ +T4 assets ──> T5 device budgets └─> T15 foundation +T15 ──> T16 fetch ──> T19 query ──┬─> T20 form ──┐ + ├─> T17 async primitives ─────┤ ├─> T22 pilot wiring + └─> T18 C contracts ──────────┴─> T21 card ──┘ │ + T23 UI ──> T24 pilot gate +T18 ──> T39 contract CI ──> T38 required-check enforcement ──> T24 +T24 ──> T25 expand rollout ──> [T25.*] ──> T26 integration ──> T34 strict closure +T3,T13 ──> T27 media; T28 storage; T29 restart/upgrade ──> T30 soak +T3,T7 ───> T31 expand C boundary ──> [T31.*] ──> T32 integration +T5,T27,T28,T29 also feed T32; T38 also feeds T35 +T30,T32,T33,T34 ──> T35 final CI ──> T36 target qualification ──> T37 acceptance +``` + +The task records below are authoritative where this summary omits a supporting +edge. Bracketed expansion families are not runnable placeholders; their full +records and gate dependencies must be added by the named producer. + +## Tasks + +### T1: Inventory current security and quality findings +- **depends_on**: [] +- **agent_type**: explorer +- **ownership**: `quality/findings.json`, `quality/scanners.json`, `quality/evidence/T1.md`; production code read-only. +- **description**: Collect current analysis/artifacts and known issues; separate application, optional-feature, build-only, third-party, and container findings. Record scanner revision/scope, stable identity, severity/exposure, owner, disposition, evidence, and exception expiry. Mark inaccessible reports as missing. Define the expected scanner-run manifest for T6. +- **acceptance_criteria**: + - No invented clean baseline; each collected item is traceable and each expected scanner has coverage/access status. + - No secrets or private vulnerability details in public files; use sanitized IDs for private records. +- **validation**: + - `python3 -m json.tool quality/findings.json` + - `python3 -m json.tool quality/scanners.json` + - Manually reconcile scanner counts/fingerprints and configurations with source reports. +- **status**: Completed (commit `ff6a7d60`) +- **log**: Non-testable inventory; verified by json.tool and an independent recount from raw reports (CodeQL 34 open+11 dismissed, clang-tidy 296, cppcheck 605, eslint 897, 743 unique fingerprints). 384 itemized findings + 359 buckets; 13 expected scanners with access status. Gaps: secret scanning disabled (404, recorded as not scanned), no JS/TS CodeQL, CodeQL not on PRs, all scanners non-blocking, no required checks, go2rtc/SOD excluded from C analysis, Trivy amd64 only, no CODEOWNERS (placeholder owners). Notable for T7: CodeQL `cpp/sql-injection` (sqlite_migrate.c), uncontrolled allocation (event_router.c), path injection, TOCTOU, cleartext credentials; cppcheck OOB in stream_protocol.c, overflow in config.c; 2 private high-severity advisory drafts need maintainer status. Gotchas: static reports are from `1b8d4332` (+7 line offset after SPDX headers; fingerprints are line-independent); npm audit exits 1 on any finding while C scanners/Trivy force exit 0; workflow artifacts expire 2026-11-30; proposed exception expiry 2027-04-30 needs maintainer confirmation. Raw reports in `build/eng-artifacts/T1/`. +- **files edited/created**: `quality/findings.json`, `quality/scanners.json`, `quality/evidence/T1.md` + +### T2: Map application, API, and rename ownership +- **depends_on**: [] +- **agent_type**: explorer +- **ownership**: `quality/application-inventory.json`, `quality/api-inventory.json`, `quality/evidence/T2.md`; code read-only. +- **description**: Inventory all first-party `web/js` files, imports, entrypoints, tests, source-reading assertions, schema consumers, and shared UI. Enumerate actual C method/path routing and UI usage. Identify Streams summary/full/role variants and list/edit dependencies, including client-config and detection-model options. Record the Live compatibility behavior from PR #691. +- **acceptance_criteria**: + - Every browser file has a proposed domain owner and every UI operation maps to real routing or a recorded discrepancy. + - Explicitly identify shared i18n, auth, toast, modal, ZoneEditor, query, and extension-sensitive test dependencies. +- **validation**: + - `python3 -m json.tool quality/application-inventory.json` + - `python3 -m json.tool quality/api-inventory.json` + - `rg --files web/js web/tests tests/integration` + - Compare inventory completeness to the file list and route registration, not documentation alone. +- **status**: Completed (commit `8d715d7f`) +- **log**: Non-testable inventory; verified by json.tool and a completeness check (302/302 `rg --files` paths, 239/239 C routes from `register_all_libuv_handlers()` in `src/web/libuv_api_handlers.c`, 297/297 UI operations matched via a port of the C matcher). 193 web/js files across 16 domains; 4 unreachable files (`Toast.jsx`, `common/Image.jsx`, `url-param-handler.js`, `utils/dom-utils.js`); 10 discrepancies D-01..D-10. Streams pilot detail in `api-inventory.streams_pilot`: `/full` needs only live-view permission and has configure vs live-only redaction variants; PUT checks permission before body and returns 202; UI sends ignored `is_deleted`, reads unsent `detection_zones`, and reads `error_message`/`playback_transport` absent from admin list; UI gates editing by role while server is per-camera. Extension-sensitive consumers for T8/T10: source-reading specs (streamAvailability→StreamsView.jsx, i18n→Footer.jsx, open-issues-regressions→InvestigationView.jsx), esbuild `.jsx` bundling specs (systemHealth*, liveSlideshowControl, platesView with 6 filename-matched stubs), extension-filtered web/js walkers (browserDialogs, locale-coverage), 48 spec files with explicit-extension imports, Jest `*.spec.js`-only matching, ESLint `.js/.jsx` only, i18n baseline path-keyed. Live (#691): variant/storage prefixes and query keys must stay stable. Gotchas: router is first-match, unmatched `/api/*` → 404 not 405; Playwright `go2rtc` project matches no files; edit form uses raw `fetch` for `/full` and zones; `web/js/version.js` is generated/ignored. +- **files edited/created**: `quality/application-inventory.json`, `quality/api-inventory.json`, `quality/evidence/T2.md` + +### T3: Map operational coverage and reproduce native baseline +- **depends_on**: [] +- **agent_type**: explorer +- **ownership**: `quality/operational-coverage.json`, `quality/native-profiles.json`, `quality/evidence/T3.md`; code read-only. +- **description**: Map PRD scenarios to actual executed tests/jobs. Inspect media recovery, storage, shutdown, upgrade, stream state, and `/proc` seams. Record missing cases, production feature combinations, numerical scenario limits requiring calibration, and candidate bounded C improvements. Archive baseline native binaries/configuration and hashes under `build/eng-baseline/1b8d4332/native/`, with toolchain, dynamic-library/container provenance, and feature flags; record which target each artifact can actually run on. +- **acceptance_criteria**: + - Existing test names/build flags are captured; mocks, real media, and hardware evidence are distinguished. + - Baseline failures are recorded before refactoring; omitted features are not counted as covered. +- **validation**: + - `cmake -S . -B build/eng-T3 -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTS=ON -DENABLE_SOD=OFF -DENABLE_LITERT=OFF -DENABLE_GO2RTC=OFF -DENABLE_MQTT=OFF` + - `cmake --build build/eng-T3 -j2` + - `ctest --test-dir build/eng-T3 --output-on-failure --no-tests=error -R 'test_(system_health_proc|stream_state|shutdown_coordinator|mp4_audio_recovery|mp4_writer_watchdog|storage_retention_sqlite)$'` +- **status**: Completed (commit `561d235c`) +- **log**: Built HEAD `7db92e0d` (compiled sources identical to `8927bc8a`; diff from `1b8d4332` is SPDX comments only), archived under the plan's `1b8d4332` path. As-specified lean Debug: 146/153 pass, targeted 5/6 (`test_mp4_audio_recovery` fails). All 7 failures are a host defect: stale FFmpeg 7.1 headers/.pc in `/usr/local` with libs moved away, so builds compile against 7.1 and link 8.0.1 (avcodec_open2 -22, ASan in av_buffer_unref). Control build with system pkg-config/headers: 153/153 and 6/6 — no code baseline failures. Archives: `debug-lean-as-specified/` (failure repro only), `debug-lean-system-ffmpeg/` (functional/sanitizer baseline), `release-full-system-ffmpeg/` (SOD/LiteRT/go2rtc/MQTT; needs `LD_LIBRARY_PATH=bin/`; approximate T5 reference, not the shipped container). x86_64 only; no arm/MIPS/device evidence. Coverage: 59 registered lean tests never run in CI; go2rtc/SOD tests never run; Playwright CI runs only UI project; no scheduled workflows; recovery tests are mostly link-time mocks. Missing cases recorded for T27 (real disconnect deadlines, post-recovery playability/timestamps, video-only/AAC, retry-exhaustion cooldown, segment metadata), T28 (ENOSPC/EIO, read-only/unmounted, retention modes, protected-file real delete path), T29 (shutdown deadline vs 900 s watchdog, SIGKILL recovery — `storage_reconcile_incomplete_recordings()` untested, upgrade fixtures absent). T31 candidates: stream state transition table; system API `/proc` parsing onto existing collectors (lowest risk); go2rtc_process `/proc` seam; reconcile policy/I-O split; injectable disk-space check. Gotcha for T13: runner must pin FFmpeg paths or fail on header/library version mismatch. +- **files edited/created**: `quality/operational-coverage.json`, `quality/native-profiles.json`, `quality/evidence/T3.md` + +### T4: Measure and gate web asset budgets +- **depends_on**: [] +- **agent_type**: worker +- **ownership**: `scripts/quality/assets.mjs`, `quality/web-budgets.json`, `quality/evidence/T4.md`, `tests/quality/assets.test.mjs`; no manifest/Vite changes. +- **description**: Build the unchanged frontend under an exclusive lease. Implement a dependency-light reporter/checker for default and modern-only outputs: installed bytes including compressed copies/locales, per-entry compressed JS/CSS, shared/lazy chunks, and dependency composition. Archive both outputs, configuration, and hashes under separate `build/eng-baseline/1b8d4332/web-default/` and `web-modern/` directories before subsequent builds overwrite dist. Record exact commands, commit, flags, and justified numeric budgets. +- **acceptance_criteria**: + - Baselines predate TS/toolchain changes; byte counting does not double-count shared chunks or confuse installed/transfer costs. + - Checker rejects missing/stale artifacts and a deliberately oversized fixture; budgets cannot silently self-update. +- **validation**: + - `npm ci --prefix web` + - `node scripts/quality/assets.mjs --capture --profile default` + - `node scripts/quality/assets.mjs --capture --profile modern` + - `node --test tests/quality/assets.test.mjs` +- **status**: Completed (commit `f1ab93b5`) +- **log**: RED (module-not-found, `build/eng-artifacts/T4/red.log`) → GREEN 9/9 node:test (no double-counted shared chunks; missing/stale/wrong-profile/oversized/unknown-budget failures; budgets file unchanged). Real `--check` passes on fresh builds (default 66 budgets, modern 43) and fails on wrong profile, newer source, deleted chunk. Profiles: default = `npm run build` (modern+legacy, 18 locales); modern = `LIGHTNVR_WEB_LEGACY=false`; capture scrubs `LIGHTNVR_WEB_*`/Sentry/sourcemap env. web/ is identical to `1b8d4332` (default captured at `7db92e0d`, modern at `ff6a7d60`; capture refuses if web/ differs). Builds are byte-reproducible. Baselines: installed 11.27 MB default / 7.90 MB modern; served modern JS 604,760 / 584,455; Live first load 451,434 / 425,660. Budgets: totals +3% (min 4 KiB), per-entry +5% (min 2 KiB). Gotchas: no Vite manifest (checker parses HTML/JS refs); web/dist holds one profile at a time, so check right after building that profile and run `npm ci` before building (staleness); no lazy chunks (hls.js in shared Live chunk); ~118 KB unreferenced `css/*.css` copies installed; npm ci skips esbuild/core-js/unrs-resolver install scripts. +- **files edited/created**: `scripts/quality/assets.mjs`, `quality/web-budgets.json`, `quality/evidence/T4.md`, `tests/quality/assets.test.mjs` + +### T5: Establish constrained targets and runtime budgets +- **depends_on**: [T3, T4] +- **agent_type**: local +- **ownership**: `quality/target-profiles.json`, `quality/runtime-budgets.json`, `quality/evidence/T5.md`. +- **description**: Name the constrained NVR and viewing browser, supported architecture/feature profiles, workload, stream fixture parameters, cold/warm cache states, and repeatable measurement method. Use immutable T3/T4 baseline artifacts, or build the pinned baseline in an isolated checkout for additional targets; never measure an evolving checkout or overwritten web/dist as the original baseline. Capture browser and NVR resource baselines separately; settle required MIPS/non-container coverage with available project context or one focused clarification. +- **acceptance_criteria**: + - Numeric limits and tolerances are justified by measurements; no placeholder target or fictitious physical result. + - Missing hardware is an explicit blocker for target acceptance; unrelated development continues. +- **validation**: + - `python3 -m json.tool quality/target-profiles.json` + - `python3 -m json.tool quality/runtime-budgets.json` + - Repeat the recorded workload on the named device/browser and compare samples under the declared method. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T6: Implement finding identity and exception policy checks +- **depends_on**: [T1] +- **agent_type**: worker +- **ownership**: `scripts/quality/findings.py`, `tests/quality/test_findings.py`, `tests/quality/fixtures/findings/`, `quality/findings-policy.json`, `quality/evidence/T6.md`. +- **description**: Normalize the inventoried report formats and compare stable findings against reviewed dispositions. Distinguish a valid empty result from missing/crashed/empty-scope scans. Handle exception expiry, tool/database provenance, rename stability, and explicit baseline edits. +- **acceptance_criteria**: + - A new finding fails even when another disappears; stale exceptions and missing expected reports fail. + - Reported scanner failure cannot be converted into success by a pipeline exit-code mistake. +- **validation**: + - `python3 -m unittest discover -s tests/quality -p test_findings.py` + - `python3 scripts/quality/findings.py --check --reports build/eng-artifacts/T1 --inventory quality/findings.json` +- **status**: Completed (commits `29eef189`, `27e4d57e`) +- **log**: RED (`ModuleNotFoundError: findings`) → GREEN 58/58 unittest. Stdlib checker normalizes CodeQL/Trivy SARIF, clang-tidy, cppcheck XML, eslint JSON/job log, npm audit, GitHub Dependabot/Code Quality/advisory/secret-scanning API files, reproducing T1 fingerprints. Identity comparison (new fingerprint or bucket increase fails regardless of disappearances); per-format scan-failure detection (truncated clang-tidy, cppcheck critical errors, npm audit error/zero deps, saved API error bodies, empty scope); exit codes 0 pass / 1 policy / 2 usage / 3 internal (never pass); provenance changes printed; renames only via explicit `path_renames`; `--check` never writes (hash-tested), `--update-baseline --reason` is the sole writer; `--release` ignores gaps and fails needs-triage. Real T1 check exits 0 with all fingerprints matched and 4 accepted, owner/expiry-bound coverage gaps printed as NOT SCANNED (cppcheck partial analysis, secret scanning disabled until 2026-12-31, no JS/TS CodeQL until 2027-01-31, sanitizer log not downloaded until 2026-11-30); without gaps / `--today 2026-12-01` / `--release` it fails truthfully. Gotchas: added `fixed-verified` disposition for T33; gap owners/expiries are proposals needing maintainer confirmation; T14 should emit `run-manifest.json` (files scanned, tool/DB versions) and then set `require_run_manifest: true`; line-independent identity behaves like a per-file count for duplicate diagnostics; eslint log fixture force-added past `*.log` ignore. Raw outputs in `build/eng-artifacts/T6/`. +- **files edited/created**: `scripts/quality/findings.py`, `quality/findings-policy.json`, `tests/quality/test_findings.py`, `tests/quality/fixtures/findings/`, `quality/evidence/T6.md` + +### T7: Materialize atomic remediation tasks +- **depends_on**: [T1, T2, T3, T4] +- **agent_type**: local +- **ownership**: this plan and `quality/remediation-map.json`; production code read-only. +- **description**: Apply the mandatory expansion protocol. Create one T7.* task per root cause, with exact affected files, reproducer, severity priority, and regression check. Separate dependency updates from code fixes. Serialize work overlapping pilot files, C tests, or shared configs. Add local merge/verification tasks and add their terminal IDs to T33. +- **acceptance_criteria**: + - All actionable inventory entries map to executable bounded tasks or reviewed upstream exceptions; critical fixes need not wait for TS migration. + - New tasks have no broad `src/**`/`web/**` ownership. T33 is fenced by explicit dependencies. +- **validation**: + - `python3 -m json.tool quality/remediation-map.json` + - Coordinator checks graph, ownership, evidence producers, and finding-to-task completeness before releasing fix workers. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T8: Establish strict TS, package, and Jest infrastructure +- **depends_on**: [T2, T4, T11] +- **agent_type**: local +- **ownership**: root/web package manifests and lockfiles; web tsconfigs, `web/babel.config.cjs`, `web/jest*.cjs`, `web/eslint.config.js`, `web/vite.config.js` only if needed; `web/tests/types/`; `quality/toolchain.json`. +- **description**: Pin compatible TypeScript, typed ESLint, Babel TS/JSX transforms, test typings, and generation/validation dependencies verified against T11's pilot schema. Put generator/tool dependencies in the root package and web transform/check dependencies in the web package as their import resolution requires. Configure Preact automatic JSX, strict/noUncheckedIndexedAccess/isolatedModules/noEmit and incremental JS coexistence. Register both `npm --prefix web run typecheck` and root `npm run typecheck:tests` now; the latter points to the test config delivered by T9. Add TS/TSX discovery/transforms and a real typed fixture. Preserve Node 24 and existing majors. No empty-project green check. +- **acceptance_criteria**: + - Valid Preact TSX is checked and executed; wrong props fail `tsc`; runtime remains Preact. + - Both Jest unit and Selenium E2E configs discover migrated test extensions; compiler, Babel, and lint peer compatibility is verified. + - New additions are build-time dependencies unless measured runtime use is necessary; remaining JS is explicitly untyped or checked, not silently counted as migrated. +- **validation**: + - `npm ci` and `npm ci --prefix web` (exclusive lease) + - `npm --prefix web run typecheck` + - `npm --prefix web test -- --runInBand` + - `npm --prefix web run build` + - Introduce/remove one temporary invalid prop in the fixture and verify a nonzero type-check exit. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T9: Type-check existing integration and load-test code +- **depends_on**: [T3, T8] +- **agent_type**: worker +- **ownership**: `tests/tsconfig.json`, `tests/load/`, existing `tests/integration/` TS files, `playwright.config.ts`; no packages or new contract specs. +- **description**: Supply the test tsconfig consumed by T8's already-registered root `typecheck:tests` target and inventory existing Playwright/load type errors. Repair a small cluster without broad ambient-any declarations. If repair exceeds that scope, append ordered T9.* tasks using the expansion protocol and add their terminal dependencies to both T13 and T15 rather than treating the entire suite as one worker rewrite. +- **acceptance_criteria**: + - Test code is checked independently of Playwright transpilation and Node type stripping. + - No test behavior or coverage is removed to satisfy types; task evidence lists discovered tests before/after. +- **validation**: + - `npm run typecheck:tests` (script registered by T8) + - `npx playwright test --list` + - Review the load CLI's typed configuration/argument flow without sending load; compiler coverage is the acceptance check for that code here. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T10: Preserve lint, hooks, and i18n across extension changes +- **depends_on**: [T8] +- **agent_type**: worker +- **ownership**: `web/eslint.config.js`, `web/eslint-rules/`, `web/i18n-literal-baseline.json`, `tests/quality/lint-compat.test.mjs`, `quality/evidence/T10.md`. +- **description**: Make TS/TSX AST handling and scoped hooks rules work with existing JS. Establish extension-independent baseline identity before migrations; verified JSX-to-TSX renames retain the original counts without waiting for another task. Reject duplicate implementation identities and do not increase allowances. Validate accessibility and untranslated-string detection on TSX as well as JSX. Keep legacy cleanup governed by the findings inventory. +- **acceptance_criteria**: + - A rename does not evade localization rules or produce a fresh larger baseline; typed expression wrappers cannot hide visible literals. + - Migrated scopes enforce hooks correctness and type escape policy while old findings stay explicit. +- **validation**: + - `node --test tests/quality/lint-compat.test.mjs` + - `npm --prefix web run lint` + - Demonstrate failures for one TSX visible string, invalid hooks use, and representative accessibility violation in a clean enforced scope. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T11: Specify the pilot contract from real behavior +- **depends_on**: [T2] +- **agent_type**: worker +- **ownership**: `docs/api/openapi.yaml`, `docs/api/contracts/streams.yaml`, `docs/api/contracts/common.yaml`, `tests/contracts/fixtures/streams/`, `quality/evidence/T11.md`. +- **description**: Define OpenAPI 3.1 operations for list/summary, full edit detail, PUT, and read-only option dependencies identified in T2. Model viewer redaction separately from admin edit data, current errors, nullability, numeric limits, encoded names, schedule values, and retention semantics. Keep out-of-pilot APIs inventoried. Use synthetic manually reviewed fixtures, not only snapshots of current code. +- **acceptance_criteria**: + - Schema matches observed routing and policy; discrepancies become findings rather than undocumented wire changes. + - Sensitive fields cannot be required in viewer models or accidentally accepted as evidence of correct redaction. +- **validation**: + - Review each method/status/model against C handlers and the recorded T2 call graph. + - Contract syntax and fixture validation run in T12 before this artifact becomes a usable generated contract. +- **status**: Completed (commit `a764b6ca`) +- **log**: Recovered abandoned specification and independently verified 178 references, 53 schemas, and 91 fixtures (39 valid/52 invalid). Corrected encoded path suffix boundaries and query parsing descriptions; 15 path cases. Observed C behavior is distinguished from stricter client validation. T12 must enforce byte limits and embedded JSON contentSchema explicitly. T11 findings feed T7. +- **files edited/created**: `docs/api/openapi.yaml`, `docs/api/contracts/{streams,common}.yaml`, `tests/contracts/fixtures/streams/`, `quality/evidence/T11.md` + +### T12: Generate and validate contract artifacts deterministically +- **depends_on**: [T8, T11] +- **agent_type**: worker +- **ownership**: `scripts/quality/contracts.mjs`, `web/js/api/generated/`, `tests/contracts/generated/`, `tests/quality/contracts.test.mjs`, `quality/evidence/T12.md`; package requests go to integrator. +- **description**: Validate/bundle local schema refs; generate runtime-free TS types and compact standalone validators for selected external boundaries using packages already verified/installed by T8. Prefer openapi-typescript and a compatible JSON Schema 2020-12 validator; verify OpenAPI annotations/dialect, role variants, response headers and status handling instead of passing the entire OpenAPI object as a JSON Schema. If an additional package is unavoidable, the coordinator inserts a local package-owner prerequisite before this task; do not wait on downstream T15 or edit manifests concurrently. +- **acceptance_criteria**: + - `--check` generates in a temporary directory and compares bytes, detecting stale/untracked generated outputs without mutating the checkout. + - Known-invalid fixtures fail; permitted extra fields and missing required/redacted data follow explicit policy. Generator/compiler runtime is absent from shipped assets. +- **validation**: + - `node scripts/quality/contracts.mjs --generate` + - `node scripts/quality/contracts.mjs --check` + - `node --test tests/quality/contracts.test.mjs` + - `npm --prefix web run typecheck` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T13: Isolate native, API, and UI validation runs +- **depends_on**: [T3, T9] +- **agent_type**: local +- **ownership**: `scripts/quality/run-native.py`, `scripts/quality/run-integration.mjs`, `tests/integration/global-{setup,teardown}.ts`, shared integration fixtures/configuration, `playwright.config.ts`, `tests/unit/CMakeLists.txt`, `tests/quality/test_runners.py`. +- **description**: Create task-scoped test runners and configure ports/storage/PIDs/reports consistently. Replace current fixed-port assumptions and generated config mismatches, or retain explicit serialization where hardcoding cannot be safely removed. Protect cleanup with run ownership, loopback-only targets, and PID provenance. Add an `eng` test-fragment registration seam for later native tests. Runner builds/binary selection and optional go2rtc fixtures must be explicit. +- **acceptance_criteria**: + - Tests cannot delete another run's files or stop an unrelated service; no server run follows a production LIGHTNVR_URL. + - Concurrent runs pass only after isolation is proven; otherwise the runner enforces a serial lock. No selected tests is failure. +- **validation**: + - `python3 -m unittest discover -s tests/quality -p test_runners.py` + - `node scripts/quality/run-integration.mjs --task T13 --project api --grep @api` + - `python3 scripts/quality/run-native.py --task T13 --regex '^test_system_health_proc$'` + - Prove independent test-data/process ownership and failure propagation under the configured concurrency mode. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T14: Wire analysis reports and blocking policy into CI +- **depends_on**: [T6, T8, T10] +- **agent_type**: local +- **ownership**: `.github/workflows/static-analysis.yml`, `codeql-analysis.yml`, `container-scan.yml`, `quality/scanners.json` scope extensions, `quality/evidence/T14.md`. +- **description**: Preserve raw-report artifacts while applying the T6 policy. Add frontend JS/TS security coverage and explicit production/development dependency reports. Record scanner exit/report status independently; ensure changed tool/database versions remain visible. Do not mistake CodeQL upload success for an enforced no-new-alert gate; connect actual finding policy or verified repository code-scanning rules. +- **acceptance_criteria**: + - New findings and scanner errors produce required failing statuses; artifact upload still occurs. + - Optional-feature exclusions and production image/architecture scope are visible; valid no-finding scans remain distinguishable from no scan. +- **validation**: + - `python3 -m unittest discover -s tests/quality -p test_findings.py` + - Run CI on an authorized test branch or equivalent isolated runner; attach evidence for clean, new-finding, and scanner-error cases. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T15: Integrate foundation checks and required-status policy +- **depends_on**: [T4, T7, T9, T10, T12, T13, T14] +- **agent_type**: local +- **ownership**: shared manifests/lockfiles, `.github/workflows/integration-test.yml`, new engineering workflow if justified, `quality/required-checks.json`, `quality/evidence/T15.md`. +- **description**: Resolve infrastructure changes, finalize command registrations and dependency pins, and add local/CI type/lint/unit/asset/schema statuses with explicit path-filter behavior. T39 activates real pilot contract CI once T18 exists; never allow an empty future suite to report success. Produce the concrete required-status settings for T38, without making remote administrative access a prerequisite for local development. +- **acceptance_criteria**: + - Foundation runs on a stable integrated snapshot, including existing Live compatibility tests and both web build modes. + - Foundation code/CI passes independently of remote administration; T38 owns actual enforcement evidence and fences pilot/final acceptance. +- **validation**: + - `npm --prefix web run typecheck` + - `npm run typecheck:tests` + - `npm --prefix web run lint` + - `npm --prefix web test -- --runInBand` + - `node scripts/quality/contracts.mjs --check` + - `node scripts/quality/assets.mjs --check --profile default` + - `node scripts/quality/assets.mjs --check --profile modern` + - Review the proposed branch/ruleset diff against `quality/required-checks.json`; actual enforcement is validated by T38. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T38: Apply and verify pilot required-check enforcement +- **depends_on**: [T15, T39] +- **agent_type**: local +- **ownership**: reviewed remote required-status configuration, `quality/evidence/T38.md`; no application code. +- **description**: Read current repository rules, apply the concrete type/lint/analysis/assets/schema/real-contract required-check diff with appropriate authority, and verify the actual job identities and path-filter behavior. Preserve unrelated branch protections. Missing authority blocks this task and pilot acceptance while independent implementation can continue. +- **acceptance_criteria**: + - An actual failing required status prevents merge, including the T39 real C contract lane; workflow YAML alone is insufficient evidence. + - No security setting is weakened. T35 must reconcile this evidence again when final statuses are added. +- **validation**: + - Read back branch/ruleset requirements and compare with `quality/required-checks.json`. + - Demonstrate required-status enforcement on an authorized test PR or equivalent repository check evaluation; do not merge deliberately failing code. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T16: Type and validate fetch boundaries +- **depends_on**: [T15] +- **agent_type**: worker +- **ownership**: `web/js/fetch-utils.{js,ts}`, new `web/js/api/http.ts`, `web/tests/fetchUtils.spec.*`, `quality/evidence/T16.md`. +- **description**: Introduce typed HTTP/error/cancellation results and unknown JSON with explicit decoders. Preserve credentials, timeout/retry behavior, and mutations that may have succeeded despite a missing response. Keep a narrow compatibility facade for unconverted consumers; never assert arbitrary JSON as the caller's chosen generic type. +- **acceptance_criteria**: + - Pilot fetches require validation; legacy paths are recorded and cannot silently count as checked. + - Retry, abort listener cleanup, 401/403 handling, malformed bodies, and mutation timeout behavior retain regression coverage. +- **validation**: + - `npm --prefix web run typecheck` + - `npm --prefix web test -- --runInBand --testPathPatterns=fetchUtils` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T17: Type async UI primitives +- **depends_on**: [T15] +- **agent_type**: worker +- **ownership**: `web/js/hooks/useAsyncAction.{js,ts}`, `web/js/components/preact/AsyncButton.{jsx,tsx}`, `web/tests/useAsyncAction.spec.*`, `quality/evidence/T17.md`. +- **description**: Type action signatures, pending/error states, props and events while preserving double-submit protection, localization, and existing callers through checked compatibility exports. Use the canonical rename identity established by T10 so lint acceptance does not depend on later integration. +- **acceptance_criteria**: + - Promise result/error handling is explicit; unmount/cancellation and repeated invocation are covered without new runtime dependencies. +- **validation**: + - `npm --prefix web run typecheck` + - `npm --prefix web test -- --runInBand --testPathPatterns=useAsyncAction` + - `npm --prefix web run lint` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T18: Test pilot contracts against the real C backend +- **depends_on**: [T15] +- **agent_type**: worker +- **ownership**: `tests/integration/specs/streams-contract.api.spec.ts`, `tests/contracts/fixtures/streams/` test additions, `quality/evidence/T18.md`; C/schema fixes go through owners. +- **description**: Add @contract tests for admin/viewer/denied access, redaction, list/summary/full variants, encoded names, valid edit, rejected edit with unchanged state, and option dependencies. Verify sensitive-field absence independently of permissive schema validation. Use synthetic test accounts/data. +- **acceptance_criteria**: + - Real C responses satisfy the contract and policy; a deliberately wrong fixture/expectation fails. + - Any real defect produces a remediation task; tests/schema are not weakened merely to make it pass. +- **validation**: + - `node scripts/quality/run-integration.mjs --task T18 --project api --grep @contract` + - `npm run typecheck:tests` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T39: Activate the real pilot contract CI lane +- **depends_on**: [T18] +- **agent_type**: local +- **ownership**: contract job in the T15 engineering/integration workflow, `quality/required-checks.json`, `quality/evidence/T39.md`. +- **description**: Wire T18's actual C contract suite into PR CI, using the isolated runner and explicit build/fixture prerequisites. Ensure contract, handler, schema, and relevant client changes trigger it; update the concrete required-status plan for T38. Keep report upload independent of test success. +- **acceptance_criteria**: + - Real contract assertions and a wrong fixture fail the CI job; absent/zero selected tests cannot pass. + - The lane is ready before pilot acceptance and broad rollout, with actual status names recorded. +- **validation**: + - `node scripts/quality/run-integration.mjs --task T39 --project api --grep @contract` + - Verify CI trigger coverage, output artifacts, nonzero failure propagation, and expected test count on an authorized test branch or isolated equivalent. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T19: Type query/mutation interfaces and pilot API client +- **depends_on**: [T16] +- **agent_type**: worker +- **ownership**: `web/js/query-client.{js,ts}`, `web/js/api/streams.ts`, `web/tests/queryClient.spec.ts`, `web/tests/streamsClient.spec.ts`. +- **description**: Preserve both existing query call forms and cache behavior. Type keys, decoder-derived results, mutation input/output, invalidation and cancellation. Use generated pilot types/validators from T12. Isolate any inadequate third-party typings behind a narrow tested adapter, not a module-wide any declaration. +- **acceptance_criteria**: + - Client types distinguish redacted summary data from admin forms; network errors remain typed and observable. + - Existing JS consumers still work; migrated consumers cannot get unchecked generic results. +- **validation**: + - `npm --prefix web run typecheck` + - `npm --prefix web test -- --runInBand --testPathPatterns='queryClient|streamsClient|fetchUtils'` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T20: Type the edit form and form model +- **depends_on**: [T17, T18, T19] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/StreamConfigModal.{jsx,tsx}`, new `web/js/components/preact/streams/streamForm.ts`, `web/tests/streamForm.spec.ts`. +- **description**: Separate editable strings/checkboxes/schedules from wire models. Preserve full-detail loading, secret/redacted-field semantics, tri-state retention, optional values, and unchanged-field submission. Describe any ZoneEditor/legacy child boundary explicitly without assuming unknown props are safe. +- **acceptance_criteria**: + - Validated form conversion handles malformed values and omission semantics; no implicit-any props or destructive defaulting of missing credentials. +- **validation**: + - `npm --prefix web run typecheck` + - `npm --prefix web test -- --runInBand --testPathPatterns=streamForm` + - `npm --prefix web run lint` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T21: Type stream cards without changing snapshot behavior +- **depends_on**: [T17, T18, T19] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/StreamCard.{jsx,tsx}`, `web/tests/streamCard.spec.ts`. +- **description**: Type redacted operational data, callbacks, and badge helpers. Preserve bounded snapshot concurrency, cleanup/release, async actions, and mobile markup; edit/delete/bulk behavior outside list/edit remains delegated through explicit callbacks. +- **acceptance_criteria**: + - Missing optional data has defined display behavior and no privileged-field assumption; snapshot slot cancellation/release is tested where relevant. +- **validation**: + - `npm --prefix web run typecheck` + - `npm --prefix web test -- --runInBand --testPathPatterns=streamCard` + - `npm --prefix web run lint` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T22: Integrate the typed Streams list/edit feature +- **depends_on**: [T20, T21] +- **agent_type**: local +- **ownership**: `web/js/components/preact/StreamsView.jsx`, new `web/js/components/preact/streams/StreamListEditor.tsx`, `web/js/pages/streams-page.jsx`, pilot import shims. T10's canonical i18n identity already covers renames. +- **description**: Wire the typed API/model/components into the existing page. Extract list/edit orchestration if needed so ONVIF/create/delete/bulk workflows remain separately inventoried. Give cross-boundary values explicit validated shapes; do not label the remaining legacy view fully migrated. Preserve filters, layout, auth, toasts, localization, and pending behavior. +- **acceptance_criteria**: + - List/edit has typed data flow end to end; unrelated flows still function; no duplicate implementation or new public route. +- **validation**: + - `npm --prefix web run typecheck` + - `npm --prefix web test -- --runInBand` + - `npm --prefix web run build` + - `node scripts/quality/contracts.mjs --check` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T23: Exercise pilot UI and preserved Live behavior +- **depends_on**: [T22] +- **agent_type**: worker +- **ownership**: `tests/integration/specs/streams.ui.spec.ts`, new `tests/integration/specs/streams-typed.ui.spec.ts`, `quality/evidence/T23.md`. +- **description**: Verify loading/empty/error/invalid-data/success states, viewer redaction, denied/permitted editing, failed-edit persistence, cancellation, and duplicate-submit behavior. Use controlled failure responses for UI branches plus real C contract coverage. Run existing Live tests unchanged as a compatibility check. +- **acceptance_criteria**: + - UI state assertions are behavioral; test count does not shrink; accessibility/localization behavior remains intact. +- **validation**: + - `node scripts/quality/run-integration.mjs --task T23 --project ui --grep 'Streams|@streams-typed'` + - `npm --prefix web test -- --runInBand --testPathPatterns='liveViewTransportTabs|liveViewUrl'` + - `npm run typecheck:tests` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T24: Accept the pilot and measure rollout cost +- **depends_on**: [T5, T23, T38] +- **agent_type**: local +- **ownership**: `quality/pilot-acceptance.json`, `quality/evidence/T24.md`, pilot-only integration corrections. +- **description**: Run the stable pilot against budget/contract/type/UI gates, inspect type escapes and generated size, and record conversion/review effort. If blockers arise, create bounded corrections and add dependencies; do not start broad migration on an unaccepted pilot. +- **acceptance_criteria**: + - PRD pilot acceptance passes with actual C and agreed resource evidence; known unresolved findings affecting this feature block acceptance. + - Document limitations: this says nothing by itself about recorder concurrency or complete API coverage. +- **validation**: + - Repeat T15's frontend checks and T18's contract run on the integrated revision. + - `node scripts/quality/assets.mjs --check --profile default` + - `node scripts/quality/assets.mjs --check --profile modern` + - Run the T5 profile's recorded browser/NVR workload and compare budgets. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T25: Materialize the remaining frontend and API rollout +- **depends_on**: [T2, T24] +- **agent_type**: local +- **ownership**: this plan, `quality/rollout-map.json`, consolidated application/API inventory updates; code read-only. +- **description**: Apply the mandatory expansion protocol using measured pilot cost. Cover shared auth/i18n/navigation/UI first; then Live transport helpers/cells and the shared Live view; recordings/timeline; settings tabs; system/health; users/audit; fleet; events; investigation/LPR; remaining stream/ONVIF/bulk flows; and every leftover utility/page/test. Split each area into small exact file clusters. Add its schema and real C contract tests before typed consumers. Include raw-source test paths, imports, legacy shims, and non-JSON media protocols. Insert explicit local T25.* schema-aggregation/code-generation/package checkpoints before each dependent consumer wave, with exclusive write ownership; those checkpoints must not depend on downstream T26. Attach all terminal tasks to T26. +- **acceptance_criteria**: + - Every remaining file and UI API operation is covered exactly once, with no catch-all migration worker and no recreated WebRTCView. + - Tasks preserve field/redaction semantics, run type/lint/domain tests and budgets, and serialize actual shared ownership. +- **validation**: + - `python3 -m json.tool quality/rollout-map.json` + - Compare the map against `rg --files web/js` and T2 API inventory; coordinator verifies graph and all shared-write constraints. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T26: Integrate the full typed application and contracts +- **depends_on**: [T25] +- **agent_type**: local +- **ownership**: central OpenAPI/common definitions, generated outputs, shared import/config/manifest integration, `quality/evidence/T26.md`. +- **description**: **Locked until T25 has inserted completed rollout dependencies.** Perform final reconciliation after the local T25.* checkpoints have supplied generated types and integration support to their consumers. Regenerate deterministically and merge any bounded final corrections without expanding worker ownership. Verify all UI operations and inventoried public APIs have contract/protocol coverage as required by the PRD; incomplete endpoints remain blockers rather than schema-less success. +- **acceptance_criteria**: + - Every T25.* implementation/integration task is complete; full UI/API suites pass on one revision with no missing discovered tests or unchecked application files. +- **validation**: + - `npm --prefix web run typecheck` + - `npm run typecheck:tests` + - `npm --prefix web test -- --runInBand` + - `node scripts/quality/contracts.mjs --check` + - `node scripts/quality/run-integration.mjs --task T26 --project api` + - `node scripts/quality/run-integration.mjs --task T26-ui --project ui` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T27: Close media recovery and segment regression gaps +- **depends_on**: [T3, T13] +- **agent_type**: worker +- **ownership**: `tests/unit/test_mp4_audio_recovery.c`, `test_mp4_recovery_watchdog.c`, `test_mp4_writer_watchdog.c`, `test_mp4_segment_boundaries.c`, `test_mp4_segment_timestamps.c`; `tests/fixtures/eng/media/`, `tests/operational/media/`, native registration fragment `tests/unit/cmake/eng/media.cmake`. +- **description**: Fill only T3's missing assertions for disconnect/audio recovery, segment duration/order/timestamps and playable output, with synthetic FFmpeg sources and declared deadlines. Keep production fixes in separate remediation tasks. Preserve existing recent audio/watchdog coverage. +- **acceptance_criteria**: + - Tests demonstrate actual media validity where claimed; fixture thresholds are explicit and unexpected gaps fail. +- **validation**: + - `python3 scripts/quality/run-native.py --task T27 --regex '^test_mp4_(audio_recovery|recovery_watchdog|writer_watchdog|segment_boundaries|segment_timestamps)$'` + - Run each new real-media scenario using its documented synthetic source and ffprobe assertions; record output diagnostics. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T28: Close storage and retention failure gaps +- **depends_on**: [T3, T13] +- **agent_type**: worker +- **ownership**: `tests/unit/test_storage_retention_sqlite.c`, `test_storage_pressure.c`, `test_storage_pressure_extended.c`, `test_storage_manager_retention.c`; `tests/fixtures/eng/storage/`, `tests/operational/storage/`, `tests/unit/cmake/eng/storage.cmake`. +- **description**: Exercise inherited/unlimited/finite retention, protected files, ENOSPC/read-only/unavailable storage, and recovery with real SQLite where applicable. Use fault injection or disposable constrained filesystems; never fill or remount the host's working filesystem. +- **acceptance_criteria**: + - Rejected cleanup preserves protected media; failure/recovery updates correct metadata; scenario limits and failure injection are reproducible. +- **validation**: + - `python3 scripts/quality/run-native.py --task T28 --regex '^test_storage_(retention_sqlite|pressure|pressure_extended|manager_retention)$'` + - Run isolated storage fault scenarios and inspect database integrity plus retained-file assertions. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T29: Test shutdown, restart, and upgrade continuity +- **depends_on**: [T3, T13] +- **agent_type**: worker +- **ownership**: `tests/unit/test_shutdown_coordinator.c`, `tests/operational/lifecycle/`, `tests/fixtures/eng/upgrade/`, `tests/unit/cmake/eng/lifecycle.cmake`. +- **description**: Add missing shutdown-deadline, forced-kill recovery, committed/incomplete media reconciliation, previous-supported-release database/config upgrade, and browser preference compatibility evidence. Store provenance for synthetic old-version fixtures. Observe graceful timeout separately from teardown's fallback SIGKILL so a hang cannot appear to pass. +- **acceptance_criteria**: + - Database integrity, preserved recordings, preferences, and expected lifecycle state are checked after restart/upgrade. + - Unsupported downgrade paths are described, not assumed safe or exercised on real state. +- **validation**: + - `python3 scripts/quality/run-native.py --task T29 --regex '^test_shutdown_coordinator$'` + - Execute the recorded lifecycle/upgrade commands against isolated old-version fixtures; verify deadline and persistence assertions independently of process exit. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T30: Define and run repeated lifecycle/resource scenarios +- **depends_on**: [T5, T27, T28, T29] +- **agent_type**: worker +- **ownership**: `scripts/quality/soak.py`, `tests/operational/soak/`, `quality/soak-profiles.json`, `quality/evidence/T30.md`. +- **description**: Compose the tested failure cases into bounded soak profiles with declared duration/load/recovery tolerances; sample RSS/CPU/FD/thread counts and recording gaps. Support unattended artifact collection and clear pass/fail; keep physical calibration under T36. Assess a separate race-detection build without combining TSan with ASan/UBSan or hiding incompatible dependencies. +- **acceptance_criteria**: + - Unbounded growth, missed recovery deadlines, deadlocks, sanitizer findings, and unexpected gaps fail; unsupported observations are reported as unavailable. +- **validation**: + - `python3 scripts/quality/soak.py --profile ci --output build/eng-artifacts/T30` + - Exercise a controlled failing recovery/resource fixture to prove the summary cannot report green. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T31: Select and materialize one bounded C improvement +- **depends_on**: [T3, T7] +- **agent_type**: local +- **ownership**: this plan, `quality/c-boundary.json`; production code read-only. +- **description**: Choose one evidenced finding or heavily changed responsibility. Document ownership, allocation/free, thread affinity, callbacks, locks, cancellation and shutdown, or pure-policy/I/O separation as applicable. Apply the expansion protocol: exact precondition tests, one bounded refactor, and local verification tasks; add terminal IDs to T32. Add explicit dependencies from child refactor tasks to the operational/precondition tests they consume, and serialize overlapping test-file ownership. `/proc` is a candidate, not a mandate to change sound code. If no benefit is demonstrated, record the unresolved selection and keep acceptance open. +- **acceptance_criteria**: + - Worker ownership is exact, behavioral tests precede implementation, and shared lifecycle/schema changes are excluded or locally integrated. + - No broad backend rewrite or Rust dependency is introduced. +- **validation**: + - `python3 -m json.tool quality/c-boundary.json` + - Review documented invariants and the added task DAG against actual callers and T3 evidence. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T32: Integrate and verify the C boundary improvement +- **depends_on**: [T5, T27, T28, T29, T31] +- **agent_type**: local +- **ownership**: selected boundary integration paths from T31, `quality/evidence/T32.md`; no unrelated native modules. +- **description**: **Locked until completed T31.* dependencies are inserted.** Reconcile the selected refactor, verify evidence of simpler ownership/reduced coupling or removal of the defect, and rerun affected operational/sanitizer checks. +- **acceptance_criteria**: + - Bounded C1 outcome is demonstrated with unchanged public/persistence behavior or a separately documented bug fix; resource limits hold. +- **validation**: + - Run the exact focused native/operational commands recorded by T31 plus its relevant T27–T29 scenarios. + - Reproduce the affected workload under ASan/UBSan and compare its T5 resource profile. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T33: Verify remediation closure and refresh findings evidence +- **depends_on**: [T7, T14] +- **agent_type**: local +- **ownership**: findings dispositions/inventory, `quality/evidence/T33.md`; production changes only through explicit fix tasks. +- **description**: **Locked until all T7.* terminal dependencies are inserted and complete.** Re-run scanners on the integrated revision. Resolve any new actionable findings through additional atomic tasks and dependencies. Check exceptions against current exposure/upstream state and expiry. Do not replace evidence with bulk suppression or warning-count reduction. +- **acceptance_criteria**: + - PRD release/final findings policy is met with complete expected report coverage; inaccessible required reports or unresolved first-party issues block completion. +- **validation**: + - `python3 scripts/quality/findings.py --check --reports build/eng-artifacts/T33 --inventory quality/findings.json` + - Review original-to-current finding identities, all exception records, and actual required scanner job results. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T34: Close migration escapes and retire temporary bridges +- **depends_on**: [T26] +- **agent_type**: local +- **ownership**: web/root type/lint configs, inventoried import shims and entrypoint references, `quality/application-inventory.json`, `quality/evidence/T34.md`. +- **description**: Verify that every first-party browser implementation is checked, remove temporary duplicate extensions/shims, and tighten final include/exclude policy. Keep only documented checked build/vendor exceptions. Reconcile tests, HTML entrypoints, source-path assertions, i18n baseline keys, and UI-operation coverage. Any substantial missed migration becomes an atomic dependency, not a catch-all cleanup. +- **acceptance_criteria**: + - No unchecked implementation is hidden behind an allowJs flag, excluded directory, broad declaration, or ts-nocheck. + - Strict checks, hooks/accessibility/localization enforcement, generated consistency, and full test discovery hold after bridge removal. +- **validation**: + - `npm --prefix web run typecheck` + - `npm run typecheck:tests` + - `npm --prefix web run lint` + - `npm --prefix web test -- --runInBand` + - `node scripts/quality/contracts.mjs --check` + - Compare final inventory to `rg --files web/js` and inspect all recorded escapes/exclusions. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T35: Integrate complete PR, scheduled, and release qualification gates +- **depends_on**: [T30, T32, T33, T34, T38] +- **agent_type**: local +- **ownership**: workflow/config/manifest integration, native test registration integration, `quality/required-checks.json`, contributor instructions, `quality/evidence/T35.md`. +- **description**: Wire PR type/lint/assets/contract/regression lanes, scheduled media/soak lanes, supported-feature scans, and release upgrade/device evidence. Revalidate repository required-check settings and path-filter behavior. Full integration must include serial/shared resources and optional-feature production coverage, not only lean tests. Keep deployment/publishing outside test commands. +- **acceptance_criteria**: + - All required checks have truthful outcomes and retained diagnostics; scheduled/release failures have owners and cannot be counted as passed by quarantine/retry. + - Local contributor commands reproduce CI checks and the combined system passes on one revision. +- **validation**: + - Run full type/lint/unit/API/UI/go2rtc suites through the isolated runners and the native profiles recorded by T3. + - Run T6 findings, T12 generation, T4 asset checks, T27–T30 operational lanes and upgrade checks against the same revision. + - Verify remote required statuses and intentional failure propagation; missing authority leaves this acceptance gate open. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T36: Qualify supported targets and constrained operation +- **depends_on**: [T5, T35] +- **agent_type**: local +- **ownership**: `quality/evidence/T36.md`, target/runtime evidence records; budget changes require a separate reviewed rationale. +- **description**: Run actual target builds and the agreed physical NVR/browser workload, repeated lifecycle/recording tests, both web profiles, and required production feature combinations. Compare against P0 numbers with identical fixtures, not an easier workload. Confirm prior-release upgrade behavior for supported packages. +- **acceptance_criteria**: + - All required target/feature/resource profiles have passing evidence; unsupported or inaccessible hardware remains explicitly incomplete. + - No performance claim is based solely on an emulator or cross-compiler; no silent budget reset. +- **validation**: + - Execute the exact build/workload commands captured in `quality/target-profiles.json` and `quality/runtime-budgets.json`. + - `node scripts/quality/assets.mjs --check --profile default` + - `node scripts/quality/assets.mjs --check --profile modern` + - `python3 scripts/quality/soak.py --profile constrained --output build/eng-artifacts/T36` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T37: Reconcile final PRD acceptance and handoff +- **depends_on**: [T36] +- **agent_type**: local +- **ownership**: PRD implementation/acceptance status, `docs/prd/README.md`, `quality/acceptance.md`, this plan's final status/log. +- **description**: Map Q1–Q3, T1–T3, A1–A3, R1, B1–B2, C1 and P0–P6 to completed evidence and exact revision. Include all expanded tasks. Keep deferred/blocked outcomes visible and leave the PRD incomplete if any required gate is missing. Document maintenance commands and open exception review dates. Rust remains a separate decision. +- **acceptance_criteria**: + - Every PRD acceptance item has a passing check or its explicitly permitted current exception; no planning/scaffold task is substituted for implementation. + - Final working-tree/ownership review preserves unrelated changes and identifies precisely what was implemented. +- **validation**: + - `python3 scripts/check_docs_links.py` + - `git diff --check` + - Manually trace every PRD acceptance bullet through the evidence matrix and verify final CI revision/target records agree. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +## Parallel Execution Groups + +These are dependency frontiers, not permission to exceed three worker slots or +run shared-checkout builds concurrently. Local tasks requiring shared config or +whole-tree evidence get an exclusive integration/validation lease. Expansion +tasks must update this table before their children are scheduled. + +| Wave | Tasks | Can Start When | +| --- | --- | --- | +| 1 | T1, T2, T3, T4 | Immediately; batch into available slots; reserve frontend build lease for T4 | +| 2 | T5, T6, T7, T11; then T8 | Respective inventory/baseline dependencies complete; T7 waits for archived T4 baseline; T8 also waits for T11 | +| 3 | T9, T10, T12; eligible T7.* | T8/T11 prerequisites complete; fix tasks honor concrete ownership edges | +| 4 | T13, T14, T31 | T9, T6/T10, or T3/T7 respectively; T13 and T14 serialize if shared infra needs overlap | +| 5 | T15; T27, T28, T29; eligible T31.* | Harness/foundation prerequisites complete; operational writers have disjoint files | +| 6 | T16, T17, T18; T30, T32, T33 when ready | T15 for pilot; separate operational/fix gates follow their task dependencies | +| 7 | T19, T39; then T38 | T16 for query; T18 for real contract CI; T15/T39 for remote enforcement | +| 8 | T20, T21 | Async primitives, actual C contracts, and typed client complete | +| 9 | T22 | Form and card integrated | +| 10 | T23 | Pilot wiring complete | +| 11 | T24 | UI evidence, T5 resource profiles, and T38 actual pilot enforcement ready | +| 12 | T25 then T25.* in newly recorded waves | Pilot accepted; exact rollout DAG and ownership validated | +| 13 | T26 then T34 | All materialized rollout dependencies complete | +| 14 | T35 | Soak, C improvement, remediation, and strict migration closure complete | +| 15 | T36 | Final CI integrated and actual target resources available | +| 16 | T37 | All qualification evidence complete | + +## Integration Strategy + +- T15 accepts infrastructure, T22/T24 accept the pilot, T26 accepts rollout, + T32 accepts C changes, and T35 accepts the combined system. Review both file + diffs and generated artifacts at each stable revision. +- Under shared checkout execution, workers edit directly and report files; + only the coordinator updates this plan and reconciles shared files. If using + isolated worktrees later, integrate one dependency-complete task at a time. + Do not require commits simply to satisfy this plan. +- Give every rename a source/import/test/i18n mapping. Avoid concurrent writes + to `openapi.yaml`, generated types, package locks, CMake, integration setup, + shared test snapshots, and the findings inventory. +- If a task discovers a missing prerequisite, ownership conflict, excessive + scope, incompatible dependency, or real bug, record the blocker and evidence + in its log. The coordinator adds a bounded task/edge or obtains missing input; + independent tasks continue. Never bypass a required gate, broaden ownership, + weaken assertions, or mark a missing hardware/admin result completed. +- Finding fixes overlapping upcoming migrations take priority; incorporate the + fix before the migration takes ownership and recapture affected baseline + behavior intentionally. Do not freeze a known defect into the API contract. + +## Testing Strategy + +- Fast PR checks: strict application/test types, lint and i18n/hook rules, + meaningful unit tests, generation drift, findings policy, and asset budgets. +- Real-server checks: role/redaction/side effects, Streams list/edit, all expanded + API contracts, preserved Live and critical UI flows. Contract tests validate + behavior independently of generated schema; snapshots alone are insufficient. +- Native checks: the existing supported CMake profiles, ASan/UBSan, focused + fault paths, real SQLite persistence/retention, media metadata/playability, + and shutdown deadlines. Separate race instrumentation if feasible. +- Scheduled/release checks: real media recovery, repeated lifecycle/soak, + prior-release upgrades, optional production feature builds, and physical + constrained-target qualification. Establish duration/tolerances before results. +- Negative gate demonstrations are temporary fixtures or meaningful policy-tool + tests. Do not commit deliberately broken application code or tests that merely + duplicate a config line. Report flakes, retries, and quarantine honestly. + +## Risks and Mitigations + +- **Risk**: An adaptive plan completes before its discovered work is performed. + **Mitigation**: Mandatory graph expansion and explicit terminal dependencies + fence T26/T32/T33; T37 checks the complete PRD evidence matrix. +- **Risk**: TSX makes unchanged tests disappear or stops i18n enforcement. + **Mitigation**: T2 inventories source-path consumers; T8/T10 handle discovery, + AST semantics and baseline keys before conversions; T34 verifies closure. +- **Risk**: Shared test ports, scratch storage, or PIDs cause destructive races. + **Mitigation**: T13 proves isolation or enforces serialization; unique build + directories and validation leases apply even to otherwise disjoint tasks. +- **Risk**: Strict typing forces the whole large Streams page into the pilot. + **Mitigation**: T22 extracts a typed list/edit feature with explicit adapters; + T25 assigns remaining create/delete/ONVIF work as separate bounded tasks. +- **Risk**: OpenAPI types create false confidence about runtime input or secrecy. + **Mitigation**: Unknown input plus bounded validators; independent redaction, + permission and side-effect assertions against C; explicit dialect support. +- **Risk**: Babel 8/Jest/ESLint additions or generated validators inflate scope. + **Mitigation**: Pin compatible tools in one task, preserve current majors and + Preact, measure output, and avoid a test-runner/framework replacement. +- **Risk**: Scanner reports or supported targets are unavailable. + **Mitigation**: Record missing access/hardware; keep affected acceptance open + while independent development proceeds. Do not substitute a green lean build. + +## Primary Documentation Checked + +These sources inform toolchain choices; resolve exact compatible versions during +T8 and retain the locked choices. Preact v10 documentation matches the current +runtime even though a newer major exists. + +- [Preact TypeScript](https://preactjs.com/guide/v10/typescript/): built-in types + and JSX configuration. +- [Vite TypeScript](https://vite.dev/guide/features.html#typescript): transpilation + is separate from type checking. +- [Babel TypeScript preset](https://babeljs.io/docs/babel-preset-typescript) and + [Jest TypeScript](https://jestjs.io/docs/getting-started#using-typescript): retain + Babel-based execution while checking types independently. +- [typescript-eslint](https://typescript-eslint.io/getting-started/): flat-config + integration; verify selected package peer compatibility. +- [openapi-typescript](https://openapi-ts.dev/introduction): OpenAPI 3.1 support + and runtime-free generated types. +- [Ajv JSON Schema](https://ajv.js.org/json-schema.html) and + [standalone validators](https://ajv.js.org/standalone.html): verify the required + dialect and generate validators at build time. + +## Reviewer Notes + +- Initial local review identified shared test ports/storage, extension-dependent + tests/i18n baselines, the large mixed-purpose Streams page, unknown findings, + and absent physical/admin evidence. The plan assigns explicit owners and gates + rather than assuming these risks away. +- Independent reviewer `review_foundation_plan` reviewed the complete draft and + PRD without editing files or running builds. Applied its dependency fixes: + T8 produces test commands and generation dependencies before consumers; + local T25.* checkpoints produce generated artifacts before rollout workers; + T32 explicitly waits for resource/operational evidence; and T3/T4 archive + immutable baseline artifacts for T5. +- Added T39 to activate real C contract CI before pilot acceptance and T38 to + verify remote required checks separately from local foundation work. T35 + rechecks the final ruleset after later statuses are added. T10 resolves i18n + extension identity before workers rename files. T9's optional expansion now + updates every consumer, and its validation avoids starting load. +- Execution resumed on 2026-10-31 after the previous executor hit its usage limit. + Task entries and their evidence are authoritative; incomplete acceptance gates + remain open. User explicitly deferred physical-device measurements. From e0544701fa69c33ed273172d1f4069a7076e4338 Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Sat, 31 Oct 2026 03:34:34 -0400 Subject: [PATCH 011/230] T5: record target profiles and deferred runtime calibration --- quality/evidence/T5.md | 153 +++++++++++++++ quality/runtime-budgets.json | 367 +++++++++++++++++++++++++++++++++++ quality/target-profiles.json | 206 ++++++++++++++++++++ 3 files changed, 726 insertions(+) create mode 100644 quality/evidence/T5.md create mode 100644 quality/runtime-budgets.json create mode 100644 quality/target-profiles.json diff --git a/quality/evidence/T5.md b/quality/evidence/T5.md new file mode 100644 index 000000000..3436da45a --- /dev/null +++ b/quality/evidence/T5.md @@ -0,0 +1,153 @@ +# T5 — Target profiles and runtime measurement protocol + +## Status + +Target inventory and measurement protocol are recorded. Physical-device/browser +calibration is **deferred by the user**, who said “Oh, we can defer that one” +after the coordinator explained the device-measurement question. This deferral +permits independent implementation to continue; it does not establish passing +resource budgets or satisfy B1/B2, T24, or T36 physical qualification. + +No device or browser was invented. All physical runtime metric baselines, +limits and tolerances are `null` with an explicit deferred status. Consumers +must treat missing limits as **unqualified**, never as unlimited or passing. +The numerical asset budgets already measured by T4 remain authoritative and +unchanged in `quality/web-budgets.json`. + +## Verification approach + +`reason_not_testable`: this task creates inventory/protocol data and collects +baseline observations. It does not change executable behavior. Verification is +JSON parsing, reconciliation with actual release workflows, archive hash checks, +and the repeated host experiment below. No RED/GREEN claim is made. + +The source inspected was `27e4d57e`; source/config files were read only. The +native/web measurements use the immutable T3/T4 archives rather than a changing +checkout or `web/dist`. + +## Supported targets and unresolved scope + +`quality/target-profiles.json` records: + +- Three container platforms: `linux/amd64`, `linux/arm64`, `linux/arm/v7`, from + `.github/workflows/docker-publish.yml`. +- Six Debian package combinations: sid/trixie × amd64/arm64/armhf, from + `.github/workflows/debian-package.yml`. Non-container packages are therefore + already a documented release requirement. +- Full production feature flags via `quality/native-profiles.json` and exact + local build commands that omit publishing. amd64→arm64 cross builds are + rejected by the Dockerfile: use the native arm64 runner. arm/v7 uses a native + amd64 cross compiler with an armhf sysroot, with QEMU used during target setup. +- Default and modern-only web profiles, both with all 18 locales, their archived + input hashes and output manifest hashes. English-only firmware assets are a + separate unmeasured profile. + +README.md still names the Ingenic A1, 256 MB and MIPS, while docs/BUILD.md +provides the embedded build profile. That is evidence of documented intent, +not an exact current physical device, MIPS toolchain or qualification result. +MIPS release necessity and the named constrained device/browser remain open +within the deferred calibration. `Dockerfile.alpine` is present without a +release workflow and is not silently asserted to be qualified or mandatory. +The manifests retain these open questions rather than dropping the targets. + +All nine release target combinations remain `not_run` for this task. Source +revision alone cannot reproduce mutable Debian package repositories; the +protocol also requires base image digests, package versions and loaded-library +provenance. Existing T3 debug sanitizer artifacts and its FFmpeg ABI-mismatched +artifact are explicitly excluded from performance comparisons. + +## Workload and measurement method + +`quality/runtime-budgets.json` defines a repeatable proposed calibration protocol: +synthetic H.264 baseline 1280×720, 15 fps, 1 Mbit/s, 30-frame GOP, no B frames; +video-only and AAC mono 48 kHz/64 kbit/s variants; zero/one/four streams; 60-second +segments; idle, recording, and recording-plus-browser phases. Generate the +source off-target and archive exact encoder version, command, media hash and +ffprobe output before taking a baseline. This is an experimental protocol, +not a claim that the fixture or the physical runs already exist. + +Physical calibration calls for five independent runs with one-second resource +samples, 60/120-second warmups and 300/600-second measurement phases. These +numbers define the experiment; they are not fabricated performance limits. +Future T27–T30 runners must implement the protocol and preserve its metadata. + +NVR PID/child CPU, RSS, file descriptors and threads are separate from browser +process/heap and interaction measurements. Recording continuity is derived from +actual playable segments and timestamps. Cold browser runs use fresh profiles +and cleared/disabled HTTP cache; warm runs reuse cache. “Cold NVR” means a new +process/database, not a claim to have flushed host page caches. No global cache +drop or production data is used. Metrics unavailable on a browser stay +unavailable, never zero. Derive tolerances from repeated physical measurements +and product recovery requirements before any numeric runtime gate is enabled. + +## Archived artifact verification + +From the repository root: + +```sh +python3 -m json.tool quality/target-profiles.json >/dev/null +python3 -m json.tool quality/runtime-budgets.json >/dev/null +(cd build/eng-baseline/1b8d4332/native/release-full-system-ffmpeg && sha256sum -c SHA256SUMS) +(cd build/eng-baseline/1b8d4332/web-default && sha256sum -c sha256sums.txt) +(cd build/eng-baseline/1b8d4332/web-modern && sha256sum -c sha256sums.txt) +``` + +Results: both JSON files parse; all 12 native archive files match; all 221 +default and 165 modern web files match. Web verification was also repeated via +Python SHA-256, with summary saved to +`build/eng-artifacts/T5/web-archive-verification.json`. + +## Host-only idle reference + +The coordinator granted an exclusive native/server/media measurement lease. +The experiment ran the archived release binary three times on the existing +AMD Ryzen 9 7950X, 32 logical CPUs, 128,614,452 KiB RAM, Ubuntu host with kernel +7.0.0-38-generic. This is not a constrained device and is not the shipped Debian +container. The archived binary is 10,362,224 bytes, SHA-256 +`a56ce959b256f08dd04fd72e0ad8054669ad300464894d99995efca2928a61d1`. + +Method: fresh process and disposable database per run, loopback ephemeral HTTP +port, archived default web assets, no browser or streams, go2rtc and MQTT +disabled at runtime, health collector enabled, hardware provider disabled. +Clear all `LIGHTNVR_*` environment overrides; set `LD_LIBRARY_PATH` to the +archive's `bin/` so the archived SOD library is used. Start with +`/bin/lightnvr -c /lightnvr.ini` and wait for HTTP +readiness; warm up 20 seconds then take 60 one-second `/proc/` +samples. CPU is delta user+system ticks / CLK_TCK / monotonic interval × 100, +where one full core is 100%. Record RSS/high-water RSS, FD count and threads. +Terminate only the subprocess created by that run; record graceful shutdown +separately from a 20-second fallback kill. No global process-name kills or +shared PID/storage directories are used. + +The exact collector and synthetic configurations are retained under ignored +`build/eng-artifacts/T5/measure-idle.py` and `idle-{1,2,3}/lightnvr.ini`. +`python3 build/eng-artifacts/T5/measure-idle.py` reproduces the experiment in +an empty T5 artifact directory; it intentionally refuses to overwrite existing +run directories. Preserve/move the existing T5 directory before a repeat, then +restore the collector. The raw `idle-host.json` and each run's stdout/logs are +retained there. These artifacts are local evidence, not installed product code. + +The host run is deliberately a shorter reference than the physical calibration +protocol. It cannot support recording/browser/recovery budgets and does not +qualify runtime-disabled features simply because they are compiled in. + +### Observed results + +| Run | RSS min–max (KiB) | CPU median / max (% of one core) | FDs | Threads | Graceful shutdown (s) | +| --- | ---: | ---: | ---: | ---: | ---: | +| 1 | 55524–55688 | 0.000 / 1.999 | 18–18 | 21–21 | 3.619 | +| 2 | 56108–56272 | 0.000 / 1.000 | 18–18 | 21–21 | 3.670 | +| 3 | 55672–55848 | 0.000 / 1.999 | 18–18 | 21–21 | 3.620 | + +All 180 samples were captured. All three processes exited 0 with no fallback +kill, and their owned PIDs were absent afterward. The native measurement lease +was released to the coordinator. These samples are observations, **not budgets**. +Raw JSON SHA-256: `e605771ad0e955778296aeddaef53cc046e8bf7d74c0b91fd1277c92a49fb5c4`. + +### Remaining acceptance + +Physical-device naming, MIPS scope, exact browser, repeated recording/browser +measurements and reviewed numeric runtime tolerances remain deferred/open. +The full release target matrix must still be built and qualified by T36. +No claim of B1/B2 completion or physical resource qualification follows from +this task's inventory or workstation samples. diff --git a/quality/runtime-budgets.json b/quality/runtime-budgets.json new file mode 100644 index 000000000..a3ebd19bf --- /dev/null +++ b/quality/runtime-budgets.json @@ -0,0 +1,367 @@ +{ + "schema_version": 1, + "task": "T5", + "recorded_at": "2026-10-31", + "status": "physical_calibration_deferred_by_user", + "qualification_status": "incomplete", + "policy": { + "missing_limit": "unqualified; must never become zero, infinity, pass, or silently skip", + "measurement_scope": "NVR and browser measured separately; include managed go2rtc/ffmpeg children in NVR aggregate and publish per-process results. Synthetic source generator runs off-target.", + "budget_changes": "Explicit manifest edit with raw samples, exact provenance, measured cost and product rationale; no automatic baseline reset.", + "host_reference": "Informational only, never substitutes for named constrained hardware or production feature qualification.", + "asset_budgets": "Existing measured numeric asset limits remain in quality/web-budgets.json and are not reset here." + }, + "metrics": [ + { + "id": "nvr.binary_bytes", + "baseline": null, + "limit": null, + "tolerance": null, + "status": "deferred_by_user", + "reason": "Physical device/browser and repeated workload calibration have not been supplied or run." + }, + { + "id": "nvr.idle_rss_bytes", + "baseline": null, + "limit": null, + "tolerance": null, + "status": "deferred_by_user", + "reason": "Physical device/browser and repeated workload calibration have not been supplied or run." + }, + { + "id": "nvr.recording_rss_bytes", + "baseline": null, + "limit": null, + "tolerance": null, + "status": "deferred_by_user", + "reason": "Physical device/browser and repeated workload calibration have not been supplied or run." + }, + { + "id": "nvr.cpu_one_core_percent", + "baseline": null, + "limit": null, + "tolerance": null, + "status": "deferred_by_user", + "reason": "Physical device/browser and repeated workload calibration have not been supplied or run." + }, + { + "id": "nvr.open_file_descriptors", + "baseline": null, + "limit": null, + "tolerance": null, + "status": "deferred_by_user", + "reason": "Physical device/browser and repeated workload calibration have not been supplied or run." + }, + { + "id": "nvr.threads", + "baseline": null, + "limit": null, + "tolerance": null, + "status": "deferred_by_user", + "reason": "Physical device/browser and repeated workload calibration have not been supplied or run." + }, + { + "id": "nvr.recording_gap_ms", + "baseline": null, + "limit": null, + "tolerance": null, + "status": "deferred_by_user", + "reason": "Physical device/browser and repeated workload calibration have not been supplied or run." + }, + { + "id": "nvr.recovery_ms", + "baseline": null, + "limit": null, + "tolerance": null, + "status": "deferred_by_user", + "reason": "Physical device/browser and repeated workload calibration have not been supplied or run." + }, + { + "id": "nvr.shutdown_ms", + "baseline": null, + "limit": null, + "tolerance": null, + "status": "deferred_by_user", + "reason": "Physical device/browser and repeated workload calibration have not been supplied or run." + }, + { + "id": "browser.cold_startup_ms", + "baseline": null, + "limit": null, + "tolerance": null, + "status": "deferred_by_user", + "reason": "Physical device/browser and repeated workload calibration have not been supplied or run." + }, + { + "id": "browser.warm_startup_ms", + "baseline": null, + "limit": null, + "tolerance": null, + "status": "deferred_by_user", + "reason": "Physical device/browser and repeated workload calibration have not been supplied or run." + }, + { + "id": "browser.streams_edit_open_ms", + "baseline": null, + "limit": null, + "tolerance": null, + "status": "deferred_by_user", + "reason": "Physical device/browser and repeated workload calibration have not been supplied or run." + }, + { + "id": "browser.save_acknowledgement_ms", + "baseline": null, + "limit": null, + "tolerance": null, + "status": "deferred_by_user", + "reason": "Physical device/browser and repeated workload calibration have not been supplied or run." + }, + { + "id": "browser.live_first_frame_ms", + "baseline": null, + "limit": null, + "tolerance": null, + "status": "deferred_by_user", + "reason": "Physical device/browser and repeated workload calibration have not been supplied or run." + }, + { + "id": "browser.renderer_rss_bytes", + "baseline": null, + "limit": null, + "tolerance": null, + "status": "deferred_by_user", + "reason": "Physical device/browser and repeated workload calibration have not been supplied or run." + }, + { + "id": "browser.javascript_heap_bytes", + "baseline": null, + "limit": null, + "tolerance": null, + "status": "deferred_by_user", + "reason": "Physical device/browser and repeated workload calibration have not been supplied or run." + }, + { + "id": "browser.long_task_ms", + "baseline": null, + "limit": null, + "tolerance": null, + "status": "deferred_by_user", + "reason": "Physical device/browser and repeated workload calibration have not been supplied or run." + } + ], + "workload": { + "status": "protocol_defined_not_executed_on_physical_target", + "fixtures": { + "source": "Synthetic FFmpeg testsrc2; no camera credentials or production recordings. Archive exact ffmpeg version/command, fixture hashes and ffprobe JSON.", + "video": { + "codec": "H.264", + "profile": "baseline", + "pixel_format": "yuv420p", + "width": 1280, + "height": 720, + "fps": 15, + "bitrate_bits_per_second": 1000000, + "gop_frames": 30, + "b_frames": 0 + }, + "audio_variants": [ + "video only", + "AAC mono 48000 Hz 64000 bit/s synthetic sine" + ], + "stream_counts": [ + 0, + 1, + 4 + ], + "segment_seconds": 60, + "network": "RTSP over TCP on isolated test network; source generator off-target; record link speed/RTT/loss", + "storage": { + "requirements": "Dedicated disposable filesystem with at least 4 GiB free; record filesystem/device. Never production data.", + "retention_days": 1, + "auto_delete_oldest": false, + "max_size": 0, + "max_size_semantics": "Unlimited application setting for bounded calibration workload; physical free space is checked and the scenario stops before exhaustion." + }, + "detection": "Baseline workload detection off. SOD/LiteRT/MQTT/archive production-feature scenarios measured separately, never claimed covered by idle/remux." + }, + "phases": [ + { + "id": "idle", + "streams": 0, + "warmup_seconds": 60, + "sample_seconds": 300 + }, + { + "id": "record-one", + "streams": 1, + "warmup_seconds": 120, + "sample_seconds": 600 + }, + { + "id": "record-four", + "streams": 4, + "warmup_seconds": 120, + "sample_seconds": 600 + }, + { + "id": "record-and-view", + "streams": 4, + "warmup_seconds": 120, + "sample_seconds": 600, + "browser": "one Live view, four tiles; repeat Streams list/edit/save with synthetic tags every 30 seconds" + } + ], + "repetitions": 5, + "sample_interval_seconds": 1, + "rationale": "Protocol durations/counts are experimental settings, not measured acceptance limits. Five independent process runs expose run-to-run variance; ten-minute recording phases span at least ten segments. Revise workload with documented product reason before calibration." + }, + "measurement_method": { + "provenance": [ + "exact source revision and clean tree", + "baseline binary/assets hashes", + "compiler, linker, loaded library versions and feature flags", + "synthetic media hash plus ffprobe stream metadata", + "OS, kernel, CPU governor, RAM/swap, storage/free-space and network", + "browser version, flags, viewport, GPU/decode status and cache state" + ], + "cold_cache": "Browser: fresh user-data directory, clear HTTP cache/storage and disable cache for first navigation. NVR: fresh process and disposable DB; report OS page cache uncontrolled unless a dedicated target is rebooted under an approved protocol. Never drop host-wide caches.", + "warm_cache": "Reuse the browser profile with caching enabled, reload once before sampling; reuse fixture filesystem cache while restarting NVR process. Label every sample; never combine cold and warm distributions.", + "nvr": "Sample monotonic time, /proc/PID/stat utime+stime, /proc/PID/status VmRSS/VmHWM/Threads, and /proc/PID/fd count. CPU percent = delta_ticks / CLK_TCK / delta_monotonic_seconds * 100 (one core = 100%). Record child PIDs and start times; aggregate RSS explicitly (shared pages may be double counted) or use PSS where available.", + "browser": "Use PerformanceObserver/navigation timing for navigation and long tasks, explicit marks around edit-open and save acknowledgement, video first decoded frame for Live, and browser process memory via OS counters. JS heap via Chromium CDP if available; report unavailable on other browsers, never zero.", + "recordings": "ffprobe every committed segment, decode at least the first segment after each recovery. Check adjacent packet/media timestamps, playable codec, DB times and byte counts. Separate intentional outage from unexplained recording gaps.", + "comparison": "Publish every run, median/p95/max per metric and cold/warm state; calculate candidate-minus-baseline on identical device, fixtures and feature flags with alternating baseline/candidate runs. Calibrate tolerances from repeated baseline variation and product recovery constraints, then review numeric limits before enabling a gate.", + "failure_rules": [ + "Unexpected process exit, sanitizer error, corrupt/undecodable recording or missing samples fails its scenario.", + "Unknown target, uncalibrated limit or unsupported metric remains unqualified.", + "Teardown records graceful deadline separately from fallback kill; a fallback kill is not successful shutdown.", + "Do not reuse production URLs, DB/storage, PID files, credentials or globally fixed ports." + ] + }, + "host_reference": { + "status": "measured_informational_only", + "host": { + "architecture": "x86_64", + "kernel": "7.0.0-38-generic", + "cpu": "AMD Ryzen 9 7950X 16-Core Processor", + "memory_total_kib": 128614452, + "logical_cpus": 32 + }, + "method": { + "warmup_seconds": 20, + "samples_per_run": 60, + "sample_interval_seconds": 1, + "runs": 3, + "cache": "fresh database/process; OS page cache uncontrolled/warm", + "scope": "lightnvr PID only; go2rtc/MQTT disabled; zero streams; no browser" + }, + "binary_bytes": 10362224, + "binary_sha256": "a56ce959b256f08dd04fd72e0ad8054669ad300464894d99995efca2928a61d1", + "raw_artifact": "build/eng-artifacts/T5/idle-host.json", + "raw_sha256": "e605771ad0e955778296aeddaef53cc046e8bf7d74c0b91fd1277c92a49fb5c4", + "collector_artifact": "build/eng-artifacts/T5/measure-idle.py", + "collector_sha256": "22eb19f28192a02bde6e0474e4774a1eae462ccd6b624c984ea853f5228a71f5", + "runs": [ + { + "run": 1, + "sample_count": 60, + "http_ready_seconds": 0.2068465100019239, + "shutdown_seconds": 3.6190339110034984, + "exit_code": 0, + "forced_kill": false, + "rss_kib": { + "min": 55524, + "median": 55554.0, + "max": 55688 + }, + "peak_rss_kib": { + "min": 55524, + "median": 55554.0, + "max": 55688 + }, + "fds": { + "min": 18, + "median": 18.0, + "max": 18 + }, + "threads": { + "min": 21, + "median": 21.0, + "max": 21 + }, + "cpu_one_core_percent": { + "min": 0.0, + "median": 0.0, + "max": 1.9992401548317742 + } + }, + { + "run": 2, + "sample_count": 60, + "http_ready_seconds": 0.2017917429911904, + "shutdown_seconds": 3.669562605995452, + "exit_code": 0, + "forced_kill": false, + "rss_kib": { + "min": 56108, + "median": 56138.0, + "max": 56272 + }, + "peak_rss_kib": { + "min": 56108, + "median": 56138.0, + "max": 56272 + }, + "fds": { + "min": 18, + "median": 18.0, + "max": 18 + }, + "threads": { + "min": 21, + "median": 21.0, + "max": 21 + }, + "cpu_one_core_percent": { + "min": 0.0, + "median": 0.0, + "max": 0.9996740112998845 + } + }, + { + "run": 3, + "sample_count": 60, + "http_ready_seconds": 0.20217874500667676, + "shutdown_seconds": 3.619521572982194, + "exit_code": 0, + "forced_kill": false, + "rss_kib": { + "min": 55672, + "median": 55836.0, + "max": 55848 + }, + "peak_rss_kib": { + "min": 55672, + "median": 55836.0, + "max": 55848 + }, + "fds": { + "min": 18, + "median": 18.0, + "max": 18 + }, + "threads": { + "min": 21, + "median": 21.0, + "max": 21 + }, + "cpu_one_core_percent": { + "min": 0.0, + "median": 0.0, + "max": 1.99937101188529 + } + } + ], + "budget": null, + "limitation": "No physical constrained/browser/recording/production-feature qualification; short warm-cache idle run on a workstation only." + } +} diff --git a/quality/target-profiles.json b/quality/target-profiles.json new file mode 100644 index 000000000..9f9fedb4e --- /dev/null +++ b/quality/target-profiles.json @@ -0,0 +1,206 @@ +{ + "schema_version": 1, + "task": "T5", + "recorded_at": "2026-10-31", + "inspected_revision": "27e4d57e", + "status": "profiles_recorded_physical_calibration_deferred", + "qualification_status": "incomplete", + "deferral": { + "authorized_by": "user", + "scope": "Physical-device runtime measurements", + "instruction": "Oh, we can defer that one", + "effect": "No physical performance acceptance or numeric constrained budget is claimed; independent implementation continues." + }, + "profiles": [ + { + "id": "container-amd64", + "platform": "linux/amd64", + "required": true, + "runner": "ubuntu-latest", + "build_mode": "native", + "source": ".github/workflows/docker-publish.yml", + "feature_profile": "release-container-debian in quality/native-profiles.json", + "build_command": "docker buildx build --platform linux/amd64 --build-arg GIT_COMMIT=\"$(git rev-parse HEAD)\" --output type=oci,dest=build/eng-artifacts/T36/amd64.oci .", + "qualification_status": "not_run", + "physical_runtime_evidence": null + }, + { + "id": "deb-sid-amd64", + "platform": "linux/amd64", + "debian_suite": "sid", + "required": true, + "source": ".github/workflows/debian-package.yml", + "build_mode": "native", + "build_command": "docker buildx build --platform linux/amd64 --build-arg DEBIAN_SUITE=sid --build-arg DEB_BUILD=true --build-arg GIT_COMMIT=\"$(git rev-parse HEAD)\" --load -t lightnvr-eng-t36:sid-amd64 .", + "qualification_status": "not_run", + "package_steps": "Use the extraction/control/package logic in .github/workflows/debian-package.yml locally; omit release upload. A builder image alone does not qualify the .deb install/upgrade.", + "physical_runtime_evidence": null + }, + { + "id": "deb-trixie-amd64", + "platform": "linux/amd64", + "debian_suite": "trixie", + "required": true, + "source": ".github/workflows/debian-package.yml", + "build_mode": "native", + "build_command": "docker buildx build --platform linux/amd64 --build-arg DEBIAN_SUITE=trixie --build-arg DEB_BUILD=true --build-arg GIT_COMMIT=\"$(git rev-parse HEAD)\" --load -t lightnvr-eng-t36:trixie-amd64 .", + "qualification_status": "not_run", + "package_steps": "Use the extraction/control/package logic in .github/workflows/debian-package.yml locally; omit release upload. A builder image alone does not qualify the .deb install/upgrade.", + "physical_runtime_evidence": null + }, + { + "id": "container-arm64", + "platform": "linux/arm64", + "required": true, + "runner": "ubuntu-24.04-arm", + "build_mode": "native arm64 builder required", + "source": ".github/workflows/docker-publish.yml", + "feature_profile": "release-container-debian in quality/native-profiles.json", + "build_command": "docker buildx build --platform linux/arm64 --build-arg GIT_COMMIT=\"$(git rev-parse HEAD)\" --output type=oci,dest=build/eng-artifacts/T36/arm64.oci .", + "qualification_status": "not_run", + "physical_runtime_evidence": null + }, + { + "id": "deb-sid-arm64", + "platform": "linux/arm64", + "debian_suite": "sid", + "required": true, + "source": ".github/workflows/debian-package.yml", + "build_mode": "native arm64 builder required", + "build_command": "docker buildx build --platform linux/arm64 --build-arg DEBIAN_SUITE=sid --build-arg DEB_BUILD=true --build-arg GIT_COMMIT=\"$(git rev-parse HEAD)\" --load -t lightnvr-eng-t36:sid-arm64 .", + "qualification_status": "not_run", + "package_steps": "Use the extraction/control/package logic in .github/workflows/debian-package.yml locally; omit release upload. A builder image alone does not qualify the .deb install/upgrade.", + "physical_runtime_evidence": null + }, + { + "id": "deb-trixie-arm64", + "platform": "linux/arm64", + "debian_suite": "trixie", + "required": true, + "source": ".github/workflows/debian-package.yml", + "build_mode": "native arm64 builder required", + "build_command": "docker buildx build --platform linux/arm64 --build-arg DEBIAN_SUITE=trixie --build-arg DEB_BUILD=true --build-arg GIT_COMMIT=\"$(git rev-parse HEAD)\" --load -t lightnvr-eng-t36:trixie-arm64 .", + "qualification_status": "not_run", + "package_steps": "Use the extraction/control/package logic in .github/workflows/debian-package.yml locally; omit release upload. A builder image alone does not qualify the .deb install/upgrade.", + "physical_runtime_evidence": null + }, + { + "id": "container-arm-v7", + "platform": "linux/arm/v7", + "required": true, + "runner": "ubuntu-latest", + "build_mode": "amd64 cross compiler with armhf sysroot; QEMU only for target package setup", + "source": ".github/workflows/docker-publish.yml", + "feature_profile": "release-container-debian in quality/native-profiles.json", + "build_command": "docker buildx build --platform linux/arm/v7 --build-arg GIT_COMMIT=\"$(git rev-parse HEAD)\" --output type=oci,dest=build/eng-artifacts/T36/arm-v7.oci .", + "qualification_status": "not_run", + "physical_runtime_evidence": null + }, + { + "id": "deb-sid-arm-v7", + "platform": "linux/arm/v7", + "debian_suite": "sid", + "required": true, + "source": ".github/workflows/debian-package.yml", + "build_mode": "amd64 cross compiler with armhf sysroot; QEMU only for target package setup", + "build_command": "docker buildx build --platform linux/arm/v7 --build-arg DEBIAN_SUITE=sid --build-arg DEB_BUILD=true --build-arg GIT_COMMIT=\"$(git rev-parse HEAD)\" --load -t lightnvr-eng-t36:sid-arm-v7 .", + "qualification_status": "not_run", + "package_steps": "Use the extraction/control/package logic in .github/workflows/debian-package.yml locally; omit release upload. A builder image alone does not qualify the .deb install/upgrade.", + "physical_runtime_evidence": null + }, + { + "id": "deb-trixie-arm-v7", + "platform": "linux/arm/v7", + "debian_suite": "trixie", + "required": true, + "source": ".github/workflows/debian-package.yml", + "build_mode": "amd64 cross compiler with armhf sysroot; QEMU only for target package setup", + "build_command": "docker buildx build --platform linux/arm/v7 --build-arg DEBIAN_SUITE=trixie --build-arg DEB_BUILD=true --build-arg GIT_COMMIT=\"$(git rev-parse HEAD)\" --load -t lightnvr-eng-t36:trixie-arm-v7 .", + "qualification_status": "not_run", + "package_steps": "Use the extraction/control/package logic in .github/workflows/debian-package.yml locally; omit release upload. A builder image alone does not qualify the .deb install/upgrade.", + "physical_runtime_evidence": null + } + ], + "build_provenance_requirements": [ + "Run from a clean isolated checkout at the selected exact revision with initialized submodules. Never mutate archived baseline files.", + "Create build/eng-artifacts/T36 before the commands; do not push images or publish packages.", + "Record base image digest, resolved apt package versions, compiler/linker, effective feature flags, lockfiles, binary hash and output manifest. Mutable Debian tags mean source pinning alone is insufficient reproducibility.", + "arm64 builds require the declared native arm64 runner. Dockerfile rejects amd64 to arm64 cross builds.", + "No cross-build or QEMU run proves physical performance; missing runners leave target qualification open." + ], + "embedded_scope": { + "documented_support": [ + "README.md names Ingenic A1, 256 MB, and MIPS among Linux-compatible processors.", + "docs/BUILD.md documents LIGHTNVR_PROFILE=embedded with at most 16 streams, optional SOD/LiteRT/MQTT/denoise off." + ], + "mips_release_required": null, + "decision_status": "unresolved_deferred_with_physical_target_selection", + "physical_nvr": null, + "viewing_device": null, + "browser_name_version": null, + "required_device_details": [ + "device model and architecture", + "RAM, storage medium/filesystem and free space", + "OS/kernel/libc and toolchain", + "browser/device model, version, GPU/hardware decode, viewport and network", + "feature overrides and firmware/package revision" + ], + "native_build_template": "cmake -S . -B build/embedded -DCMAKE_BUILD_TYPE=Release -DLIGHTNVR_PROFILE=embedded && cmake --build build/embedded -j2", + "native_build_limit": "Host-native template only. A MIPS toolchain/sysroot and dependency build recipe must be supplied and validated before MIPS qualification.", + "non_container_required": true, + "non_container_reason": "Published Debian package matrix is explicit in .github/workflows/debian-package.yml; additional embedded firmware targets are not silently dropped.", + "alpine_status": "Dockerfile.alpine exists, but no release workflow proves it is a required release target; scope decision remains open." + }, + "web_profiles": [ + { + "id": "default", + "required": true, + "archive": "build/eng-baseline/1b8d4332/web-default", + "command": "npm run build", + "cwd": "web", + "env": {}, + "input_hashes": { + "web/package.json": "b9b25a1b3fb000822d502ebe773e2bb6fa61f93314552ef909e3481b10e25fee", + "web/package-lock.json": "4563ca16df360549a606c28c1d165ab7dc4122f489af28edc61e0802a1e14879", + "web/vite.config.js": "378b6892979516a3a690b7771f9117f6eedf07dcab2844cefbd46f71477ffac1", + "web/vite-plugin-theme-inject.js": "8f8137b4f13f69af45620d2ffee7717d87da75d0e93ddd2c3d23843635ab5635", + "web/postcss.config.js": "d3c737602d9b59c158bf819c686342e5ced8afa281472b16ba98918ca357fba9", + "web/js/version.js": "b842bcd52489d63914f699f5d7e8678f2b856022536dbcfeb5a95ec8bc68d75d" + }, + "report_sha256": "7ebbb209791e92d22f3cd08c6fc6ae03c58513b7ded6546a0d41111febdc6c0e", + "file_manifest_sha256": "342e0df6ab21e77f81cc7da4bc56177e537091296c9a15bccb38c5ed8b253c67", + "physical_browser_status": "deferred_by_user", + "locales": "All 18 baseline locales. The English-only firmware example is a separate, unmeasured profile." + }, + { + "id": "modern", + "required": true, + "archive": "build/eng-baseline/1b8d4332/web-modern", + "command": "npm run build", + "cwd": "web", + "env": { + "LIGHTNVR_WEB_LEGACY": "false" + }, + "input_hashes": { + "web/package.json": "b9b25a1b3fb000822d502ebe773e2bb6fa61f93314552ef909e3481b10e25fee", + "web/package-lock.json": "4563ca16df360549a606c28c1d165ab7dc4122f489af28edc61e0802a1e14879", + "web/vite.config.js": "378b6892979516a3a690b7771f9117f6eedf07dcab2844cefbd46f71477ffac1", + "web/vite-plugin-theme-inject.js": "8f8137b4f13f69af45620d2ffee7717d87da75d0e93ddd2c3d23843635ab5635", + "web/postcss.config.js": "d3c737602d9b59c158bf819c686342e5ced8afa281472b16ba98918ca357fba9", + "web/js/version.js": "b842bcd52489d63914f699f5d7e8678f2b856022536dbcfeb5a95ec8bc68d75d" + }, + "report_sha256": "9ab3c9947200e0f00f4ebb80a05f34ed6d7196fd609afe3c52690657d18d3417", + "file_manifest_sha256": "afaa072387d41f97e2cd3cc38340b76fde1949684dd0c93d2a1bed59eca93d92", + "physical_browser_status": "deferred_by_user", + "locales": "All 18 baseline locales. The English-only firmware example is a separate, unmeasured profile." + } + ], + "baseline_sources": { + "native_manifest": "quality/native-profiles.json", + "native_archive": "build/eng-baseline/1b8d4332/native/release-full-system-ffmpeg", + "native_binary_sha256": "a56ce959b256f08dd04fd72e0ad8054669ad300464894d99995efca2928a61d1", + "native_manifest_sha256": "35e5e18ca2b678893700592ccab546fa97c648bba89fa51651542a4ed0041d67", + "native_limit": "Host release reference differs from Debian containers and omits host libyaml; debug and mismatched-FFmpeg archives are not performance references.", + "asset_manifest": "quality/web-budgets.json" + } +} From 17de8155863edd9891c693fe275d9063b95e83c0 Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Sat, 31 Oct 2026 03:36:15 -0400 Subject: [PATCH 012/230] T8: Establish strict Preact TypeScript and Jest infrastructure --- package-lock.json | 1025 +++++++++++++++++++- package.json | 13 +- quality/evidence/T8.md | 85 ++ quality/toolchain.json | 71 ++ web/babel.config.cjs | 2 + web/eslint.config.js | 10 +- web/jest.config.cjs | 4 +- web/jest.e2e.config.cjs | 4 +- web/package-lock.json | 1080 +++++++++++++++++++--- web/package.json | 9 +- web/tests/types/preact-fixture.tsx | 17 + web/tests/types/preactToolchain.spec.tsx | 19 + web/tsconfig.base.json | 19 + web/tsconfig.json | 6 + web/tsconfig.tests.json | 6 + 15 files changed, 2243 insertions(+), 127 deletions(-) create mode 100644 quality/evidence/T8.md create mode 100644 quality/toolchain.json create mode 100644 web/tests/types/preact-fixture.tsx create mode 100644 web/tests/types/preactToolchain.spec.tsx create mode 100644 web/tsconfig.base.json create mode 100644 web/tsconfig.json create mode 100644 web/tsconfig.tests.json diff --git a/package-lock.json b/package-lock.json index d36b64490..181c0f13c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,14 +8,63 @@ "name": "lightnvr", "version": "1.0.0", "devDependencies": { + "@apidevtools/json-schema-ref-parser": "16.0.5", "@playwright/test": "^1.62.1", + "@types/node": "24.19.2", + "ajv": "8.20.0", + "ajv-formats": "3.0.1", + "esbuild": "0.28.2", + "openapi-typescript": "7.13.0", "playwright": "^1.62.1", - "sharp": "^0.35.5" + "sharp": "^0.35.5", + "typescript": "5.9.3", + "yaml": "2.9.0" }, "engines": { "node": ">=24.11.0 <25" } }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-16.0.5.tgz", + "integrity": "sha512-z3LiEMqTP2FNu6u8bdUgBYErVuwMSZReOJy1MCEIB0BDHMoNgBtkciby32HOlcrfWwrOSzRU8YIsZ0CogYRuYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-yaml": "^5.4.2" + }, + "engines": { + "node": ">=22.19.0" + }, + "peerDependencies": { + "@types/json-schema": "^7.0.15" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@emnapi/runtime": { "version": "1.11.3", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", @@ -23,8 +72,450 @@ "dev": true, "license": "MIT", "optional": true, - "dependencies": { - "tslib": "^2.4.0" + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, "node_modules/@img/colour": { @@ -618,6 +1109,221 @@ "node": ">=20" } }, + "node_modules/@redocly/ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js-replace": "^1.0.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@redocly/config": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.22.0.tgz", + "integrity": "sha512-gAy93Ddo01Z3bHuVdPWfCwzgfaYgMdaZPcfL7JZ7hWJoK9V0lXDbigTWkhiPFAaLWzbOJ+kbUQG1+XwIm0KRGQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@redocly/openapi-core": { + "version": "1.34.22", + "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.34.22.tgz", + "integrity": "sha512-dEyx4uHh6Pc6ZkdU9Xe8rA4h12Odq6QKU/fqseBn07xwVwskhHiF3KHhqmw5BR+jAiFTvKTmwCafFql/k1pSzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@redocly/ajv": "8.11.2", + "@redocly/config": "0.22.0", + "colorette": "1.4.0", + "https-proxy-agent": "7.0.6", + "js-levenshtein": "1.1.6", + "js-yaml": "4.3.2", + "minimatch": "5.1.9", + "pluralize": "8.0.0", + "yaml-ast-parser": "0.0.43" + }, + "engines": { + "node": ">=18.17.0", + "npm": ">=9.5.0" + } + }, + "node_modules/@redocly/openapi-core/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/@redocly/openapi-core/node_modules/js-yaml": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/node": { + "version": "24.19.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.19.2.tgz", + "integrity": "sha512-93d49wCWJkCyN87MxLpNN6KXPCwFw7bVUg79mGUV1OS40JGWwVCr8n61DXCSqz7CV6/VfPkb7xec7uP2M+QHWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": ">=7.24.0 <7.24.7" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/argparse": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-3.0.4.tgz", + "integrity": "sha512-fwWK3Zq22l4XJJjx5mcBHGikIk+hJqO+32dPm0Jur7+rtG5x1scOjSfdT9ZKeWHPpsya/l0HHK4tDImBkTrtvA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "PSF-2.0" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz", + "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/change-case": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", + "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", @@ -628,6 +1334,72 @@ "node": ">=8" } }, + "node_modules/esbuild": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", + "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.2", + "@esbuild/android-arm": "0.28.2", + "@esbuild/android-arm64": "0.28.2", + "@esbuild/android-x64": "0.28.2", + "@esbuild/darwin-arm64": "0.28.2", + "@esbuild/darwin-x64": "0.28.2", + "@esbuild/freebsd-arm64": "0.28.2", + "@esbuild/freebsd-x64": "0.28.2", + "@esbuild/linux-arm": "0.28.2", + "@esbuild/linux-arm64": "0.28.2", + "@esbuild/linux-ia32": "0.28.2", + "@esbuild/linux-loong64": "0.28.2", + "@esbuild/linux-mips64el": "0.28.2", + "@esbuild/linux-ppc64": "0.28.2", + "@esbuild/linux-riscv64": "0.28.2", + "@esbuild/linux-s390x": "0.28.2", + "@esbuild/linux-x64": "0.28.2", + "@esbuild/netbsd-arm64": "0.28.2", + "@esbuild/netbsd-x64": "0.28.2", + "@esbuild/openbsd-arm64": "0.28.2", + "@esbuild/openbsd-x64": "0.28.2", + "@esbuild/openharmony-arm64": "0.28.2", + "@esbuild/sunos-x64": "0.28.2", + "@esbuild/win32-arm64": "0.28.2", + "@esbuild/win32-ia32": "0.28.2", + "@esbuild/win32-x64": "0.28.2" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.9.tgz", + "integrity": "sha512-hS/0Wt3Ya043oKXs0sIxrMpKQITXhMLIrVAKKXi4gozGC9v7YRWVnXIZzjNPTO02M9BdxLCWqK1yRXgNziVyJQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", @@ -643,6 +1415,146 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/index-to-position": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz", + "integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-5.5.0.tgz", + "integrity": "sha512-paNr4LFIFPjeeSmwNYdrb8FafLLG/Cr2Af3GjbsHJ5CxIjH4r0c2emlmRdAtpPAieP1gRVzk6buBbVP5gBMGAg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^3.0.3" + }, + "bin": { + "js-yaml": "bin/js-yaml.mjs" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/openapi-typescript": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-7.13.0.tgz", + "integrity": "sha512-EFP392gcqXS7ntPvbhBzbF8TyBA+baIYEm791Hy5YkjDYKTnk/Tn5OQeKm5BIZvJihpp8Zzr4hzx0Irde1LNGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@redocly/openapi-core": "^1.34.6", + "ansi-colors": "^4.1.3", + "change-case": "^5.4.4", + "parse-json": "^8.3.0", + "supports-color": "^10.2.2", + "yargs-parser": "^21.1.1" + }, + "bin": { + "openapi-typescript": "bin/cli.js" + }, + "peerDependencies": { + "typescript": "^5.x" + } + }, + "node_modules/parse-json": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", + "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "index-to-position": "^1.1.0", + "type-fest": "^4.39.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, "node_modules/playwright": { "version": "1.62.1", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.62.1.tgz", @@ -675,6 +1587,26 @@ "node": ">=20" } }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/semver": { "version": "7.8.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", @@ -738,6 +1670,19 @@ } } }, + "node_modules/supports-color": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", + "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -745,6 +1690,80 @@ "dev": true, "license": "0BSD", "optional": true + }, + "node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "dev": true, + "license": "MIT" + }, + "node_modules/uri-js-replace": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uri-js-replace/-/uri-js-replace-1.0.2.tgz", + "integrity": "sha512-VeBBt/nMxedczht3KDL2yBBMJqIxpCQLMZp3UJ1otcWwUHdQW4IiyHpJivExzSK+FdxTowRfGL4FmwDqH9+S8Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yaml-ast-parser": { + "version": "0.0.43", + "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", + "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } } } } diff --git a/package.json b/package.json index 8293123f4..6ee311da4 100644 --- a/package.json +++ b/package.json @@ -14,11 +14,20 @@ "test:load": "node --experimental-strip-types tests/load/index.ts", "test:load:api": "node --experimental-strip-types tests/load/index.ts --tags api", "test:load:html": "node --experimental-strip-types tests/load/index.ts --tags html", - "test:load:heavy": "node --experimental-strip-types tests/load/index.ts -n 1000 -c 50" + "test:load:heavy": "node --experimental-strip-types tests/load/index.ts -n 1000 -c 50", + "typecheck:tests": "tsc --project tests/tsconfig.json" }, "devDependencies": { + "@apidevtools/json-schema-ref-parser": "16.0.5", "@playwright/test": "^1.62.1", + "@types/node": "24.19.2", + "ajv": "8.20.0", + "ajv-formats": "3.0.1", + "esbuild": "0.28.2", + "openapi-typescript": "7.13.0", "playwright": "^1.62.1", - "sharp": "^0.35.5" + "sharp": "^0.35.5", + "typescript": "5.9.3", + "yaml": "2.9.0" } } diff --git a/quality/evidence/T8.md b/quality/evidence/T8.md new file mode 100644 index 000000000..b0743a651 --- /dev/null +++ b/quality/evidence/T8.md @@ -0,0 +1,85 @@ +# T8: Strict TypeScript and Preact test infrastructure + +Completed against T11 commit `a764b6ca`; Node 24.22.1 / npm 11.19.1. +Only this task's manifests, locks, web compiler/Babel/Jest/lint configs, typed +fixtures, and toolchain/evidence records were changed. No existing application +implementation is counted as migrated. `allowJs: true, checkJs: false` supports +incremental imports; the application/test include patterns select TS/TSX. +T25/T34 must close the remaining explicitly unchecked JS/JSX inventory. + +## RED → GREEN + +The coordinator assigned the tests directly because all three worker slots were +occupied. Tests-only fixture additions preceded tooling changes. + +- RED: `npm --prefix web test -- --runInBand --testPathPatterns=preactToolchain` + exited 1: no TSX test discovered with the original `.spec.js` matching. +- GREEN: the same command passes 2 tests that execute automatic JSX through + Preact and preserve disabled props and the asynchronous callback. +- Compiler negative check: append a temporary `` + to `web/tests/types/preact-fixture.tsx`; `npm --prefix web run typecheck` + exits 2 with TS2322 (number is not assignable to string). Restore the original + fixture and both strict compiler projects pass. Probe was not committed. +- Selenium discovery: a temporary `web/tests/e2e/toolchainDiscovery.spec.tsx` + appeared alongside all three original E2E files using + `cd web && node_modules/.bin/jest --config=jest.e2e.config.cjs --listTests --runInBand`. + Probe removed. No Selenium browser/server test was run for this tooling task. + +## Validation + +Raw command output is under ignored `build/eng-artifacts/T8/`. + +- `npm ci` and `npm ci --prefix web`: pass with the locked dependency graph. +- `npm ls --all` and `npm ls --prefix web --all`: pass (peer graph resolves). +- `npm --prefix web run typecheck`: pass; strict, noUncheckedIndexedAccess, + isolatedModules, noEmit, Preact JSX, and library checking enabled. +- `npm --prefix web test -- --runInBand`: 55 suites / 571 tests pass. +- `npm --prefix web run build`: default production build passes. +- `LIGHTNVR_WEB_LEGACY=false npm --prefix web run build`: modern build passes. +- `npm run typecheck:tests`: intentionally reports missing tests/tsconfig.json + (TS5058); T9 supplies and repairs that project. This is not marked type-green. + +Existing direct dependency versions remain unchanged. Root pre-existing lock +entries remain unchanged; adding Babel8 TS dependencies updates related Babel +helper patch versions and sourcemap-codec. The web graph now directly pins Node24 +rather than relying on transitive Node25 typings. No blanket update, audit fix, +framework replacement, or major version upgrade was performed. npm reports +existing/dependency audit findings (root 3 moderate, web 1 low + 31 moderate); +these are not waived or hidden by T8. T7/T14 own findings policy and remediation. + +## Generator compatibility proof for T12 + +`node build/eng-artifacts/T8/check-generation.mjs` parses the actual T11 +fragments, canonicalizes their components, generates types, validates all +91 fixture expectations with Ajv2020, and checks a browser-bundled standalone +validator against valid and leaked-viewer credentials. Output: 91 fixtures, +one explicit embedded-JSON rejection, 49,333 type-source bytes, 80,264 bytes of +unoptimized standalone source. This is a compatibility proof, not the compact +production generator or a runtime asset-budget result. + +`node_modules/.bin/tsc --noEmit --strict --skipLibCheck false --moduleResolution +bundler --module esnext --target es2022 build/eng-artifacts/T8/pilot-types.ts` +passes. The selected versions are recorded in `quality/toolchain.json`. + +Observed compatibility requirements: + +1. Generic `$RefParser.bundle()` can relocate shared refs into paths/responses; + openapi-typescript then generates invalid indexing and recursive types. + Canonically merge the fragments into `components` and rewrite their local + refs before generation. T12 must enforce collisions and unresolved refs. +2. Ajv's standalone ESM export still emits CommonJS `require` for Unicode-length + helpers. Root esbuild is explicitly pinned to bundle those helpers for the + browser. Never ship Ajv/compiler packages to fix this runtime issue. +3. `contentSchema` is an annotation. Explicitly decode and validate nonempty + eptz_config, while treating the empty string as disabled. T12 must also + implement UTF-8 byte limits; this proof does not claim byte-limit validation. +4. Babel8 removed `allowDeclareFields`; omitting it enables the built-in + behavior. Automatic JSX uses `preact`, confirmed by the executable fixture. +5. TypeScript 5.9.3 satisfies openapi-typescript 7.13's TypeScript ^5 peer and + typescript-eslint 8.72.1's compiler range. Preact, Vite8, Babel8, and Jest30 + remain their installed majors. Existing Vite Oxc Preact settings need no edit. + +T10 owns stricter TS AST/hooks/accessibility/i18n compatibility and canonical +rename identity. T8 merely installs the TS parser and admits `.ts/.tsx` into +existing lint scopes. T12 owns committed deterministic generation and negative +fixture tests. T9 owns integration/load-test typing and its coverage inventory. diff --git a/quality/toolchain.json b/quality/toolchain.json new file mode 100644 index 000000000..60abf58c9 --- /dev/null +++ b/quality/toolchain.json @@ -0,0 +1,71 @@ +{ + "schema_version": 1, + "task": "T8", + "node": { + "required": ">=24.11.0 <25", + "verified": "24.22.1" + }, + "npm": "11.19.1", + "packages": { + "root": { + "typescript": "5.9.3", + "openapi-typescript": "7.13.0", + "ajv": "8.20.0", + "ajv-formats": "3.0.1", + "@apidevtools/json-schema-ref-parser": "16.0.5", + "yaml": "2.9.0", + "@types/node": "24.19.2", + "esbuild": "0.28.2" + }, + "web": { + "typescript": "5.9.3", + "typescript-eslint": "8.72.1", + "@babel/preset-typescript": "8.0.7", + "@babel/preset-react": "8.0.1", + "@types/jest": "30.0.0", + "@types/node": "24.19.2" + } + }, + "commands": { + "application_and_web_test_types": "npm --prefix web run typecheck", + "integration_and_load_types": "npm run typecheck:tests", + "unit": "npm --prefix web test -- --runInBand" + }, + "typing_scope": { + "application": [ + "web/js/**/*.ts", + "web/js/**/*.tsx" + ], + "web_tests": [ + "web/tests/**/*.ts", + "web/tests/**/*.tsx" + ], + "real_fixture": "web/tests/types/preact-fixture.tsx", + "strict": true, + "noUncheckedIndexedAccess": true, + "isolatedModules": true, + "noEmit": true, + "allowJs": true, + "checkJs": false, + "legacy_status": "Existing JS/JSX remains explicitly unchecked; T25/T34 own migration and closure. No existing browser implementation is claimed migrated by T8.", + "inventory": "quality/application-inventory.json", + "integration_tests_status": "Command registered; tests/tsconfig.json and existing test repairs are produced by T9." + }, + "jsx": { + "compiler": "react-jsx with jsxImportSource=preact", + "babel": "automatic runtime, importSource=preact; Babel8 preset-typescript (no removed allowDeclareFields option)", + "vite": "existing Vite8 Oxc automatic Preact config retained" + }, + "generator_compatibility": { + "openapi": "3.1.0", + "json_schema": "2020-12", + "fixtures_validated": 91, + "generated_types_compile": true, + "canonical_components_required": "Merge schema fragments into root components and normalize refs before openapi-typescript. Generic ref-parser.bundle places refs in paths/responses that generate invalid indexed types.", + "standalone_browser": "Ajv ESM standalone emits CJS helper require; bundle generated output with root esbuild (browser platform, esm format). Compiler/generator packages must stay out of app runtime.", + "contentSchema": "Annotation only: T12 must decode and validate nonempty eptz_config; empty string means disabled.", + "byte_limits": "T12 must explicitly validate x-lightnvr-max-bytes; JSON Schema maxLength counts code points.", + "proof": "build/eng-artifacts/T8/check-generation.mjs" + }, + "evidence": "quality/evidence/T8.md" +} diff --git a/web/babel.config.cjs b/web/babel.config.cjs index f037a1a2a..b12057830 100644 --- a/web/babel.config.cjs +++ b/web/babel.config.cjs @@ -1,5 +1,7 @@ module.exports = { presets: [ + '@babel/preset-typescript', + ['@babel/preset-react', { runtime: 'automatic', importSource: 'preact' }], [ '@babel/preset-env', { diff --git a/web/eslint.config.js b/web/eslint.config.js index 8696d77c0..bac0acb3b 100644 --- a/web/eslint.config.js +++ b/web/eslint.config.js @@ -6,6 +6,7 @@ * in warn mode so CI reports violations without failing the build; switch rules * to error as each finding category in the issue is closed. */ +import tseslint from 'typescript-eslint'; import jsxA11y from 'eslint-plugin-jsx-a11y'; import reactHooks from 'eslint-plugin-react-hooks'; import noLiteralUiString from './eslint-rules/no-literal-ui-string.js'; @@ -21,7 +22,7 @@ export default [ ignores: ['dist/**', 'node_modules/**', 'coverage/**'], }, { - files: ['js/**/*.js', 'js/**/*.jsx'], + files: ['js/**/*.{js,jsx,ts,tsx}'], linterOptions: { // Targeted disable comments (e.g. react-hooks) belong to configs outside // this a11y lint; don't flag them as unused here. @@ -47,10 +48,15 @@ export default [ }, }, { - files: ['js/components/**/*.js', 'js/components/**/*.jsx'], + files: ['js/components/**/*.{js,jsx,ts,tsx}'], // Existing technical labels and examples are counted by file in the // baseline. New JSX text or visible-attribute literals fail lint. plugins: { 'lightnvr-i18n': { rules: { 'no-literal-ui-string': noLiteralUiString } } }, rules: { 'lightnvr-i18n/no-literal-ui-string': 'error' }, }, + { + files: ['js/**/*.{ts,tsx}'], + languageOptions: { parser: tseslint.parser }, + plugins: { '@typescript-eslint': tseslint.plugin }, + }, ]; diff --git a/web/jest.config.cjs b/web/jest.config.cjs index dceb2d23d..20a1a86e8 100644 --- a/web/jest.config.cjs +++ b/web/jest.config.cjs @@ -3,7 +3,7 @@ // excluded here and run via `npm run test:e2e` (jest.e2e.config.cjs). module.exports = { testMatch: [ - '**/tests/**/*.spec.js' + '**/tests/**/*.spec.[jt]s?(x)' ], testPathIgnorePatterns: [ '/node_modules/', @@ -13,6 +13,6 @@ module.exports = { setupFilesAfterEnv: ['./tests/setup.cjs'], testTimeout: 30000, transform: { - '^.+\\.jsx?$': ['babel-jest', { configFile: './babel.config.cjs' }] + '^.+\\.[jt]sx?$': ['babel-jest', { configFile: './babel.config.cjs' }] } }; diff --git a/web/jest.e2e.config.cjs b/web/jest.e2e.config.cjs index 331eb8985..bbb3e7f91 100644 --- a/web/jest.e2e.config.cjs +++ b/web/jest.e2e.config.cjs @@ -9,12 +9,12 @@ // E2E_HEADLESS 'false' to watch the browser; headless otherwise module.exports = { testMatch: [ - '**/tests/e2e/**/*.spec.js' + '**/tests/e2e/**/*.spec.[jt]s?(x)' ], testEnvironment: 'node', setupFilesAfterEnv: ['./tests/setup.cjs'], testTimeout: 60000, transform: { - '^.+\\.jsx?$': ['babel-jest', { configFile: './babel.config.cjs' }] + '^.+\\.[jt]sx?$': ['babel-jest', { configFile: './babel.config.cjs' }] } }; diff --git a/web/package-lock.json b/web/package-lock.json index 2987cd6b5..3540ea63b 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -26,8 +26,12 @@ "devDependencies": { "@babel/core": "^8.0.1", "@babel/preset-env": "^8.0.2", + "@babel/preset-react": "8.0.1", + "@babel/preset-typescript": "8.0.7", "@prefresh/vite": "^3.0.1", "@sentry/vite-plugin": "^11.10.0", + "@types/jest": "30.0.0", + "@types/node": "24.19.2", "@vitejs/plugin-legacy": "^8.2.3", "autoprefixer": "^10.5.4", "babel-jest": "^30.4.1", @@ -39,6 +43,8 @@ "postcss": "^8.5.26", "postcss-import": "^16.2.0", "selenium-webdriver": "^4.47.0", + "typescript": "5.9.3", + "typescript-eslint": "8.72.1", "vite": "^8.3.5", "vite-plugin-compression": "^0.5.1" }, @@ -328,19 +334,19 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-8.0.1.tgz", - "integrity": "sha512-++t3ZktzlLmASAxIlxeXQK9Z2YwUafYGYcvGBFevqOqt16HozVHStUoQvWD09fzAZOb/uJGpUTBuGK41AJAuOA==", + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-8.0.10.tgz", + "integrity": "sha512-a97s55BatmvDeeQ9rngs/IPi1aeQ3vVUbXr0DsNGhzF/vB2w49N+FqD+D0/YEGLziU7zALhrKFlk6FGlvbM38w==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^8.0.0", - "@babel/helper-member-expression-to-functions": "^8.0.0", + "@babel/helper-member-expression-to-functions": "^8.0.5", "@babel/helper-optimise-call-expression": "^8.0.0", "@babel/helper-replace-supers": "^8.0.1", "@babel/helper-skip-transparent-expression-wrappers": "^8.0.0", - "@babel/traverse": "^8.0.0", - "semver": "^7.7.3" + "@babel/traverse": "^8.0.10", + "verkit": "^0.5.0" }, "engines": { "node": "^22.18.0 || >=24.11.0" @@ -350,13 +356,13 @@ } }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/code-frame": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-8.0.0.tgz", - "integrity": "sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw==", + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-8.0.6.tgz", + "integrity": "sha512-uMHhvmDmwFiLuiozaoRYTZHqMFuu3fem/X9JY78lohAuLoh8LSGGC8JqUzo2cVuBsBxkjMZNk56CE7ock8Xxkw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^8.0.0", + "@babel/helper-validator-identifier": "^8.0.6", "js-tokens": "^10.0.0" }, "engines": { @@ -364,16 +370,16 @@ } }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/generator": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.0.tgz", - "integrity": "sha512-NT9NrVwJsbSV6Y2FSstWa71EETOnzrjkL5/wX3D2mYHtKM+qvqB1DvR4D0Setb/gDBsHzRICifwEWMO8CnTF6g==", + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.10.tgz", + "integrity": "sha512-iC9p3U4Y3vp0qKjRcfFeNzpj+kkK8BVYZTbQepBWVD7vOBLH6ji0drNzKPTPtumFd2w2r/hbEKYjG4pscKa4bg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^8.0.0", - "@babel/types": "^8.0.0", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", + "@babel/parser": "^8.0.10", + "@babel/types": "^8.0.10", + "@jridgewell/gen-mapping": "0.4.0-beta.0", + "@jridgewell/trace-mapping": "^0.3.31", "@types/jsesc": "^2.5.0", "jsesc": "^3.0.2" }, @@ -382,9 +388,9 @@ } }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-globals": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-8.0.0.tgz", - "integrity": "sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw==", + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-8.0.6.tgz", + "integrity": "sha512-OdnA/N52LhzFpeUuVz5YGuSWjc7TPHiFmVYZbPlSgExocO2GwbxVpSni9MVs5wwW+wZ4kPuwBEBN9pIPDYz1mA==", "dev": true, "license": "MIT", "engines": { @@ -392,9 +398,9 @@ } }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-string-parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0.tgz", - "integrity": "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==", + "version": "8.0.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.8.tgz", + "integrity": "sha512-fVM+gSuKbdv9cpmyRNh5EvsDHUZCdxQH3FdnFKSkNYHpbsn95bbrxm+ES3MVeQjcqwi2O5ur/DjLfmTQaO60ng==", "dev": true, "license": "MIT", "engines": { @@ -402,9 +408,9 @@ } }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-validator-identifier": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.4.tgz", - "integrity": "sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg==", + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.6.tgz", + "integrity": "sha512-HYx0YmuchRxRSpnjvcNffnPS8DCauKNmnumIuHG3jnQAVewRA7kfJGwF13ayEpSZs7s4R/oBH4eppuXcAQd5JQ==", "dev": true, "license": "MIT", "engines": { @@ -412,13 +418,13 @@ } }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/parser": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.4.tgz", - "integrity": "sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g==", + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.10.tgz", + "integrity": "sha512-h+ah2Kg0ne1Vii892dShj9gky9I5jPzkd8x4s/3xgN/P2bMWmHS3qq59tum3mCVjCBXI8uqfYyYtrfp1Mz6+1w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^8.0.4" + "@babel/types": "^8.0.10" }, "bin": { "parser": "bin/babel-parser.js" @@ -443,38 +449,49 @@ } }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/traverse": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.4.tgz", - "integrity": "sha512-bZnmqzGG8UZneG1lLxBoWIH0G6Gr1D846Yu4/3XnY6FhCndMR49u26nTY08u/dAxWmLWF9vGQOuC+84FfIUoeg==", + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.10.tgz", + "integrity": "sha512-t5DaGzMi9WlhMSFT2YavI8gl8yGihoQymSQUkIq9+MUh5tO3Vx9KHwr5gMCzeBdYkvs00xNvr18PxtQTRayucA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^8.0.0", - "@babel/generator": "^8.0.0", - "@babel/helper-globals": "^8.0.0", - "@babel/parser": "^8.0.4", + "@babel/code-frame": "^8.0.6", + "@babel/generator": "^8.0.10", + "@babel/helper-globals": "^8.0.6", + "@babel/parser": "^8.0.10", "@babel/template": "^8.0.0", - "@babel/types": "^8.0.4", - "obug": "^2.1.1" + "@babel/types": "^8.0.10", + "obug": "^3.0.0" }, "engines": { "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/types": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.4.tgz", - "integrity": "sha512-eY+Yn3dCqTGmyiq2QRU66lA5FL8lqqqvecHt0fF3uHONIa7ToYsaCiWV8lOKqAs0Rb2SjixiKFROngnulPtt2g==", + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.10.tgz", + "integrity": "sha512-KV8Y+teoRsmXeEPS4sCJY1kwV+hcPzHP1qQqgCxrjKOehLdBaxpsFBfoJ8MXWFV80y6Jw56+TM95wR0Per8dYw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^8.0.0", - "@babel/helper-validator-identifier": "^8.0.4" + "@babel/helper-string-parser": "^8.0.8", + "@babel/helper-validator-identifier": "^8.0.6" }, "engines": { "node": "^22.18.0 || >=24.11.0" } }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@jridgewell/gen-mapping": { + "version": "0.4.0-beta.0", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.4.0-beta.0.tgz", + "integrity": "sha512-JdGNkbE4GlNPYQhM0L95fBQr7ctLZJ276QXQLTad4t1oSdnnCI3fDq9DW3BqYAWv8Wc3+HS+4Gsii1oPMCfz1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.6.0-beta.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/js-tokens": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", @@ -482,6 +499,20 @@ "dev": true, "license": "MIT" }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/obug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/obug/-/obug-3.0.0.tgz", + "integrity": "sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/@babel/helper-create-regexp-features-plugin": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-8.0.1.tgz", @@ -541,27 +572,27 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-8.0.0.tgz", - "integrity": "sha512-xkXrMbtk87Gk7+oKBVmBc6EORg/Qwx++AHESldmHkpvG8wgccdhJJFwrzqlF382Fk8wfXhJHWE/g/43QvEGNPQ==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-8.0.5.tgz", + "integrity": "sha512-GLe05QD98BkNFTkjaqeqF9QSRoHLKrrB4tpoplyQuuPrQJ72rtmkM4wvqJLX/sjZPqkbK5MUYSsuUTqdJoOVjA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^8.0.0", - "@babel/types": "^8.0.0" + "@babel/traverse": "^8.0.5", + "@babel/types": "^8.0.5" }, "engines": { "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/code-frame": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-8.0.0.tgz", - "integrity": "sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw==", + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-8.0.6.tgz", + "integrity": "sha512-uMHhvmDmwFiLuiozaoRYTZHqMFuu3fem/X9JY78lohAuLoh8LSGGC8JqUzo2cVuBsBxkjMZNk56CE7ock8Xxkw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^8.0.0", + "@babel/helper-validator-identifier": "^8.0.6", "js-tokens": "^10.0.0" }, "engines": { @@ -569,16 +600,16 @@ } }, "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/generator": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.0.tgz", - "integrity": "sha512-NT9NrVwJsbSV6Y2FSstWa71EETOnzrjkL5/wX3D2mYHtKM+qvqB1DvR4D0Setb/gDBsHzRICifwEWMO8CnTF6g==", + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.10.tgz", + "integrity": "sha512-iC9p3U4Y3vp0qKjRcfFeNzpj+kkK8BVYZTbQepBWVD7vOBLH6ji0drNzKPTPtumFd2w2r/hbEKYjG4pscKa4bg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^8.0.0", - "@babel/types": "^8.0.0", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", + "@babel/parser": "^8.0.10", + "@babel/types": "^8.0.10", + "@jridgewell/gen-mapping": "0.4.0-beta.0", + "@jridgewell/trace-mapping": "^0.3.31", "@types/jsesc": "^2.5.0", "jsesc": "^3.0.2" }, @@ -587,9 +618,9 @@ } }, "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/helper-globals": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-8.0.0.tgz", - "integrity": "sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw==", + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-8.0.6.tgz", + "integrity": "sha512-OdnA/N52LhzFpeUuVz5YGuSWjc7TPHiFmVYZbPlSgExocO2GwbxVpSni9MVs5wwW+wZ4kPuwBEBN9pIPDYz1mA==", "dev": true, "license": "MIT", "engines": { @@ -597,9 +628,9 @@ } }, "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/helper-string-parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0.tgz", - "integrity": "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==", + "version": "8.0.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.8.tgz", + "integrity": "sha512-fVM+gSuKbdv9cpmyRNh5EvsDHUZCdxQH3FdnFKSkNYHpbsn95bbrxm+ES3MVeQjcqwi2O5ur/DjLfmTQaO60ng==", "dev": true, "license": "MIT", "engines": { @@ -607,9 +638,9 @@ } }, "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/helper-validator-identifier": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.4.tgz", - "integrity": "sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg==", + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.6.tgz", + "integrity": "sha512-HYx0YmuchRxRSpnjvcNffnPS8DCauKNmnumIuHG3jnQAVewRA7kfJGwF13ayEpSZs7s4R/oBH4eppuXcAQd5JQ==", "dev": true, "license": "MIT", "engines": { @@ -617,13 +648,13 @@ } }, "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/parser": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.4.tgz", - "integrity": "sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g==", + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.10.tgz", + "integrity": "sha512-h+ah2Kg0ne1Vii892dShj9gky9I5jPzkd8x4s/3xgN/P2bMWmHS3qq59tum3mCVjCBXI8uqfYyYtrfp1Mz6+1w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^8.0.4" + "@babel/types": "^8.0.10" }, "bin": { "parser": "bin/babel-parser.js" @@ -648,38 +679,49 @@ } }, "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/traverse": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.4.tgz", - "integrity": "sha512-bZnmqzGG8UZneG1lLxBoWIH0G6Gr1D846Yu4/3XnY6FhCndMR49u26nTY08u/dAxWmLWF9vGQOuC+84FfIUoeg==", + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.10.tgz", + "integrity": "sha512-t5DaGzMi9WlhMSFT2YavI8gl8yGihoQymSQUkIq9+MUh5tO3Vx9KHwr5gMCzeBdYkvs00xNvr18PxtQTRayucA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^8.0.0", - "@babel/generator": "^8.0.0", - "@babel/helper-globals": "^8.0.0", - "@babel/parser": "^8.0.4", + "@babel/code-frame": "^8.0.6", + "@babel/generator": "^8.0.10", + "@babel/helper-globals": "^8.0.6", + "@babel/parser": "^8.0.10", "@babel/template": "^8.0.0", - "@babel/types": "^8.0.4", - "obug": "^2.1.1" + "@babel/types": "^8.0.10", + "obug": "^3.0.0" }, "engines": { "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/types": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.4.tgz", - "integrity": "sha512-eY+Yn3dCqTGmyiq2QRU66lA5FL8lqqqvecHt0fF3uHONIa7ToYsaCiWV8lOKqAs0Rb2SjixiKFROngnulPtt2g==", + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.10.tgz", + "integrity": "sha512-KV8Y+teoRsmXeEPS4sCJY1kwV+hcPzHP1qQqgCxrjKOehLdBaxpsFBfoJ8MXWFV80y6Jw56+TM95wR0Per8dYw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^8.0.0", - "@babel/helper-validator-identifier": "^8.0.4" + "@babel/helper-string-parser": "^8.0.8", + "@babel/helper-validator-identifier": "^8.0.6" }, "engines": { "node": "^22.18.0 || >=24.11.0" } }, + "node_modules/@babel/helper-member-expression-to-functions/node_modules/@jridgewell/gen-mapping": { + "version": "0.4.0-beta.0", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.4.0-beta.0.tgz", + "integrity": "sha512-JdGNkbE4GlNPYQhM0L95fBQr7ctLZJ276QXQLTad4t1oSdnnCI3fDq9DW3BqYAWv8Wc3+HS+4Gsii1oPMCfz1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.6.0-beta.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "node_modules/@babel/helper-member-expression-to-functions/node_modules/js-tokens": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", @@ -687,6 +729,20 @@ "dev": true, "license": "MIT" }, + "node_modules/@babel/helper-member-expression-to-functions/node_modules/obug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/obug/-/obug-3.0.0.tgz", + "integrity": "sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/@babel/helper-module-imports": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", @@ -1839,6 +1895,64 @@ "@babel/core": "^8.0.0" } }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-8.0.1.tgz", + "integrity": "sha512-n0jtCOxEovhU7METqSQjcZO9pX53nu9uNIjMS+hEt+Nt9jA7oOZoBIgbCxhhASmF6T6rPDGge5UAvh6Z4eFz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^8.0.1" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + }, + "peerDependencies": { + "@babel/core": "^8.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx/node_modules/@babel/helper-plugin-utils": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-8.0.1.tgz", + "integrity": "sha512-3PKFgjTyPlhFhorfP+SjKQxLViIL++zWjFOO4hGriYU+Bsm983DxEM1JmDRJVWXV0O9npu+xXRqz7Pbd3mh70g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + }, + "peerDependencies": { + "@babel/core": "^8.0.0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-8.0.3.tgz", + "integrity": "sha512-jmTPwps7oSQSZaV1SxkQ3C12UWyufGysGc5OzDpZzvPAIX4mO7dJT3hoqkWVrSImvkcMiknir1iLN1SNV/CZzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^8.0.1" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + }, + "peerDependencies": { + "@babel/core": "^8.0.0" + } + }, + "node_modules/@babel/plugin-syntax-typescript/node_modules/@babel/helper-plugin-utils": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-8.0.1.tgz", + "integrity": "sha512-3PKFgjTyPlhFhorfP+SjKQxLViIL++zWjFOO4hGriYU+Bsm983DxEM1JmDRJVWXV0O9npu+xXRqz7Pbd3mh70g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + }, + "peerDependencies": { + "@babel/core": "^8.0.0" + } + }, "node_modules/@babel/plugin-transform-arrow-functions": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-8.0.1.tgz", @@ -3423,6 +3537,286 @@ "@babel/core": "^8.0.0" } }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-8.0.1.tgz", + "integrity": "sha512-soLishXlkyu6jcICPyO3HEP7A3GCzKEnn7XfvYrImuWEOwFAz93qShmWSYPf5ww0ZkO4By0zsN2bVIDF54fSdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^8.0.1" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + }, + "peerDependencies": { + "@babel/core": "^8.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name/node_modules/@babel/helper-plugin-utils": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-8.0.1.tgz", + "integrity": "sha512-3PKFgjTyPlhFhorfP+SjKQxLViIL++zWjFOO4hGriYU+Bsm983DxEM1JmDRJVWXV0O9npu+xXRqz7Pbd3mh70g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + }, + "peerDependencies": { + "@babel/core": "^8.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-8.0.1.tgz", + "integrity": "sha512-NgkoF7Uq+30TmOPDdNUimT0Nta02uVjqJRFNlVWKrbOCu/CkzfHa4aMnIs0lMpkMmZmWA1e42Va+F04i/pY1zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^8.0.0", + "@babel/helper-module-imports": "^8.0.0", + "@babel/helper-plugin-utils": "^8.0.1", + "@babel/plugin-syntax-jsx": "^8.0.1", + "@babel/types": "^8.0.0" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + }, + "peerDependencies": { + "@babel/core": "^8.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-8.0.1.tgz", + "integrity": "sha512-Hb+HUZpV9KFHjm+F+P3aLDMi8QXU9l3ROCQv20z18Me2sGyW5nNNR5YTevNlgHvCpFek3BnAwhDGq/BRndXViw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^8.0.1" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + }, + "peerDependencies": { + "@babel/core": "^8.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/code-frame": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-8.0.6.tgz", + "integrity": "sha512-uMHhvmDmwFiLuiozaoRYTZHqMFuu3fem/X9JY78lohAuLoh8LSGGC8JqUzo2cVuBsBxkjMZNk56CE7ock8Xxkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^8.0.6", + "js-tokens": "^10.0.0" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/generator": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.10.tgz", + "integrity": "sha512-iC9p3U4Y3vp0qKjRcfFeNzpj+kkK8BVYZTbQepBWVD7vOBLH6ji0drNzKPTPtumFd2w2r/hbEKYjG4pscKa4bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^8.0.10", + "@babel/types": "^8.0.10", + "@jridgewell/gen-mapping": "0.4.0-beta.0", + "@jridgewell/trace-mapping": "^0.3.31", + "@types/jsesc": "^2.5.0", + "jsesc": "^3.0.2" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/helper-globals": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-8.0.6.tgz", + "integrity": "sha512-OdnA/N52LhzFpeUuVz5YGuSWjc7TPHiFmVYZbPlSgExocO2GwbxVpSni9MVs5wwW+wZ4kPuwBEBN9pIPDYz1mA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/helper-module-imports": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-8.0.0.tgz", + "integrity": "sha512-NZ7mSS93o4ndX4KrbD7W8Sf3QT8Qe24PrnFyUcuOPDzK6faqDFKjY9RG7he7+I7FdiQ4llpnosFqzrXa+Vy3Ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^8.0.0", + "@babel/types": "^8.0.0" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/helper-plugin-utils": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-8.0.1.tgz", + "integrity": "sha512-3PKFgjTyPlhFhorfP+SjKQxLViIL++zWjFOO4hGriYU+Bsm983DxEM1JmDRJVWXV0O9npu+xXRqz7Pbd3mh70g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + }, + "peerDependencies": { + "@babel/core": "^8.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/helper-string-parser": { + "version": "8.0.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.8.tgz", + "integrity": "sha512-fVM+gSuKbdv9cpmyRNh5EvsDHUZCdxQH3FdnFKSkNYHpbsn95bbrxm+ES3MVeQjcqwi2O5ur/DjLfmTQaO60ng==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/helper-validator-identifier": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.6.tgz", + "integrity": "sha512-HYx0YmuchRxRSpnjvcNffnPS8DCauKNmnumIuHG3jnQAVewRA7kfJGwF13ayEpSZs7s4R/oBH4eppuXcAQd5JQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/parser": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.10.tgz", + "integrity": "sha512-h+ah2Kg0ne1Vii892dShj9gky9I5jPzkd8x4s/3xgN/P2bMWmHS3qq59tum3mCVjCBXI8uqfYyYtrfp1Mz6+1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^8.0.10" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/template": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-8.0.0.tgz", + "integrity": "sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^8.0.0", + "@babel/parser": "^8.0.0", + "@babel/types": "^8.0.0" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/traverse": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.10.tgz", + "integrity": "sha512-t5DaGzMi9WlhMSFT2YavI8gl8yGihoQymSQUkIq9+MUh5tO3Vx9KHwr5gMCzeBdYkvs00xNvr18PxtQTRayucA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^8.0.6", + "@babel/generator": "^8.0.10", + "@babel/helper-globals": "^8.0.6", + "@babel/parser": "^8.0.10", + "@babel/template": "^8.0.0", + "@babel/types": "^8.0.10", + "obug": "^3.0.0" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/types": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.10.tgz", + "integrity": "sha512-KV8Y+teoRsmXeEPS4sCJY1kwV+hcPzHP1qQqgCxrjKOehLdBaxpsFBfoJ8MXWFV80y6Jw56+TM95wR0Per8dYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^8.0.8", + "@babel/helper-validator-identifier": "^8.0.6" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@jridgewell/gen-mapping": { + "version": "0.4.0-beta.0", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.4.0-beta.0.tgz", + "integrity": "sha512-JdGNkbE4GlNPYQhM0L95fBQr7ctLZJ276QXQLTad4t1oSdnnCI3fDq9DW3BqYAWv8Wc3+HS+4Gsii1oPMCfz1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.6.0-beta.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@babel/plugin-transform-react-jsx/node_modules/js-tokens": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", + "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/plugin-transform-react-jsx/node_modules/obug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/obug/-/obug-3.0.0.tgz", + "integrity": "sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-8.0.1.tgz", + "integrity": "sha512-7/8UwU8hoPBurXa9tUiTTC8aACTRy5tCqLUtqikHp2eGiWoEB57AduOdbQ71OOMTEvawKrGhv3WfzkDpI+/oSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^8.0.0", + "@babel/helper-plugin-utils": "^8.0.1" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + }, + "peerDependencies": { + "@babel/core": "^8.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations/node_modules/@babel/helper-plugin-utils": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-8.0.1.tgz", + "integrity": "sha512-3PKFgjTyPlhFhorfP+SjKQxLViIL++zWjFOO4hGriYU+Bsm983DxEM1JmDRJVWXV0O9npu+xXRqz7Pbd3mh70g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + }, + "peerDependencies": { + "@babel/core": "^8.0.0" + } + }, "node_modules/@babel/plugin-transform-regenerator": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-8.0.2.tgz", @@ -3657,6 +4051,39 @@ "@babel/core": "^8.0.0" } }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-8.0.6.tgz", + "integrity": "sha512-WF3yRlQtClzScvQbWct00ix63+w3DPiyU0WmCBU4YqK539n3VvJFElElpevoD8wfu6953CbiNoUZBi2B7/5jXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^8.0.0", + "@babel/helper-create-class-features-plugin": "^8.0.6", + "@babel/helper-plugin-utils": "^8.0.1", + "@babel/helper-skip-transparent-expression-wrappers": "^8.0.0", + "@babel/plugin-syntax-typescript": "^8.0.3" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + }, + "peerDependencies": { + "@babel/core": "^8.0.0" + } + }, + "node_modules/@babel/plugin-transform-typescript/node_modules/@babel/helper-plugin-utils": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-8.0.1.tgz", + "integrity": "sha512-3PKFgjTyPlhFhorfP+SjKQxLViIL++zWjFOO4hGriYU+Bsm983DxEM1JmDRJVWXV0O9npu+xXRqz7Pbd3mh70g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + }, + "peerDependencies": { + "@babel/core": "^8.0.0" + } + }, "node_modules/@babel/plugin-transform-unicode-escapes": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-8.0.1.tgz", @@ -3886,7 +4313,75 @@ "@babel/core": "^8.0.0" } }, - "node_modules/@babel/preset-modules/node_modules/@babel/helper-plugin-utils": { + "node_modules/@babel/preset-modules/node_modules/@babel/helper-plugin-utils": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-8.0.1.tgz", + "integrity": "sha512-3PKFgjTyPlhFhorfP+SjKQxLViIL++zWjFOO4hGriYU+Bsm983DxEM1JmDRJVWXV0O9npu+xXRqz7Pbd3mh70g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + }, + "peerDependencies": { + "@babel/core": "^8.0.0" + } + }, + "node_modules/@babel/preset-modules/node_modules/@babel/helper-string-parser": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0.tgz", + "integrity": "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/preset-modules/node_modules/@babel/helper-validator-identifier": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.4.tgz", + "integrity": "sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/preset-modules/node_modules/@babel/types": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.4.tgz", + "integrity": "sha512-eY+Yn3dCqTGmyiq2QRU66lA5FL8lqqqvecHt0fF3uHONIa7ToYsaCiWV8lOKqAs0Rb2SjixiKFROngnulPtt2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^8.0.0", + "@babel/helper-validator-identifier": "^8.0.4" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-8.0.1.tgz", + "integrity": "sha512-jrFuPp/pTddFZbtmWhdLNAYc6UMcpboeUPnw0BBrm4nOmcAko/1TRcFi1PzWCeOFRU+VaSiKmat87W1HvR7mIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^8.0.1", + "@babel/helper-validator-option": "^8.0.0", + "@babel/plugin-transform-react-display-name": "^8.0.1", + "@babel/plugin-transform-react-jsx": "^8.0.1", + "@babel/plugin-transform-react-jsx-development": "^8.0.1", + "@babel/plugin-transform-react-pure-annotations": "^8.0.1" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + }, + "peerDependencies": { + "@babel/core": "^8.0.0" + } + }, + "node_modules/@babel/preset-react/node_modules/@babel/helper-plugin-utils": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-8.0.1.tgz", "integrity": "sha512-3PKFgjTyPlhFhorfP+SjKQxLViIL++zWjFOO4hGriYU+Bsm983DxEM1JmDRJVWXV0O9npu+xXRqz7Pbd3mh70g==", @@ -3899,38 +4394,36 @@ "@babel/core": "^8.0.0" } }, - "node_modules/@babel/preset-modules/node_modules/@babel/helper-string-parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0.tgz", - "integrity": "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==", + "node_modules/@babel/preset-typescript": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-8.0.7.tgz", + "integrity": "sha512-sUFLFphAG6YNjCnJpSKpyoNxkfyeM2KNuUjJJN0R6dZusMcK2V3Fg11MVHPFvb37AZeDNocc+xM748vdh9z82Q==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^8.0.1", + "@babel/helper-validator-option": "^8.0.0", + "@babel/plugin-transform-modules-commonjs": "^8.0.1", + "@babel/plugin-transform-typescript": "^8.0.6" + }, "engines": { "node": "^22.18.0 || >=24.11.0" + }, + "peerDependencies": { + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/preset-modules/node_modules/@babel/helper-validator-identifier": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.4.tgz", - "integrity": "sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg==", + "node_modules/@babel/preset-typescript/node_modules/@babel/helper-plugin-utils": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-8.0.1.tgz", + "integrity": "sha512-3PKFgjTyPlhFhorfP+SjKQxLViIL++zWjFOO4hGriYU+Bsm983DxEM1JmDRJVWXV0O9npu+xXRqz7Pbd3mh70g==", "dev": true, "license": "MIT", "engines": { "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/preset-modules/node_modules/@babel/types": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.4.tgz", - "integrity": "sha512-eY+Yn3dCqTGmyiq2QRU66lA5FL8lqqqvecHt0fF3uHONIa7ToYsaCiWV8lOKqAs0Rb2SjixiKFROngnulPtt2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^8.0.0", - "@babel/helper-validator-identifier": "^8.0.4" }, - "engines": { - "node": "^22.18.0 || >=24.11.0" + "peerDependencies": { + "@babel/core": "^8.0.0" } }, "node_modules/@babel/template": { @@ -5304,9 +5797,9 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { @@ -7223,6 +7716,17 @@ "@types/istanbul-lib-report": "*" } }, + "node_modules/@types/jest": { + "version": "30.0.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz", + "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^30.0.0", + "pretty-format": "^30.0.0" + } + }, "node_modules/@types/jsesc": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/@types/jsesc/-/jsesc-2.5.1.tgz", @@ -7238,9 +7742,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "25.9.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.2.tgz", - "integrity": "sha512-G05zqtJhcDLb8uslf5EjCxXg9G1KQxiV8OS0R26IC//Eoyitzqe8z37I7cqvnZlrlSfgocQRfSn/AHBZJJFyGw==", + "version": "24.19.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.19.2.tgz", + "integrity": "sha512-93d49wCWJkCyN87MxLpNN6KXPCwFw7bVUg79mGUV1OS40JGWwVCr8n61DXCSqz7CV6/VfPkb7xec7uP2M+QHWQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7271,6 +7775,288 @@ "dev": true, "license": "MIT" }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.72.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.72.1.tgz", + "integrity": "sha512-5CokTWXpmbylfFabsbvHC0CAw3XLaGnoa+nFJX5FR592h/LoZsENUE6p/rg5xvkKrFEXz6pYmgI29AgXc2N3BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.72.1", + "@typescript-eslint/type-utils": "8.72.1", + "@typescript-eslint/utils": "8.72.1", + "@typescript-eslint/visitor-keys": "8.72.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.72.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.14.tgz", + "integrity": "sha512-wCBiZ77u1tuWde6G/nfOtLaCTYcFDU5yCzARzK10y+rLhzYoL7a7yEemcopcc2Mzow7gZOIjnV2ym1NYmdiJOQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.72.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.72.1.tgz", + "integrity": "sha512-ZGwZP4OCfyA0AQTpEAMWz+rtX01DRhQWW5hB0ucKDEIX5U7jdmPSaMx94rQfaPAQzIYz2BimOgKOJtjfpRFQ9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.72.1", + "@typescript-eslint/types": "8.72.1", + "@typescript-eslint/typescript-estree": "8.72.1", + "@typescript-eslint/visitor-keys": "8.72.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.72.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.72.1.tgz", + "integrity": "sha512-fAuVMkwdO/huI8nyo/WKnNKf6Gag93S56Rh3Ts5mGcavwSdaN8tRg1gCeIGX8PF+nzp1BjGfO4gHhGzW1J6jTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.72.1", + "@typescript-eslint/types": "^8.72.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.72.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.72.1.tgz", + "integrity": "sha512-lC/t6eMCZZQAAKZEYGL6RDVSuFehpdmMT6h+nJIjIa6oylN/PwDgDVtEIbB7O9xFfZYtZAYLoLlDNWKJhtF+uQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.72.1", + "@typescript-eslint/visitor-keys": "8.72.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.72.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.72.1.tgz", + "integrity": "sha512-e4D5R5vpeAEPBxT2BAzsFQL3sbwyeeeo5+aczgNSRK1V734jE7pTqaGFU+fXapWEQwnZbpFaTn32+Z8DwS6OTg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.72.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.72.1.tgz", + "integrity": "sha512-iY2wlmyrXJmx4yxUGP3aYCFF3cA/6ShddOKmLU2dx7LnEykbAM8WThlxZEfd1NddqceF6eJmZUayxx9oKIYNlg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.72.1", + "@typescript-eslint/typescript-estree": "8.72.1", + "@typescript-eslint/utils": "8.72.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.72.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.72.1.tgz", + "integrity": "sha512-LmE5IhQet1BWOWEXqBrVtBPsMAOQ6Nzk35d+WLh3mk4EUF33sqlfxjio1MdYeSvKSG5skactKKuixBIKXhL4Rw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.72.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.72.1.tgz", + "integrity": "sha512-DAlUoUV93hIvrtIQLwCbmZQYVZwOMhiHJrOVUUIWicFZaIYjTRqlY3I/NZevfkLmSqkNHRu2qYDcq9lrn16oOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.72.1", + "@typescript-eslint/tsconfig-utils": "8.72.1", + "@typescript-eslint/types": "8.72.1", + "@typescript-eslint/visitor-keys": "8.72.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.72.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.72.1.tgz", + "integrity": "sha512-5v5liypurJBFHCBNqh/RjsymAD+VWcE0djuGY/BUqp5fC3Qn+luWDEksjuTtWjPn6i5zQlUtkZCRG/CYG0yCkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.72.1", + "@typescript-eslint/types": "8.72.1", + "@typescript-eslint/typescript-estree": "8.72.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.72.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.72.1.tgz", + "integrity": "sha512-SB8xqipSzZHUePCCLNeYxqnxq83X61/qzNhjQGbTfjxGZIeOEP7tBgWYX05Tcd6CgE02WdTJnh5b8kMZJ/+bnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.72.1", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@ungap/structured-clone": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.1.tgz", @@ -15791,6 +16577,19 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -15911,6 +16710,44 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.72.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.72.1.tgz", + "integrity": "sha512-3Li9FfPmQp45nxEtFD1ZCrYFI3cYK5kpyNtmm1H7lMagm8u9sy6PTjy3ytwQZs7KNukOyKFHAZ6z6GjYFeaeXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.72.1", + "@typescript-eslint/parser": "8.72.1", + "@typescript-eslint/typescript-estree": "8.72.1", + "@typescript-eslint/utils": "8.72.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, "node_modules/unbox-primitive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", @@ -16113,6 +16950,19 @@ "node": ">=10.12.0" } }, + "node_modules/verkit": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/verkit/-/verkit-0.5.0.tgz", + "integrity": "sha512-u4J1hr6Y+C/hit34GwL3eIcUf3wngT8TlYUjK7tk0jxydKLAq3sYvifjdTDA6U3KCKRcQCQDGf/srjxfZF3l7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, "node_modules/vite": { "version": "8.3.5", "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.5.tgz", diff --git a/web/package.json b/web/package.json index c170d2e20..f4d2cda70 100644 --- a/web/package.json +++ b/web/package.json @@ -14,7 +14,8 @@ "preview": "vite preview", "lint": "eslint js", "test": "jest --config=jest.config.cjs", - "test:e2e": "jest --config=jest.e2e.config.cjs --runInBand" + "test:e2e": "jest --config=jest.e2e.config.cjs --runInBand", + "typecheck": "tsc --project tsconfig.json && tsc --project tsconfig.tests.json" }, "author": "", "license": "ISC", @@ -36,8 +37,12 @@ "devDependencies": { "@babel/core": "^8.0.1", "@babel/preset-env": "^8.0.2", + "@babel/preset-react": "8.0.1", + "@babel/preset-typescript": "8.0.7", "@prefresh/vite": "^3.0.1", "@sentry/vite-plugin": "^11.10.0", + "@types/jest": "30.0.0", + "@types/node": "24.19.2", "@vitejs/plugin-legacy": "^8.2.3", "autoprefixer": "^10.5.4", "babel-jest": "^30.4.1", @@ -49,6 +54,8 @@ "postcss": "^8.5.26", "postcss-import": "^16.2.0", "selenium-webdriver": "^4.47.0", + "typescript": "5.9.3", + "typescript-eslint": "8.72.1", "vite": "^8.3.5", "vite-plugin-compression": "^0.5.1" } diff --git a/web/tests/types/preact-fixture.tsx b/web/tests/types/preact-fixture.tsx new file mode 100644 index 000000000..ee7c38252 --- /dev/null +++ b/web/tests/types/preact-fixture.tsx @@ -0,0 +1,17 @@ +import type { ComponentChildren, JSX } from 'preact'; + +export interface SaveControlProps { + label: string; + pending: boolean; + onSave: () => Promise; + children?: ComponentChildren; +} + +/** A real typed Preact boundary used to verify compiler and Jest transforms. */ +export function SaveControl({ label, pending, onSave, children }: SaveControlProps): JSX.Element { + return ( + + ); +} diff --git a/web/tests/types/preactToolchain.spec.tsx b/web/tests/types/preactToolchain.spec.tsx new file mode 100644 index 000000000..a19cb33cb --- /dev/null +++ b/web/tests/types/preactToolchain.spec.tsx @@ -0,0 +1,19 @@ +import { isValidElement } from 'preact'; +import { SaveControl } from './preact-fixture'; + +it('executes automatic JSX as a Preact element with typed props', () => { + const element = {}} />; + expect(isValidElement(element)).toBe(true); + expect(element.type).toBe(SaveControl); + expect(element.props.label).toBe('Save'); +}); + +it('preserves disabled state and the async handler at the DOM boundary', async () => { + const onSave = jest.fn(async () => {}); + const element = SaveControl({ label: 'Save', pending: true, onSave }); + expect(element.type).toBe('button'); + expect(element.props.disabled).toBe(true); + expect(element.props['aria-label']).toBe('Save'); + await element.props.onClick(); + expect(onSave).toHaveBeenCalledTimes(1); +}); diff --git a/web/tsconfig.base.json b/web/tsconfig.base.json new file mode 100644 index 000000000..811021f2c --- /dev/null +++ b/web/tsconfig.base.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "moduleResolution": "Bundler", + "jsx": "react-jsx", + "jsxImportSource": "preact", + "strict": true, + "noUncheckedIndexedAccess": true, + "isolatedModules": true, + "noEmit": true, + "allowJs": true, + "checkJs": false, + "resolveJsonModule": true, + "forceConsistentCasingInFileNames": true, + "skipLibCheck": false + } +} diff --git a/web/tsconfig.json b/web/tsconfig.json new file mode 100644 index 000000000..efba36a9f --- /dev/null +++ b/web/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { "types": ["vite/client"] }, + "include": ["js/**/*.ts", "js/**/*.tsx", "tests/types/preact-fixture.tsx"], + "exclude": ["node_modules", "dist", "coverage"] +} diff --git a/web/tsconfig.tests.json b/web/tsconfig.tests.json new file mode 100644 index 000000000..26e263ccd --- /dev/null +++ b/web/tsconfig.tests.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { "types": ["jest", "node"] }, + "include": ["tests/**/*.ts", "tests/**/*.tsx"], + "exclude": ["node_modules", "dist", "coverage"] +} From 3eb4d25165ba01885802e7f2e5bac7b92bf44ee4 Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Sat, 31 Oct 2026 03:37:45 -0400 Subject: [PATCH 013/230] T7: materialize bounded remediation tasks and closure dependencies --- quality/evidence/T7-check.py | 80 + quality/evidence/T7-expansion.md | 6166 ++++++++ quality/evidence/T7.md | 101 + quality/remediation-map.json | 24317 +++++++++++++++++++++++++++++ 4 files changed, 30664 insertions(+) create mode 100644 quality/evidence/T7-check.py create mode 100644 quality/evidence/T7-expansion.md create mode 100644 quality/evidence/T7.md create mode 100644 quality/remediation-map.json diff --git a/quality/evidence/T7-check.py b/quality/evidence/T7-check.py new file mode 100644 index 000000000..ed5fbf39f --- /dev/null +++ b/quality/evidence/T7-check.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python3 +"""Static validation of the T7 expansion; does not approve or execute tasks.""" +import argparse +import collections +import hashlib +import json +import pathlib +import re + +parser = argparse.ArgumentParser() +parser.add_argument('--map', default='quality/remediation-map.json') +parser.add_argument('--plan', default='engineering-foundation-plan.md') +args = parser.parse_args() +data = json.loads(pathlib.Path(args.map).read_text()) +invpath = pathlib.Path('quality/findings.json') +inventory = json.loads(invpath.read_text()) +assert data['inventory_sha256'] == hashlib.sha256(invpath.read_bytes()).hexdigest(), 'inventory changed; reconcile map' +items = inventory['findings'] + inventory['buckets'] +expected = {item['id'] for item in items} +mapped = collections.Counter(row['finding_id'] for row in data['finding_map']) +assert all(mapped[fid] == 1 for fid in expected), 'missing/duplicated inventory finding' +assert set(mapped) - expected == {f'F-T11-{i:02}' for i in range(1, 18)}, 'candidate coverage mismatch' +assert all(n == 1 for n in mapped.values()), 'duplicate finding mappings' +assert not any(row['approved_exception'] for row in data['finding_map']), 'planning cannot approve an exception' +tasks = {task['id']: task for task in data['tasks']} +assert len(tasks) == len(data['tasks']), 'duplicate task ID' +assert set(tasks) == {f'T7.{i}' for i in range(1, len(tasks) + 1)}, 'unstable task numbering' +text = pathlib.Path(args.plan).read_text() +records = re.findall(r'^### (T[\d.]+):[^\n]*\n- \*\*depends_on\*\*: \[([^\]]*)\]', text, re.M) +assert len(records) == len({r[0] for r in records}), 'duplicate plan IDs' +graph = {name: [v.strip() for v in deps.split(',') if v.strip()] for name, deps in records} +for task in tasks.values(): + graph[task['id']] = task['depends_on'][:] + assert len(task['source_paths']) <= 6, (task['id'], 'implementation cluster too large') + assert task['validation'] and task['acceptance_criteria'], (task['id'], 'empty contract') + assert task['evidence'] in task['ownership'], (task['id'], 'evidence lacks owner') + assert not any('**' in p or p in ('src/', 'web/') for p in task['ownership']), 'broad ownership' + for path in task['source_paths']: + assert pathlib.Path(path).exists() or path.startswith('/usr/'), (task['id'], 'unknown source', path) + for fid in task['finding_ids']: + assert any(r['finding_id'] == fid and r['task_id'] == task['id'] for r in data['finding_map']) +for name, deps in data['gate_dependency_additions'].items(): + assert name in graph, ('missing gate', name) + graph[name] = list(dict.fromkeys(graph[name] + deps)) +active = [] +ancestors = {} +def visit(name): + assert name in graph, ('unknown dependency', name) + assert name not in active, ('cycle', active + [name]) + if name in ancestors: + return ancestors[name] + active.append(name) + parents = set(graph[name]) + for dependency in graph[name]: + parents.update(visit(dependency)) + active.pop() + ancestors[name] = parents + return parents +for name in graph: + visit(name) +# All same-file remediation writers must be ordered; source references are read-only. +writers = collections.defaultdict(list) +for task in tasks.values(): + for path in task['ownership']: + writers[path].append(task['id']) +for path, owners in writers.items(): + for i, left in enumerate(owners): + for right in owners[i + 1:]: + assert left in ancestors[right] or right in ancestors[left], ('unordered writers', path, left, right) +assert set(tasks).issubset(ancestors['T33']), 'closure gate misses remediation task' +assert data['shared_resource_contracts']['native_test_registration'], 'missing registration producer' +for row in data['finding_map']: + assert row['task_id'] in graph, ('unknown mapped task', row) +assert {g['id'] for g in data['coverage_gaps']} == {g['id'] for g in inventory['coverage_gaps']} +assert all(not gap['approved_exception'] for gap in data['coverage_gaps']) +assert set(data['discrepancy_map']) == {d['id'] for d in json.load(open('quality/api-inventory.json'))['discrepancies']} +for targets in data['discrepancy_map'].values(): + assert all(target in graph for target in targets) +print(f'PASS: {len(expected)} inventory findings, 17 candidates, {len(tasks)} remediation tasks, ' + f'{len(graph)} acyclic graph nodes; coverage, ownership ordering, source paths and T33 fence verified') diff --git a/quality/evidence/T7-expansion.md b/quality/evidence/T7-expansion.md new file mode 100644 index 000000000..63b54f36b --- /dev/null +++ b/quality/evidence/T7-expansion.md @@ -0,0 +1,6166 @@ +# T7 remediation expansion — coordinator insertion source + +Append the full task records below to engineering-foundation-plan.md, apply gate dependency additions from quality/remediation-map.json, and run the T7 graph validator before marking T7 complete. These records do not approve exceptions or claim implemented fixes. + +## Dependency graph and wave additions + +T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15; T10 → web remediation → overlapping pilot migrations and T25; T13 → native/pilot remediations; T12 + pilot remediations → contract reconciliation → T18/T19; every T7.* → T33. Within these frontiers, depends_on includes each previous writer of the same path. + +| Frontier | Tasks | Resource constraints | +| --- | --- | --- | +| Policy/reviews | Tasks whose only producer is T6/T7/T11 | No production workload; approvals remain pending | +| Dependency | kind=dependency after T8 | One package/install/build writer, then T15 | +| Web | kind=web-fix after T10 | Max three workers; unique focused Jest files, exclusive full lint/build | +| Native/pilot | kind=native-fix/pilot-fix after T13 | Shared server/native operations serialized by runner lease; exact CMake fragments | +| Reconciliation | kind=integration after T12 and all pilot fixes | Exclusive generation, followed by T18/T19 | +| Closure | all T7.* then T33 | Fresh complete scanners; unresolved reviews block | + +### T7.1: Reject unapproved findings and coverage exceptions +- **depends_on**: [T7, T6] +- **agent_type**: local +- **ownership**: `scripts/quality/findings.py`, `tests/quality/test_findings.py`, `quality/findings-policy.json`, `quality/evidence/T7.1.md`. +- **priority**: high +- **description**: Require explicit reviewed approval evidence before an exception can affect --check or --release. The existing proposed-by-T1/T6 dates and maintainers/ owners are proposals, not approvals. Preserve diagnostic reporting and the read-only normal check. Do not silently bless old records during schema migration. +- **findings**: policy/integration requirement +- **acceptance_criteria**: + - Tests first prove proposed, missing, expired and malformed approvals fail; an explicitly approved current exception succeeds only in its permitted mode. + - An approval must name an accountable reviewer/owner, date and reason; placeholders do not qualify. --release still rejects coverage gaps. + - Run against actual T1 reports: unapproved proposals must cause policy failure. Hash the inventory before/after --check. +- **validation**: + - `python3 -m unittest discover -s tests/quality -p test_findings.py` + - `python3 scripts/quality/findings.py --check --reports build/eng-artifacts/T1 --inventory quality/findings.json` +- **status**: Completed (commit `c285a0c2`) +- **log**: Coordinator implemented RED -> GREEN approval enforcement: 65 tests pass; real T1 fails 575 inventory and 4 gap approval proposals; no accepted gaps. Metadata validation does not authenticate a human approval; do not fabricate production approval records. +- **files edited/created**: + +### T7.2: Verify disposition and regression evidence for ADVISORY-GHSA-cv53-mq7p-6jp2 +- **depends_on**: [T7] +- **agent_type**: local +- **ownership**: `quality/reviews/advisory-ghsa-cv53-mq7p-6jp2.json`, `quality/evidence/T7.2.md`. +- **priority**: high +- **description**: Read the source advisory through authorized access; record sanitized affected paths, fixed revision and exact existing regression command without publishing private identifiers or text. Published-version exclusion alone is not regression proof. If a regression or fix is absent, append a bounded child task and add it to T33 before this review can close; inaccessible private evidence leaves this task blocked. +- **findings**: ADVISORY-GHSA-cv53-mq7p-6jp2 +- **acceptance_criteria**: + - Confirm state and affected/current versions at the actual execution date. + - Record reviewer, evidence reference and passing regression, or explicit unresolved blocker; a draft or closed label alone is not a verified fix. + - No private advisory text, IDs or credentials in committed evidence. +- **validation**: + - `python3 -m json.tool quality/reviews/advisory-ghsa-cv53-mq7p-6jp2.json` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.3: Verify disposition and regression evidence for ADVISORY-repo-advisory-draft-1 +- **depends_on**: [T7] +- **agent_type**: local +- **ownership**: `quality/reviews/advisory-repo-advisory-draft-1.json`, `quality/evidence/T7.3.md`. +- **priority**: high +- **description**: Read the source advisory through authorized access; record sanitized affected paths, fixed revision and exact existing regression command without publishing private identifiers or text. Published-version exclusion alone is not regression proof. If a regression or fix is absent, append a bounded child task and add it to T33 before this review can close; inaccessible private evidence leaves this task blocked. +- **findings**: ADVISORY-repo-advisory-draft-1 +- **acceptance_criteria**: + - Confirm state and affected/current versions at the actual execution date. + - Record reviewer, evidence reference and passing regression, or explicit unresolved blocker; a draft or closed label alone is not a verified fix. + - No private advisory text, IDs or credentials in committed evidence. +- **validation**: + - `python3 -m json.tool quality/reviews/advisory-repo-advisory-draft-1.json` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.4: Verify disposition and regression evidence for ADVISORY-repo-advisory-closed-1 +- **depends_on**: [T7] +- **agent_type**: local +- **ownership**: `quality/reviews/advisory-repo-advisory-closed-1.json`, `quality/evidence/T7.4.md`. +- **priority**: high +- **description**: Read the source advisory through authorized access; record sanitized affected paths, fixed revision and exact existing regression command without publishing private identifiers or text. Published-version exclusion alone is not regression proof. If a regression or fix is absent, append a bounded child task and add it to T33 before this review can close; inaccessible private evidence leaves this task blocked. +- **findings**: ADVISORY-repo-advisory-closed-1 +- **acceptance_criteria**: + - Confirm state and affected/current versions at the actual execution date. + - Record reviewer, evidence reference and passing regression, or explicit unresolved blocker; a draft or closed label alone is not a verified fix. + - No private advisory text, IDs or credentials in committed evidence. +- **validation**: + - `python3 -m json.tool quality/reviews/advisory-repo-advisory-closed-1.json` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.5: Verify disposition and regression evidence for ADVISORY-repo-advisory-draft-2 +- **depends_on**: [T7] +- **agent_type**: local +- **ownership**: `quality/reviews/advisory-repo-advisory-draft-2.json`, `quality/evidence/T7.5.md`. +- **priority**: high +- **description**: Read the source advisory through authorized access; record sanitized affected paths, fixed revision and exact existing regression command without publishing private identifiers or text. Published-version exclusion alone is not regression proof. If a regression or fix is absent, append a bounded child task and add it to T33 before this review can close; inaccessible private evidence leaves this task blocked. +- **findings**: ADVISORY-repo-advisory-draft-2 +- **acceptance_criteria**: + - Confirm state and affected/current versions at the actual execution date. + - Record reviewer, evidence reference and passing regression, or explicit unresolved blocker; a draft or closed label alone is not a verified fix. + - No private advisory text, IDs or credentials in committed evidence. +- **validation**: + - `python3 -m json.tool quality/reviews/advisory-repo-advisory-draft-2.json` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.6: Verify disposition and regression evidence for ADVISORY-GHSA-rqj3-pch5-rq4f +- **depends_on**: [T7] +- **agent_type**: local +- **ownership**: `quality/reviews/advisory-ghsa-rqj3-pch5-rq4f.json`, `quality/evidence/T7.6.md`. +- **priority**: critical +- **description**: Read the source advisory through authorized access; record sanitized affected paths, fixed revision and exact existing regression command without publishing private identifiers or text. Published-version exclusion alone is not regression proof. If a regression or fix is absent, append a bounded child task and add it to T33 before this review can close; inaccessible private evidence leaves this task blocked. +- **findings**: ADVISORY-GHSA-rqj3-pch5-rq4f +- **acceptance_criteria**: + - Confirm state and affected/current versions at the actual execution date. + - Record reviewer, evidence reference and passing regression, or explicit unresolved blocker; a draft or closed label alone is not a verified fix. + - No private advisory text, IDs or credentials in committed evidence. +- **validation**: + - `python3 -m json.tool quality/reviews/advisory-ghsa-rqj3-pch5-rq4f.json` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.7: Verify disposition and regression evidence for ADVISORY-GHSA-pvw7-7j8c-qx96 +- **depends_on**: [T7] +- **agent_type**: local +- **ownership**: `quality/reviews/advisory-ghsa-pvw7-7j8c-qx96.json`, `quality/evidence/T7.7.md`. +- **priority**: high +- **description**: Read the source advisory through authorized access; record sanitized affected paths, fixed revision and exact existing regression command without publishing private identifiers or text. Published-version exclusion alone is not regression proof. If a regression or fix is absent, append a bounded child task and add it to T33 before this review can close; inaccessible private evidence leaves this task blocked. +- **findings**: ADVISORY-GHSA-pvw7-7j8c-qx96 +- **acceptance_criteria**: + - Confirm state and affected/current versions at the actual execution date. + - Record reviewer, evidence reference and passing regression, or explicit unresolved blocker; a draft or closed label alone is not a verified fix. + - No private advisory text, IDs or credentials in committed evidence. +- **validation**: + - `python3 -m json.tool quality/reviews/advisory-ghsa-pvw7-7j8c-qx96.json` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.8: Remediate glob dependency advisory GHSA-3g3m-2fjr-6pw4 +- **depends_on**: [T7, T8] +- **agent_type**: local +- **ownership**: `web/package.json`, `web/package-lock.json`, `quality/evidence/T7.8.md`. +- **priority**: medium +- **description**: Resolve GHSA-3g3m-2fjr-6pw4 for glob using an actually available compatible patched transitive version or remove the vulnerable dependency path. Inspect npm explain and production/dev reachability. Preserve Node 24 and installed direct major versions. If no compatible fix exists, submit a specific owner/expiry/rationale proposal and keep this task open until explicitly reviewed; do not force an unrelated major upgrade. +- **findings**: NPM-WEB-GHSA-3g3m-2fjr-6pw4-glob +- **acceptance_criteria**: + - npm audit no longer reports the advisory on each original dependency path, or an explicitly reviewed current exception documents the residual exposure. + - Dependency graph, unit tests and both web builds remain compatible; no broad overrides that violate parent ranges. +- **validation**: + - `npm --prefix web explain glob` + - `npm --prefix web audit --json` + - `npm --prefix web audit --omit=dev --json` + - `npm --prefix web test -- --runInBand` + - `npm --prefix web run build` + - `LIGHTNVR_WEB_LEGACY=false npm --prefix web run build` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.9: Remediate minimatch dependency advisory GHSA-g3hv-75wg-m249 +- **depends_on**: [T7, T8, T7.8] +- **agent_type**: local +- **ownership**: `web/package.json`, `web/package-lock.json`, `package.json`, `package-lock.json`, `quality/evidence/T7.9.md`. +- **priority**: medium +- **description**: Resolve GHSA-g3hv-75wg-m249 for minimatch using an actually available compatible patched transitive version or remove the vulnerable dependency path. Inspect npm explain and production/dev reachability. Preserve Node 24 and installed direct major versions. If no compatible fix exists, submit a specific owner/expiry/rationale proposal and keep this task open until explicitly reviewed; do not force an unrelated major upgrade. +- **findings**: NPM-WEB-GHSA-g3hv-75wg-m249-minimatch + T8 adds the root openapi-typescript/redocly dev path for the same minimatch advisory; root manifests are included and T33 must reconcile the new occurrence without automatic baseline changes. +- **acceptance_criteria**: + - npm audit no longer reports the advisory on each original dependency path, or an explicitly reviewed current exception documents the residual exposure. + - Dependency graph, unit tests and both web builds remain compatible; no broad overrides that violate parent ranges. +- **validation**: + - `npm --prefix web explain minimatch` + - `npm --prefix web audit --json` + - `npm --prefix web audit --omit=dev --json` + - `npm --prefix web test -- --runInBand` + - `npm --prefix web run build` + - `LIGHTNVR_WEB_LEGACY=false npm --prefix web run build` + - `npm explain minimatch` + - `npm audit --json` + - `npm audit --omit=dev --json` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.10: Remediate deepmerge dependency advisory GHSA-gcqx-w48m-w2h4 +- **depends_on**: [T7, T8, T7.9] +- **agent_type**: local +- **ownership**: `web/package.json`, `web/package-lock.json`, `quality/evidence/T7.10.md`. +- **priority**: medium +- **description**: Resolve GHSA-gcqx-w48m-w2h4 for deepmerge using an actually available compatible patched transitive version or remove the vulnerable dependency path. Inspect npm explain and production/dev reachability. Preserve Node 24 and installed direct major versions. If no compatible fix exists, submit a specific owner/expiry/rationale proposal and keep this task open until explicitly reviewed; do not force an unrelated major upgrade. +- **findings**: DEPENDABOT-101, NPM-WEB-GHSA-gcqx-w48m-w2h4-deepmerge +- **acceptance_criteria**: + - npm audit no longer reports the advisory on each original dependency path, or an explicitly reviewed current exception documents the residual exposure. + - Dependency graph, unit tests and both web builds remain compatible; no broad overrides that violate parent ranges. +- **validation**: + - `npm --prefix web explain deepmerge` + - `npm --prefix web audit --json` + - `npm --prefix web audit --omit=dev --json` + - `npm --prefix web test -- --runInBand` + - `npm --prefix web run build` + - `LIGHTNVR_WEB_LEGACY=false npm --prefix web run build` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.11: cpp/cleartext-storage-database in db_event_destinations.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_event_destinations.c`, `tests/unit/test_t7_11.c`, `tests/unit/cmake/eng/t7_11.cmake`, `quality/evidence/T7.11.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-316, CODEQL-307 +- **acceptance_criteria**: + - Trace credential persistence and read access; document existing at-rest security and migration constraints. Test redaction and restricted access. If encryption changes the storage contract, materialize a separate bounded migration task instead of inventing a key-management scheme. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.11 --regex '^test_t7_11$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.11`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.12: cpp/cleartext-storage-database in db_streams.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_streams.c`, `tests/unit/test_t7_12.c`, `tests/unit/cmake/eng/t7_12.cmake`, `quality/evidence/T7.12.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-185, CODEQL-183, CODEQL-181 +- **acceptance_criteria**: + - Trace credential persistence and read access; document existing at-rest security and migration constraints. Test redaction and restricted access. If encryption changes the storage contract, materialize a separate bounded migration task instead of inventing a key-management scheme. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.12 --regex '^test_t7_12$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.12`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.13: cpp/cleartext-storage-file in config.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/core/config.c`, `tests/unit/test_t7_13.c`, `tests/unit/cmake/eng/t7_13.cmake`, `quality/evidence/T7.13.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-267, CODEQL-64, CODEQL-63 +- **acceptance_criteria**: + - Verify file permissions, creation umask, redacted logs and credential read access; preserve compatible config loading. Residual necessary plaintext needs explicit reviewed exposure acceptance. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.13 --regex '^test_t7_13$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.13`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.14: cpp/cleartext-transmission in hls_unified_thread.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/hls/hls_unified_thread.c`, `tests/unit/test_t7_14.c`, `tests/unit/cmake/eng/t7_14.cmake`, `quality/evidence/T7.14.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-264 +- **acceptance_criteria**: + - Assert credential-bearing payloads are not disclosed to an untrusted/insecure destination; verify supported camera transport behavior. Any required legacy cleartext transport needs an explicit reviewed exposure exception. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.14 --regex '^test_t7_14$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.14`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.15: cpp/cleartext-transmission in stream_protocol.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/stream_protocol.c`, `tests/unit/test_t7_15.c`, `tests/unit/cmake/eng/t7_15.cmake`, `quality/evidence/T7.15.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-14 +- **acceptance_criteria**: + - Assert credential-bearing payloads are not disclosed to an untrusted/insecure destination; verify supported camera transport behavior. Any required legacy cleartext transport needs an explicit reviewed exposure exception. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.15 --regex '^test_t7_15$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.15`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.16: cpp/integer-multiplication-cast-to-long in mp4_writer_utils.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/mp4_writer_utils.c`, `tests/unit/test_t7_16.c`, `tests/unit/cmake/eng/t7_16.cmake`, `quality/evidence/T7.16.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-329 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.16 --regex '^test_t7_16$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.16`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.17: cpp/non-https-url in go2rtc_api.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/go2rtc/go2rtc_api.c`, `tests/unit/test_t7_17.c`, `tests/unit/cmake/eng/t7_17.cmake`, `quality/evidence/T7.17.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-78, CODEQL-77, CODEQL-76, CODEQL-75, CODEQL-71, CODEQL-70, CODEQL-69, CODEQL-20, CODEQL-19 +- **acceptance_criteria**: + - Prove endpoint trust and transport policy for each reported URL; retain HTTP-only camera compatibility only with an explicitly reviewed exposure exception. Do not rewrite device endpoints to HTTPS without negotiation/support. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.17 --regex '^test_t7_17$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.17`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.18: cpp/non-https-url in onvif_detection.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/onvif_detection.c`, `tests/unit/test_t7_18.c`, `tests/unit/cmake/eng/t7_18.cmake`, `quality/evidence/T7.18.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-337, CODEQL-336, CODEQL-335, CODEQL-334, CODEQL-272, CODEQL-271, CODEQL-270 +- **acceptance_criteria**: + - Prove endpoint trust and transport policy for each reported URL; retain HTTP-only camera compatibility only with an explicitly reviewed exposure exception. Do not rewrite device endpoints to HTTPS without negotiation/support. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.18 --regex '^test_t7_18$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.18`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.19: cpp/non-https-url in onvif_discovery.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/onvif_discovery.c`, `tests/unit/test_t7_19.c`, `tests/unit/cmake/eng/t7_19.cmake`, `quality/evidence/T7.19.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-59 +- **acceptance_criteria**: + - Prove endpoint trust and transport policy for each reported URL; retain HTTP-only camera compatibility only with an explicitly reviewed exposure exception. Do not rewrite device endpoints to HTTPS without negotiation/support. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.19 --regex '^test_t7_19$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.19`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.20: cpp/non-https-url in api_handlers_ptz.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_ptz.c`, `tests/unit/test_t7_20.c`, `tests/unit/cmake/eng/t7_20.cmake`, `quality/evidence/T7.20.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-73 +- **acceptance_criteria**: + - Prove endpoint trust and transport policy for each reported URL; retain HTTP-only camera compatibility only with an explicitly reviewed exposure exception. Do not rewrite device endpoints to HTTPS without negotiation/support. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.20 --regex '^test_t7_20$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.20`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.21: cpp/path-injection in storage_s3.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/storage/storage_s3.c`, `tests/unit/test_t7_21.c`, `tests/unit/cmake/eng/t7_21.cmake`, `quality/evidence/T7.21.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-325 +- **acceptance_criteria**: + - Reject dot segments, separators and encoded traversal from untrusted names before filesystem access; assert normal names still select the intended file and no outside-tree path is opened. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.21 --regex '^test_t7_21$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.21`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.22: cpp/path-injection in linux_cgroup.c, linux_network.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/telemetry/collectors/linux_cgroup.c`, `src/telemetry/collectors/linux_network.c`, `tests/unit/test_t7_22.c`, `tests/unit/cmake/eng/t7_22.cmake`, `quality/evidence/T7.22.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-320, CODEQL-319, CODEQL-318, CODEQL-317 +- **acceptance_criteria**: + - Reject dot segments, separators and encoded traversal from untrusted names before filesystem access; assert normal names still select the intended file and no outside-tree path is opened. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.22 --regex '^test_t7_22$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.22`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.23: cpp/sql-injection in sqlite_migrate.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/sqlite_migrate.c`, `tests/unit/test_t7_23.c`, `tests/unit/cmake/eng/t7_23.cmake`, `quality/evidence/T7.23.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-67, CODEQL-66 +- **acceptance_criteria**: + - Use quote, semicolon and comment-bearing identifiers in a disposable database; ensure they cannot execute a second statement or alter unrelated schema, while valid migration names still work. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.23 --regex '^test_t7_23$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.23`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.24: cpp/suspicious-pointer-scaling in frame.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_24-upstream.json`, `quality/evidence/T7.24.md`. +- **priority**: high +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CODEQL-330 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_24-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.24`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.25: cpp/toctou-race-condition in db_core.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_core.c`, `tests/unit/test_t7_25.c`, `tests/unit/cmake/eng/t7_25.cmake`, `quality/evidence/T7.25.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-321 +- **acceptance_criteria**: + - Exercise replacement/symlink races between validation and use; operations must hold and use the validated descriptor or reject changed identity, preserving normal success and cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.25 --regex '^test_t7_25$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.25`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.26: cpp/toctou-race-condition in storage_migration.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/storage/storage_migration.c`, `tests/unit/test_t7_26.c`, `tests/unit/cmake/eng/t7_26.cmake`, `quality/evidence/T7.26.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-310 +- **acceptance_criteria**: + - Exercise replacement/symlink races between validation and use; operations must hold and use the validated descriptor or reject changed identity, preserving normal success and cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.26 --regex '^test_t7_26$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.26`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.27: cpp/toctou-race-condition in api_handlers_operator_floor_plans.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_operator_floor_plans.c`, `tests/unit/test_t7_27.c`, `tests/unit/cmake/eng/t7_27.cmake`, `quality/evidence/T7.27.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-315, CODEQL-314, CODEQL-313 +- **acceptance_criteria**: + - Exercise replacement/symlink races between validation and use; operations must hold and use the validated descriptor or reject changed identity, preserving normal success and cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.27 --regex '^test_t7_27$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.27`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.28: cpp/uncontrolled-allocation-size in event_router.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/core/event_router.c`, `tests/unit/test_t7_28.c`, `tests/unit/cmake/eng/t7_28.cmake`, `quality/evidence/T7.28.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-306, CODEQL-305 +- **acceptance_criteria**: + - Exercise zero, maximum accepted, one-past maximum and overflow-sized user inputs; reject before allocation/multiplication, leave state unchanged, and preserve ordinary delivery. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.28 --regex '^test_t7_28$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.28`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.29: cpp/world-writable-file-creation in mqtt_client.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/core/mqtt_client.c`, `tests/unit/test_t7_29.c`, `tests/unit/cmake/eng/t7_29.cmake`, `quality/evidence/T7.29.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-293 +- **acceptance_criteria**: + - Create the credential-bearing file under a permissive umask and assert effective permissions exclude group/other access; retain existing owner and normal reload semantics. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.29 --regex '^test_t7_29$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.29`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.30: arrayIndexOutOfBounds in stream_protocol.c +- **depends_on**: [T7, T13, T7.15] +- **agent_type**: worker +- **ownership**: `src/video/stream_protocol.c`, `tests/unit/test_t7_30.c`, `tests/unit/cmake/eng/t7_30.cmake`, `quality/evidence/T7.30.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-0dfdce44e3f2c522 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.30 --regex '^test_t7_30$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.30`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.31: clang-analyzer-core.CallAndMessage in system_health_policy.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/telemetry/system_health_policy.c`, `tests/unit/test_t7_31.c`, `tests/unit/cmake/eng/t7_31.cmake`, `quality/evidence/T7.31.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-9b21a14b97b3a15e +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.31 --regex '^test_t7_31$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.31`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.32: clang-analyzer-core.DivideZero in db_storage_pools.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_storage_pools.c`, `tests/unit/test_t7_32.c`, `tests/unit/cmake/eng/t7_32.cmake`, `quality/evidence/T7.32.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-b7cb62f9287bca53 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.32 --regex '^test_t7_32$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.32`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.33: clang-analyzer-core.NonNullParamChecker in camera_collection_filter.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/core/camera_collection_filter.c`, `tests/unit/test_t7_33.c`, `tests/unit/cmake/eng/t7_33.cmake`, `quality/evidence/T7.33.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-a918c6008bfe9234 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.33 --regex '^test_t7_33$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.33`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.34: clang-analyzer-core.NonNullParamChecker in db_storage_policies.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_storage_policies.c`, `tests/unit/test_t7_34.c`, `tests/unit/cmake/eng/t7_34.cmake`, `quality/evidence/T7.34.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-a5ab5fe6add78d8e +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.34 --regex '^test_t7_34$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.34`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.35: clang-analyzer-core.NonNullParamChecker in storage_s3.c +- **depends_on**: [T7, T13, T7.21] +- **agent_type**: worker +- **ownership**: `src/storage/storage_s3.c`, `tests/unit/test_t7_35.c`, `tests/unit/cmake/eng/t7_35.cmake`, `quality/evidence/T7.35.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-cb260984bd5750f8 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.35 --regex '^test_t7_35$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.35`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.36: clang-analyzer-core.NullDereference in event_envelope.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/core/event_envelope.c`, `tests/unit/test_t7_36.c`, `tests/unit/cmake/eng/t7_36.cmake`, `quality/evidence/T7.36.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-f240093f03b567fb +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.36 --regex '^test_t7_36$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.36`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.37: clang-analyzer-core.NullDereference in db_live_saved_layouts.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_live_saved_layouts.c`, `tests/unit/test_t7_37.c`, `tests/unit/cmake/eng/t7_37.cmake`, `quality/evidence/T7.37.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-f8203edcc8863cd8 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.37 --regex '^test_t7_37$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.37`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.38: clang-analyzer-core.NullDereference in db_storage_policies.c +- **depends_on**: [T7, T13, T7.34] +- **agent_type**: worker +- **ownership**: `src/database/db_storage_policies.c`, `tests/unit/test_t7_38.c`, `tests/unit/cmake/eng/t7_38.cmake`, `quality/evidence/T7.38.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-179513c629f1ecac +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.38 --regex '^test_t7_38$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.38`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.39: clang-analyzer-core.NullDereference in smartctl_provider.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/telemetry/providers/smartctl_provider.c`, `tests/unit/test_t7_39.c`, `tests/unit/cmake/eng/t7_39.cmake`, `quality/evidence/T7.39.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-33d1c32daba1778e +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.39 --regex '^test_t7_39$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.39`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.40: clang-analyzer-core.NullDereference in go2rtc_api.c +- **depends_on**: [T7, T13, T7.17] +- **agent_type**: worker +- **ownership**: `src/video/go2rtc/go2rtc_api.c`, `tests/unit/test_t7_40.c`, `tests/unit/cmake/eng/t7_40.cmake`, `quality/evidence/T7.40.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-14fc6cb721e4ff46 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.40 --regex '^test_t7_40$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.40`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.41: clang-analyzer-core.NullDereference in hls_writer.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/hls_writer.c`, `tests/unit/test_t7_41.c`, `tests/unit/cmake/eng/t7_41.cmake`, `quality/evidence/T7.41.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-848024a1059f9105, CLANGTIDY-c18dbfa67bfd519e +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.41 --regex '^test_t7_41$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.41`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.42: clang-analyzer-core.NullDereference in api_handlers_authorization.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_authorization.c`, `tests/unit/test_t7_42.c`, `tests/unit/cmake/eng/t7_42.cmake`, `quality/evidence/T7.42.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-3853c804fd823d76, CLANGTIDY-e903e0b58c1ab7fb, CLANGTIDY-7037bcf50d8dd6e1, CLANGTIDY-468c829b1cc867f5, CLANGTIDY-5546a3c4710ffc07, CLANGTIDY-9c42b9e1d1f45117, CLANGTIDY-b45db718e3e94b0d +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.42 --regex '^test_t7_42$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.42`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.43: clang-analyzer-core.NullDereference in api_handlers_fleet.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_fleet.c`, `tests/unit/test_t7_43.c`, `tests/unit/cmake/eng/t7_43.cmake`, `quality/evidence/T7.43.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-dc1d8989b6dc0f0a +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.43 --regex '^test_t7_43$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.43`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.44: clang-analyzer-core.NullDereference in api_handlers_health.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_health.c`, `tests/unit/test_t7_44.c`, `tests/unit/cmake/eng/t7_44.cmake`, `quality/evidence/T7.44.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-18224b07c8f96008 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.44 --regex '^test_t7_44$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.44`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.45: clang-analyzer-core.NullDereference in api_handlers_lpr.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_lpr.c`, `tests/unit/test_t7_45.c`, `tests/unit/cmake/eng/t7_45.cmake`, `quality/evidence/T7.45.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-36ab8111fbec813b, CLANGTIDY-21f4fa94b0f2d17d +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.45 --regex '^test_t7_45$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.45`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.46: clang-analyzer-core.NullDereference in api_handlers_recording_control.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_recording_control.c`, `tests/unit/test_t7_46.c`, `tests/unit/cmake/eng/t7_46.cmake`, `quality/evidence/T7.46.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-e722e2369c13444f +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.46 --regex '^test_t7_46$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.46`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.47: clang-analyzer-core.NullDereference in api_handlers_retention.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_retention.c`, `tests/unit/test_t7_47.c`, `tests/unit/cmake/eng/t7_47.cmake`, `quality/evidence/T7.47.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-67d853afc9b7eefe +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.47 --regex '^test_t7_47$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.47`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.48: clang-analyzer-core.NullDereference in api_handlers_storage_migrations.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_storage_migrations.c`, `tests/unit/test_t7_48.c`, `tests/unit/cmake/eng/t7_48.cmake`, `quality/evidence/T7.48.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-44c26e7cc4f14d25, CLANGTIDY-7f68b57abf95cdae +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.48 --regex '^test_t7_48$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.48`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.49: clang-analyzer-core.NullDereference in api_handlers_streams_get.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_streams_get.c`, `tests/unit/test_t7_49.c`, `tests/unit/cmake/eng/t7_49.cmake`, `quality/evidence/T7.49.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-2b9b559954a51bc7 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.49 --regex '^test_t7_49$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.49`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.50: clang-analyzer-core.NullDereference in api_handlers_streams_modify.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_streams_modify.c`, `tests/unit/test_t7_50.c`, `tests/unit/cmake/eng/t7_50.cmake`, `quality/evidence/T7.50.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-3ac69a72123df761 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.50 --regex '^test_t7_50$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.50`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.51: clang-analyzer-core.NullDereference in api_handlers_system_health.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_system_health.c`, `tests/unit/test_t7_51.c`, `tests/unit/cmake/eng/t7_51.cmake`, `quality/evidence/T7.51.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-2eb8f8220e64672b, CLANGTIDY-8935718b76906f1e, CLANGTIDY-db6d4840afaa43ce, CLANGTIDY-6253a319b7ed3b31 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.51 --regex '^test_t7_51$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.51`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.52: clang-analyzer-core.UndefinedBinaryOperatorResult in path_utils.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/core/path_utils.c`, `tests/unit/test_t7_52.c`, `tests/unit/cmake/eng/t7_52.cmake`, `quality/evidence/T7.52.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-d86514e7015dbd70 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.52 --regex '^test_t7_52$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.52`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.53: clang-analyzer-security.ArrayBound in authorization.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/core/authorization.c`, `tests/unit/test_t7_53.c`, `tests/unit/cmake/eng/t7_53.cmake`, `quality/evidence/T7.53.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-c4536c7eb269c97d, CLANGTIDY-dc57edf3e0b50ae4 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.53 --regex '^test_t7_53$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.53`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.54: clang-analyzer-security.ArrayBound in logger_json.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/core/logger_json.c`, `tests/unit/test_t7_54.c`, `tests/unit/cmake/eng/t7_54.cmake`, `quality/evidence/T7.54.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-ff30996a0be1b3ef +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.54 --regex '^test_t7_54$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.54`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.55: clang-analyzer-security.ArrayBound in main.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/core/main.c`, `tests/unit/test_t7_55.c`, `tests/unit/cmake/eng/t7_55.cmake`, `quality/evidence/T7.55.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-470e897ffa76864e +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.55 --regex '^test_t7_55$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.55`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.56: clang-analyzer-security.ArrayBound in sqlite_migrate.c +- **depends_on**: [T7, T13, T7.23] +- **agent_type**: worker +- **ownership**: `src/database/sqlite_migrate.c`, `tests/unit/test_t7_56.c`, `tests/unit/cmake/eng/t7_56.cmake`, `quality/evidence/T7.56.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-2772ec37ee463512 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.56 --regex '^test_t7_56$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.56`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.57: clang-analyzer-security.ArrayBound in linux_network.c, linux_process.c, linux_restart.c, linux_thermal.c +- **depends_on**: [T7, T13, T7.22] +- **agent_type**: worker +- **ownership**: `src/telemetry/collectors/linux_network.c`, `src/telemetry/collectors/linux_process.c`, `src/telemetry/collectors/linux_restart.c`, `src/telemetry/collectors/linux_thermal.c`, `tests/unit/test_t7_57.c`, `tests/unit/cmake/eng/t7_57.cmake`, `quality/evidence/T7.57.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-9259d0adb44e3ab3, CLANGTIDY-55f597a830e65b4d, CLANGTIDY-eaf20c1f0de62870, CLANGTIDY-c05a923060c50809, CLANGTIDY-30cd36651cb697e6 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.57 --regex '^test_t7_57$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.57`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.58: clang-analyzer-security.ArrayBound in linux_hardware.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/telemetry/providers/linux_hardware.c`, `tests/unit/test_t7_58.c`, `tests/unit/cmake/eng/t7_58.cmake`, `quality/evidence/T7.58.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-29fe00c504db3f7e, CLANGTIDY-93f7df7451e39223 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.58 --regex '^test_t7_58$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.58`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.59: clang-analyzer-security.ArrayBound in system_health.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/telemetry/system_health.c`, `tests/unit/test_t7_59.c`, `tests/unit/cmake/eng/t7_59.cmake`, `quality/evidence/T7.59.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-192595ad5f7437f2 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.59 --regex '^test_t7_59$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.59`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.60: clang-analyzer-security.ArrayBound in go2rtc_process.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/go2rtc/go2rtc_process.c`, `tests/unit/test_t7_60.c`, `tests/unit/cmake/eng/t7_60.cmake`, `quality/evidence/T7.60.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-6eb7be7d5d4be88a +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.60 --regex '^test_t7_60$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.60`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.61: clang-analyzer-security.ArrayBound in hls_cache_cleanup.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/hls/hls_cache_cleanup.c`, `tests/unit/test_t7_61.c`, `tests/unit/cmake/eng/t7_61.cmake`, `quality/evidence/T7.61.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-e88c078f85b44a5e +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.61 --regex '^test_t7_61$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.61`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.62: clang-analyzer-security.ArrayBound in stream_manager.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/stream_manager.c`, `tests/unit/test_t7_62.c`, `tests/unit/cmake/eng/t7_62.cmake`, `quality/evidence/T7.62.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-87fe5c4f9b2c4103 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.62 --regex '^test_t7_62$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.62`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.63: clang-analyzer-security.ArrayBound in api_handlers_fleet.c +- **depends_on**: [T7, T13, T7.43] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_fleet.c`, `tests/unit/test_t7_63.c`, `tests/unit/cmake/eng/t7_63.cmake`, `quality/evidence/T7.63.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-b6500f12e4ee30b7, CLANGTIDY-a01b119b5b6a4463 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.63 --regex '^test_t7_63$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.63`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.64: clang-analyzer-security.ArrayBound in api_handlers_streams_get.c +- **depends_on**: [T7, T13, T7.49] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_streams_get.c`, `tests/unit/test_t7_64.c`, `tests/unit/cmake/eng/t7_64.cmake`, `quality/evidence/T7.64.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-d562d8dbfbb1dcc3, CLANGTIDY-24b2873ab4fb113e +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.64 --regex '^test_t7_64$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.64`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.65: clang-analyzer-security.ArrayBound in api_handlers_system.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_system.c`, `tests/unit/test_t7_65.c`, `tests/unit/cmake/eng/t7_65.cmake`, `quality/evidence/T7.65.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-4f6abbd42f9a1855, CLANGTIDY-c7df8f3cce68c5a4 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.65 --regex '^test_t7_65$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.65`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.66: clang-analyzer-security.insecureAPI.strcpy in recording_transcode.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/recording_transcode.c`, `tests/unit/test_t7_66.c`, `tests/unit/cmake/eng/t7_66.cmake`, `quality/evidence/T7.66.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-d6eef8565b934dd8, CLANGTIDY-4976fee144691228 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.66 --regex '^test_t7_66$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.66`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.67: clang-analyzer-security.insecureAPI.strcpy in api_handlers_go2rtc_proxy.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_go2rtc_proxy.c`, `tests/unit/test_t7_67.c`, `tests/unit/cmake/eng/t7_67.cmake`, `quality/evidence/T7.67.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-4c710ebaa0f3ef18, CLANGTIDY-e7f2b500346b1db4, CLANGTIDY-59d7e244d1294daa, CLANGTIDY-de5c9750f9e973f2 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.67 --regex '^test_t7_67$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.67`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.68: clang-analyzer-unix.BlockInCriticalSection in health_helper_runner.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/telemetry/health_helper_runner.c`, `tests/unit/test_t7_68.c`, `tests/unit/cmake/eng/t7_68.cmake`, `quality/evidence/T7.68.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-8a0289975bb00ddb +- **acceptance_criteria**: + - Exercise the blocking operation and concurrent shutdown/contending thread with bounded deadlines; assert no lock is held across unbounded I/O and lock-protected invariants remain intact. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.68 --regex '^test_t7_68$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.68`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.69: clang-analyzer-unix.BlockInCriticalSection in hls_unified_thread.c +- **depends_on**: [T7, T13, T7.14] +- **agent_type**: worker +- **ownership**: `src/video/hls/hls_unified_thread.c`, `tests/unit/test_t7_69.c`, `tests/unit/cmake/eng/t7_69.cmake`, `quality/evidence/T7.69.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-1728287dd1cfa5a4 +- **acceptance_criteria**: + - Exercise the blocking operation and concurrent shutdown/contending thread with bounded deadlines; assert no lock is held across unbounded I/O and lock-protected invariants remain intact. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.69 --regex '^test_t7_69$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.69`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.70: clang-analyzer-unix.Errno in storage_migration.c +- **depends_on**: [T7, T13, T7.26] +- **agent_type**: worker +- **ownership**: `src/storage/storage_migration.c`, `tests/unit/test_t7_70.c`, `tests/unit/cmake/eng/t7_70.cmake`, `quality/evidence/T7.70.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-f15ef4cfb6675401, CLANGTIDY-d8903761e409b32d +- **acceptance_criteria**: + - Inject failing and successful calls with stale errno; branch only on actual call failure and preserve the original error before cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.70 --regex '^test_t7_70$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.70`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.71: clang-analyzer-unix.StdCLibraryFunctions in hls_cache_cleanup.c +- **depends_on**: [T7, T13, T7.61] +- **agent_type**: worker +- **ownership**: `src/video/hls/hls_cache_cleanup.c`, `tests/unit/test_t7_71.c`, `tests/unit/cmake/eng/t7_71.cmake`, `quality/evidence/T7.71.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-f70e12d3b12447f9, CLANGTIDY-81dd4bf2eb1bd4a8 +- **acceptance_criteria**: + - Exercise every reported format/library call with boundary values; argument types/counts, buffer extents and returned errors must match the library contract with no UB. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.71 --regex '^test_t7_71$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.71`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.72: clang-analyzer-unix.Stream in linux_network.c +- **depends_on**: [T7, T13, T7.57] +- **agent_type**: worker +- **ownership**: `src/telemetry/collectors/linux_network.c`, `tests/unit/test_t7_72.c`, `tests/unit/cmake/eng/t7_72.cmake`, `quality/evidence/T7.72.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-b38fd5e59ea07d0e, CLANGTIDY-ebeb3bd843bc6421 +- **acceptance_criteria**: + - Inject each allocation/open and downstream failure at the reported site; assert allocations, FILE handles and descriptors return to baseline on every exit and successful ownership transfers remain valid. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.72 --regex '^test_t7_72$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.72`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.73: integerOverflow in config.c +- **depends_on**: [T7, T13, T7.13] +- **agent_type**: worker +- **ownership**: `src/core/config.c`, `tests/unit/test_t7_73.c`, `tests/unit/cmake/eng/t7_73.cmake`, `quality/evidence/T7.73.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-a8a2fee09e04d7a2 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.73 --regex '^test_t7_73$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.73`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.74: memleak in sod_img_writer.h +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_74-upstream.json`, `quality/evidence/T7.74.md`. +- **priority**: medium +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-582ed0e8d5a10fc1 +- **acceptance_criteria**: + - Inject each allocation/open and downstream failure at the reported site; assert allocations, FILE handles and descriptors return to baseline on every exit and successful ownership transfers remain valid. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_74-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.74`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.75: memleak in sod.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_75-upstream.json`, `quality/evidence/T7.75.md`. +- **priority**: medium +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-d14ab8cc9d321477, CPPCHECK-7bc58272fe78e01c, CPPCHECK-d1406d76ca075628, CPPCHECK-187d49bac01afe0b, CPPCHECK-01d35c4f8b07a420, CPPCHECK-7ed0f3ac85abfc0f, CPPCHECK-afd0bb6171ab9102, CPPCHECK-6c275f8832cf9762, CPPCHECK-340c5f9dec875049, CPPCHECK-94d7d3c523b01523, CPPCHECK-65f97e38c1e1c5df, CPPCHECK-377feb103d4c3b66 +- **acceptance_criteria**: + - Inject each allocation/open and downstream failure at the reported site; assert allocations, FILE handles and descriptors return to baseline on every exit and successful ownership transfers remain valid. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_75-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.75`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.76: preprocessorErrorDirective in nvme_provider.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/telemetry/providers/nvme_provider.c`, `tests/unit/test_t7_76.c`, `tests/unit/cmake/eng/t7_76.cmake`, `quality/evidence/T7.76.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-1c7b293c20ba8b3d +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.76 --regex '^test_t7_76$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.76`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.77: preprocessorErrorDirective in mp4_writer_utils.c +- **depends_on**: [T7, T13, T7.16] +- **agent_type**: worker +- **ownership**: `src/video/mp4_writer_utils.c`, `tests/unit/test_t7_77.c`, `tests/unit/cmake/eng/t7_77.cmake`, `quality/evidence/T7.77.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-1afeb1315d85ff61 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.77 --regex '^test_t7_77$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.77`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.78: arrayIndexOutOfBoundsCond in stream_protocol.c +- **depends_on**: [T7, T13, T7.30] +- **agent_type**: worker +- **ownership**: `src/video/stream_protocol.c`, `tests/unit/test_t7_78.c`, `tests/unit/cmake/eng/t7_78.cmake`, `quality/evidence/T7.78.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-1d3bfb4e5fc184fe +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.78 --regex '^test_t7_78$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.78`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.79: bugprone-assignment-in-if-condition in db_system_health_incidents.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_system_health_incidents.c`, `tests/unit/test_t7_79.c`, `tests/unit/cmake/eng/t7_79.cmake`, `quality/evidence/T7.79.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-808f26556ac98110, CLANGTIDY-7e1ce15fe947a21d +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.79 --regex '^test_t7_79$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.79`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.80: bugprone-assignment-in-if-condition in api_detection.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/api_detection.c`, `tests/unit/test_t7_80.c`, `tests/unit/cmake/eng/t7_80.cmake`, `quality/evidence/T7.80.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-c34509f97f5eb3bf, CLANGTIDY-6ac00b1420332d40, CLANGTIDY-1848d1ca57216f44, CLANGTIDY-be52eb80a1a9b4e2 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.80 --regex '^test_t7_80$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.80`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.81: bugprone-assignment-in-if-condition in api_handlers_metrics.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_metrics.c`, `tests/unit/test_t7_81.c`, `tests/unit/cmake/eng/t7_81.cmake`, `quality/evidence/T7.81.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-02365646d53a2c50, CLANGTIDY-a219d74f760de10e, CLANGTIDY-96f8eef93ec11127, CLANGTIDY-221d97bd8b8ca157, CLANGTIDY-b6b7c0de32a0c6b7, CLANGTIDY-4edbb01e2c9075ed, CLANGTIDY-ec9cd5d6ab7a3d6e, CLANGTIDY-2f30db61a3888f56 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.81 --regex '^test_t7_81$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.81`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.82: bugprone-assignment-in-if-condition in go2rtc_websocket.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/go2rtc_websocket.c`, `tests/unit/test_t7_82.c`, `tests/unit/cmake/eng/t7_82.cmake`, `quality/evidence/T7.82.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-82315a3f137f4aff +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.82 --regex '^test_t7_82$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.82`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.83: bugprone-branch-clone in linux_cgroup.c +- **depends_on**: [T7, T13, T7.22] +- **agent_type**: worker +- **ownership**: `src/telemetry/collectors/linux_cgroup.c`, `tests/unit/test_t7_83.c`, `tests/unit/cmake/eng/t7_83.cmake`, `quality/evidence/T7.83.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-eac1097bd3780c16 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.83 --regex '^test_t7_83$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.83`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.84: bugprone-branch-clone in api_handlers_authorization.c +- **depends_on**: [T7, T13, T7.42] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_authorization.c`, `tests/unit/test_t7_84.c`, `tests/unit/cmake/eng/t7_84.cmake`, `quality/evidence/T7.84.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-a03bd79d6040e625 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.84 --regex '^test_t7_84$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.84`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.85: bugprone-branch-clone in api_handlers_timeline.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_timeline.c`, `tests/unit/test_t7_85.c`, `tests/unit/cmake/eng/t7_85.cmake`, `quality/evidence/T7.85.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-f1f70f55c95dfbaf +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.85 --regex '^test_t7_85$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.85`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.86: bugprone-branch-clone in audit_log.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/audit_log.c`, `tests/unit/test_t7_86.c`, `tests/unit/cmake/eng/t7_86.cmake`, `quality/evidence/T7.86.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-5bdf00371aedee4a +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.86 --regex '^test_t7_86$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.86`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.87: bugprone-branch-clone in thumbnail_thread.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/thumbnail_thread.c`, `tests/unit/test_t7_87.c`, `tests/unit/cmake/eng/t7_87.cmake`, `quality/evidence/T7.87.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-ccff9a5b097b862e +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.87 --regex '^test_t7_87$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.87`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.88: bugprone-implicit-widening-of-multiplication-result in event_bus.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/core/event_bus.c`, `tests/unit/test_t7_88.c`, `tests/unit/cmake/eng/t7_88.cmake`, `quality/evidence/T7.88.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-73322317a31f8bcc, CLANGTIDY-dbe8bf00e4b146ee +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.88 --regex '^test_t7_88$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.88`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.89: bugprone-implicit-widening-of-multiplication-result in event_envelope.c +- **depends_on**: [T7, T13, T7.36] +- **agent_type**: worker +- **ownership**: `src/core/event_envelope.c`, `tests/unit/test_t7_89.c`, `tests/unit/cmake/eng/t7_89.cmake`, `quality/evidence/T7.89.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-2fcad01867c4b146, CLANGTIDY-51ab98673b990b2c, CLANGTIDY-a48d8d980b8dbfcc +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.89 --regex '^test_t7_89$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.89`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.90: bugprone-implicit-widening-of-multiplication-result in event_router.c +- **depends_on**: [T7, T13, T7.28] +- **agent_type**: worker +- **ownership**: `src/core/event_router.c`, `tests/unit/test_t7_90.c`, `tests/unit/cmake/eng/t7_90.cmake`, `quality/evidence/T7.90.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-767515747827ef14 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.90 --regex '^test_t7_90$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.90`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.91: bugprone-implicit-widening-of-multiplication-result in mqtt_delivery_worker.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/core/mqtt_delivery_worker.c`, `tests/unit/test_t7_91.c`, `tests/unit/cmake/eng/t7_91.cmake`, `quality/evidence/T7.91.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-ced78137a6871fda +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.91 --regex '^test_t7_91$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.91`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.92: bugprone-implicit-widening-of-multiplication-result in db_operator_floor_plans.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_operator_floor_plans.c`, `tests/unit/test_t7_92.c`, `tests/unit/cmake/eng/t7_92.cmake`, `quality/evidence/T7.92.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-4ce72e7a43d0bcce +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.92 --regex '^test_t7_92$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.92`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.93: bugprone-implicit-widening-of-multiplication-result in storage_migration.c +- **depends_on**: [T7, T13, T7.70] +- **agent_type**: worker +- **ownership**: `src/storage/storage_migration.c`, `tests/unit/test_t7_93.c`, `tests/unit/cmake/eng/t7_93.cmake`, `quality/evidence/T7.93.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-50703d3018f9bed5, CLANGTIDY-15fa53ad8b574808, CLANGTIDY-e5960a2d15356c27, CLANGTIDY-1fac122c6010eb36 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.93 --regex '^test_t7_93$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.93`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.94: bugprone-implicit-widening-of-multiplication-result in storage_s3.c +- **depends_on**: [T7, T13, T7.35] +- **agent_type**: worker +- **ownership**: `src/storage/storage_s3.c`, `tests/unit/test_t7_94.c`, `tests/unit/cmake/eng/t7_94.cmake`, `quality/evidence/T7.94.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-612c846365824225, CLANGTIDY-1e0ea76108754cd5, CLANGTIDY-ab4dc4b3768799ca, CLANGTIDY-14f55668eaa243b0, CLANGTIDY-fbf040917d8b6cf7, CLANGTIDY-52dada64b4a6e625, CLANGTIDY-d1d1cf8dcb7070f8, CLANGTIDY-bfb7d2825452ce0c, CLANGTIDY-842c6bb171a64e75, CLANGTIDY-4a2a60d787933d7d, CLANGTIDY-a145bd05b0189193, CLANGTIDY-f72760acc6c09e16, CLANGTIDY-0866b8e57f533141, CLANGTIDY-d08422316656b39c, CLANGTIDY-d7c0ab1bf29a42a3 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.94 --regex '^test_t7_94$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.94`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.95: bugprone-implicit-widening-of-multiplication-result in linux_network.c, linux_process.c, linux_thermal.c +- **depends_on**: [T7, T13, T7.72, T7.57] +- **agent_type**: worker +- **ownership**: `src/telemetry/collectors/linux_network.c`, `src/telemetry/collectors/linux_process.c`, `src/telemetry/collectors/linux_thermal.c`, `tests/unit/test_t7_95.c`, `tests/unit/cmake/eng/t7_95.cmake`, `quality/evidence/T7.95.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-8d33cee7806f5d43, CLANGTIDY-02b18b5e0f4e3b93, CLANGTIDY-b84c577b6e369ac3, CLANGTIDY-8b66085f0250d8e1, CLANGTIDY-15838d8765a7623e, CLANGTIDY-df8a271dac7dc00c +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.95 --regex '^test_t7_95$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.95`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.96: bugprone-implicit-widening-of-multiplication-result in ffmpeg_rss_guard.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/tools/ffmpeg_rss_guard.c`, `tests/unit/test_t7_96.c`, `tests/unit/cmake/eng/t7_96.cmake`, `quality/evidence/T7.96.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-802a0570e39a96a6, CLANGTIDY-a072eb98578bd9cf +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.96 --regex '^test_t7_96$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.96`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.97: bugprone-implicit-widening-of-multiplication-result in lpr_crypto.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/utils/lpr_crypto.c`, `tests/unit/test_t7_97.c`, `tests/unit/cmake/eng/t7_97.cmake`, `quality/evidence/T7.97.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-576d7acbaee5cef6 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.97 --regex '^test_t7_97$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.97`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.98: bugprone-implicit-widening-of-multiplication-result in go2rtc_api.c, go2rtc_consumer.c, go2rtc_integration.c, go2rtc_snapshot.c, go2rtc_stream.c +- **depends_on**: [T7, T13, T7.40] +- **agent_type**: worker +- **ownership**: `src/video/go2rtc/go2rtc_api.c`, `src/video/go2rtc/go2rtc_consumer.c`, `src/video/go2rtc/go2rtc_integration.c`, `src/video/go2rtc/go2rtc_snapshot.c`, `src/video/go2rtc/go2rtc_stream.c`, `tests/unit/test_t7_98.c`, `tests/unit/cmake/eng/t7_98.cmake`, `quality/evidence/T7.98.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-eadc49a35e808a77, CLANGTIDY-bdcbae59a275ce50, CLANGTIDY-5582e7df3dd25730, CLANGTIDY-23826be3117b0a5e, CLANGTIDY-cac166160ef5ab94, CLANGTIDY-6eced00c619f459a, CLANGTIDY-a35257b195053d18, CLANGTIDY-9fbcc527095ebbbb, CLANGTIDY-c263543788ddaa36, CLANGTIDY-d06458b2bdfca56d, CLANGTIDY-1592d34d4e3dc54c, CLANGTIDY-957e3e8e5e143726, CLANGTIDY-76ebb6a603073b54, CLANGTIDY-2c1116134a2ee5a3, CLANGTIDY-0ce2e7833fc885fd, CLANGTIDY-4e94aa9ff957dec6, CLANGTIDY-f6ddc3b14e23e020 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.98 --regex '^test_t7_98$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.98`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.99: bugprone-implicit-widening-of-multiplication-result in mp4_writer_utils.c +- **depends_on**: [T7, T13, T7.77] +- **agent_type**: worker +- **ownership**: `src/video/mp4_writer_utils.c`, `tests/unit/test_t7_99.c`, `tests/unit/cmake/eng/t7_99.cmake`, `quality/evidence/T7.99.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-a19387fbb98806ae +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.99 --regex '^test_t7_99$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.99`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.100: bugprone-implicit-widening-of-multiplication-result in onvif_detection.c +- **depends_on**: [T7, T13, T7.18] +- **agent_type**: worker +- **ownership**: `src/video/onvif_detection.c`, `tests/unit/test_t7_100.c`, `tests/unit/cmake/eng/t7_100.cmake`, `quality/evidence/T7.100.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-18362aef7fade326, CLANGTIDY-eade1f2d38582a47, CLANGTIDY-8b074e54e83681ff +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.100 --regex '^test_t7_100$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.100`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.101: bugprone-implicit-widening-of-multiplication-result in onvif_event.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/onvif_event.c`, `tests/unit/test_t7_101.c`, `tests/unit/cmake/eng/t7_101.cmake`, `quality/evidence/T7.101.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-eb4e649dccdb530f +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.101 --regex '^test_t7_101$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.101`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.102: bugprone-implicit-widening-of-multiplication-result in api_handlers_investigations.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_investigations.c`, `tests/unit/test_t7_102.c`, `tests/unit/cmake/eng/t7_102.cmake`, `quality/evidence/T7.102.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-6829e02764d9d278, CLANGTIDY-113735d7300e4f01, CLANGTIDY-25b00beae5a3f4a8, CLANGTIDY-2387b22f15e219d3 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.102 --regex '^test_t7_102$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.102`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.103: bugprone-implicit-widening-of-multiplication-result in api_handlers_lpr.c +- **depends_on**: [T7, T13, T7.45] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_lpr.c`, `tests/unit/test_t7_103.c`, `tests/unit/cmake/eng/t7_103.cmake`, `quality/evidence/T7.103.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-0818b8d62b6628c5 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.103 --regex '^test_t7_103$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.103`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.104: bugprone-implicit-widening-of-multiplication-result in api_handlers_operator_floor_plans.c +- **depends_on**: [T7, T13, T7.27] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_operator_floor_plans.c`, `tests/unit/test_t7_104.c`, `tests/unit/cmake/eng/t7_104.cmake`, `quality/evidence/T7.104.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-53e88d8983baf290, CLANGTIDY-dbd6a5de3a7e191c +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.104 --regex '^test_t7_104$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.104`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.105: bugprone-implicit-widening-of-multiplication-result in api_handlers_storage.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_storage.c`, `tests/unit/test_t7_105.c`, `tests/unit/cmake/eng/t7_105.cmake`, `quality/evidence/T7.105.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-88f84938e1b8feb0 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.105 --regex '^test_t7_105$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.105`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.106: bugprone-implicit-widening-of-multiplication-result in api_handlers_system_go2rtc.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_system_go2rtc.c`, `tests/unit/test_t7_106.c`, `tests/unit/cmake/eng/t7_106.cmake`, `quality/evidence/T7.106.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-101a7d6e0cfda715, CLANGTIDY-c586f58fa85c527e +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.106 --regex '^test_t7_106$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.106`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.107: bugprone-implicit-widening-of-multiplication-result in api_handlers_timeline.c +- **depends_on**: [T7, T13, T7.85] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_timeline.c`, `tests/unit/test_t7_107.c`, `tests/unit/cmake/eng/t7_107.cmake`, `quality/evidence/T7.107.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-18895086ef6f0ed9 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.107 --regex '^test_t7_107$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.107`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.108: bugprone-implicit-widening-of-multiplication-result in go2rtc_websocket.c +- **depends_on**: [T7, T13, T7.82] +- **agent_type**: worker +- **ownership**: `src/web/go2rtc_websocket.c`, `tests/unit/test_t7_108.c`, `tests/unit/cmake/eng/t7_108.cmake`, `quality/evidence/T7.108.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-6e45cad03ed5a9f3 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.108 --regex '^test_t7_108$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.108`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.109: bugprone-implicit-widening-of-multiplication-result in recording_archive.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/recording_archive.c`, `tests/unit/test_t7_109.c`, `tests/unit/cmake/eng/t7_109.cmake`, `quality/evidence/T7.109.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-5bcac8af8164c1b0, CLANGTIDY-e2b358165654b79e +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.109 --regex '^test_t7_109$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.109`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.110: bugprone-inc-dec-in-conditions in storage_source.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/storage/storage_source.c`, `tests/unit/test_t7_110.c`, `tests/unit/cmake/eng/t7_110.cmake`, `quality/evidence/T7.110.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-9613b39c2e0a1e4c +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.110 --regex '^test_t7_110$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.110`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.111: bugprone-macro-parentheses in cJSON.h +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_111-upstream.json`, `quality/evidence/T7.111.md`. +- **priority**: low +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CLANGTIDY-5f6ae30cde3aaf3d, CLANGTIDY-bc48f96894493869, CLANGTIDY-01e4c541adfa23e3, CLANGTIDY-3abdad2ed8a71fe5, CLANGTIDY-09829500c354c2b5, CLANGTIDY-661c1d9d010f4873, CLANGTIDY-f69ef126d8e55b2b, CLANGTIDY-6d1385324d08479d +- **acceptance_criteria**: + - Compile/evaluate precedence-sensitive macro arguments and side effects; results must match the intended fully parenthesized expression without double evaluation. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_111-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.111`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.112: bugprone-macro-parentheses in api_detection.c +- **depends_on**: [T7, T13, T7.80] +- **agent_type**: worker +- **ownership**: `src/video/api_detection.c`, `tests/unit/test_t7_112.c`, `tests/unit/cmake/eng/t7_112.cmake`, `quality/evidence/T7.112.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-ae25a6959341dd10 +- **acceptance_criteria**: + - Compile/evaluate precedence-sensitive macro arguments and side effects; results must match the intended fully parenthesized expression without double evaluation. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.112 --regex '^test_t7_112$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.112`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.113: bugprone-misplaced-widening-cast in db_fleet_query.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_fleet_query.c`, `tests/unit/test_t7_113.c`, `tests/unit/cmake/eng/t7_113.cmake`, `quality/evidence/T7.113.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-7bff304a77769e6c +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.113 --regex '^test_t7_113$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.113`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.114: bugprone-multi-level-implicit-pointer-conversion in authorization.c +- **depends_on**: [T7, T13, T7.53] +- **agent_type**: worker +- **ownership**: `src/core/authorization.c`, `tests/unit/test_t7_114.c`, `tests/unit/cmake/eng/t7_114.cmake`, `quality/evidence/T7.114.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-4505cfde8bb2e42a, CLANGTIDY-ff0e443bb0b29339 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.114 --regex '^test_t7_114$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.114`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.115: bugprone-multi-level-implicit-pointer-conversion in camera_collection_filter.c +- **depends_on**: [T7, T13, T7.33] +- **agent_type**: worker +- **ownership**: `src/core/camera_collection_filter.c`, `tests/unit/test_t7_115.c`, `tests/unit/cmake/eng/t7_115.cmake`, `quality/evidence/T7.115.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-3a7569f24a5603a4, CLANGTIDY-54a9eba3b05f0872, CLANGTIDY-a221992baafec96f +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.115 --regex '^test_t7_115$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.115`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.116: bugprone-multi-level-implicit-pointer-conversion in camera_selector.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/core/camera_selector.c`, `tests/unit/test_t7_116.c`, `tests/unit/cmake/eng/t7_116.cmake`, `quality/evidence/T7.116.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-8e1debc0e42f328a, CLANGTIDY-1fb6fbd990b73e55, CLANGTIDY-52e7ee5b7b20725e, CLANGTIDY-a816d3388754e9a3, CLANGTIDY-bdf2049affa5a3fd, CLANGTIDY-946781b07a8a19f6 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.116 --regex '^test_t7_116$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.116`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.117: bugprone-multi-level-implicit-pointer-conversion in db_storage_lifecycle.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_storage_lifecycle.c`, `tests/unit/test_t7_117.c`, `tests/unit/cmake/eng/t7_117.cmake`, `quality/evidence/T7.117.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-39f0ad6017069f02, CLANGTIDY-c666354bdbc1df4b, CLANGTIDY-c8b906651c5b2c7f, CLANGTIDY-8a2d068dc3e8b0c0, CLANGTIDY-ad7afdbd70ca0a46 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.117 --regex '^test_t7_117$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.117`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.118: bugprone-multi-level-implicit-pointer-conversion in hls_cache_cleanup.c +- **depends_on**: [T7, T13, T7.71] +- **agent_type**: worker +- **ownership**: `src/video/hls/hls_cache_cleanup.c`, `tests/unit/test_t7_118.c`, `tests/unit/cmake/eng/t7_118.cmake`, `quality/evidence/T7.118.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-48d30c8fb35cc9cd, CLANGTIDY-1634947d8289644f, CLANGTIDY-cb9a5afe872113f7, CLANGTIDY-098d117140abdf3a, CLANGTIDY-a89af13dd80ae187 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.118 --regex '^test_t7_118$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.118`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.119: bugprone-multi-level-implicit-pointer-conversion in mp4_segment_recorder.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/mp4_segment_recorder.c`, `tests/unit/test_t7_119.c`, `tests/unit/cmake/eng/t7_119.cmake`, `quality/evidence/T7.119.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-30c3f7edea8fbd8d +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.119 --regex '^test_t7_119$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.119`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.120: bugprone-multi-level-implicit-pointer-conversion in mp4_writer_core.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/mp4_writer_core.c`, `tests/unit/test_t7_120.c`, `tests/unit/cmake/eng/t7_120.cmake`, `quality/evidence/T7.120.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-d421e791a6b63cc9 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.120 --regex '^test_t7_120$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.120`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.121: bugprone-multi-level-implicit-pointer-conversion in mp4_writer_utils.c +- **depends_on**: [T7, T13, T7.99] +- **agent_type**: worker +- **ownership**: `src/video/mp4_writer_utils.c`, `tests/unit/test_t7_121.c`, `tests/unit/cmake/eng/t7_121.cmake`, `quality/evidence/T7.121.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-c536433a0089e4b9, CLANGTIDY-4e34d6b524364f03 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.121 --regex '^test_t7_121$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.121`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.122: bugprone-multi-level-implicit-pointer-conversion in unified_detection_thread.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/unified_detection_thread.c`, `tests/unit/test_t7_122.c`, `tests/unit/cmake/eng/t7_122.cmake`, `quality/evidence/T7.122.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-5dc4623d12ccf5b2 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.122 --regex '^test_t7_122$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.122`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.123: bugprone-multi-level-implicit-pointer-conversion in api_handlers_camera_collections.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_camera_collections.c`, `tests/unit/test_t7_123.c`, `tests/unit/cmake/eng/t7_123.cmake`, `quality/evidence/T7.123.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-1f9c86e17ca383f9, CLANGTIDY-316e32d23b15b780, CLANGTIDY-7464eb7864628fd1, CLANGTIDY-5e2b3b364d163173, CLANGTIDY-81fbfb962103b645, CLANGTIDY-c41e983019497e88, CLANGTIDY-308b0349ef001b56, CLANGTIDY-7a3f68ca1e19c9db, CLANGTIDY-475d0f82a4e9b764, CLANGTIDY-2276a7bff678cf41, CLANGTIDY-63c736995704d2d6, CLANGTIDY-f5ac788b77f1417a, CLANGTIDY-ae6a96ea4d41087d, CLANGTIDY-f617ccfb4cfc3cc2, CLANGTIDY-169001b0559c7bcb, CLANGTIDY-6bce10f282924906 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.123 --regex '^test_t7_123$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.123`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.124: bugprone-multi-level-implicit-pointer-conversion in api_handlers_fleet.c +- **depends_on**: [T7, T13, T7.63] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_fleet.c`, `tests/unit/test_t7_124.c`, `tests/unit/cmake/eng/t7_124.cmake`, `quality/evidence/T7.124.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-0b0bcefaf7a0b24f, CLANGTIDY-d8c6998c9398adf1, CLANGTIDY-79ebe40a23b7323a, CLANGTIDY-6da59a8629d16699, CLANGTIDY-773e04e041de5410, CLANGTIDY-f12d6e4a615966e9, CLANGTIDY-ede4da279d79ec69, CLANGTIDY-36c8164a04c2420c, CLANGTIDY-4053884d5188ab2f +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.124 --regex '^test_t7_124$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.124`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.125: bugprone-multi-level-implicit-pointer-conversion in api_handlers_retention.c +- **depends_on**: [T7, T13, T7.47] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_retention.c`, `tests/unit/test_t7_125.c`, `tests/unit/cmake/eng/t7_125.cmake`, `quality/evidence/T7.125.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-0cc9a9ea64babfdc, CLANGTIDY-234cb88ea5651731 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.125 --regex '^test_t7_125$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.125`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.126: bugprone-multi-level-implicit-pointer-conversion in api_handlers_storage_policies.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_storage_policies.c`, `tests/unit/test_t7_126.c`, `tests/unit/cmake/eng/t7_126.cmake`, `quality/evidence/T7.126.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-312e6eafc5ebdca6, CLANGTIDY-1985156ff8e5c87d, CLANGTIDY-ca7e963b9f3e3214, CLANGTIDY-aede9d1024b66426, CLANGTIDY-07c63776b48ad48f, CLANGTIDY-ea16598ca26b9108 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.126 --regex '^test_t7_126$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.126`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.127: bugprone-narrowing-conversions in api_timing.h +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `include/web/api_timing.h`, `tests/unit/test_t7_127.c`, `tests/unit/cmake/eng/t7_127.cmake`, `quality/evidence/T7.127.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-ca2f4806dea5f177, CLANGTIDY-054f4f2a2583f814 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.127 --regex '^test_t7_127$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.127`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.128: bugprone-narrowing-conversions in path_utils.c +- **depends_on**: [T7, T13, T7.52] +- **agent_type**: worker +- **ownership**: `src/core/path_utils.c`, `tests/unit/test_t7_128.c`, `tests/unit/cmake/eng/t7_128.cmake`, `quality/evidence/T7.128.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-dda225859c807d72 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.128 --regex '^test_t7_128$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.128`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.129: bugprone-narrowing-conversions in db_storage_lifecycle.c +- **depends_on**: [T7, T13, T7.117] +- **agent_type**: worker +- **ownership**: `src/database/db_storage_lifecycle.c`, `tests/unit/test_t7_129.c`, `tests/unit/cmake/eng/t7_129.cmake`, `quality/evidence/T7.129.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-76e54a4e3ac5efb3, CLANGTIDY-84fbbd387f95947a +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.129 --regex '^test_t7_129$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.129`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.130: bugprone-narrowing-conversions in mp4_writer_utils.c +- **depends_on**: [T7, T13, T7.121] +- **agent_type**: worker +- **ownership**: `src/video/mp4_writer_utils.c`, `tests/unit/test_t7_130.c`, `tests/unit/cmake/eng/t7_130.cmake`, `quality/evidence/T7.130.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-c74d7d04edeb4ee2, CLANGTIDY-cb47dbd2bd0937a1, CLANGTIDY-6f7bee0a60d5152f +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.130 --regex '^test_t7_130$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.130`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.131: bugprone-narrowing-conversions in stream_frame_rate.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/stream_frame_rate.c`, `tests/unit/test_t7_131.c`, `tests/unit/cmake/eng/t7_131.cmake`, `quality/evidence/T7.131.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-e1b115ce18cb0926, CLANGTIDY-9bb912a1e3d2bf88 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.131 --regex '^test_t7_131$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.131`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.132: bugprone-narrowing-conversions in api_handlers_storage_compliance.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_storage_compliance.c`, `tests/unit/test_t7_132.c`, `tests/unit/cmake/eng/t7_132.cmake`, `quality/evidence/T7.132.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-6a756d858b2a4590, CLANGTIDY-0f6724ca27b42ed9, CLANGTIDY-ec3e72154d735330, CLANGTIDY-e85c88c08460d2ef, CLANGTIDY-9c90ce2f531301e0, CLANGTIDY-3e6ff569aac7699e, CLANGTIDY-ca4b8a2f2a2f60bf, CLANGTIDY-c990523bb862f2b6, CLANGTIDY-7a5a584e25342a04, CLANGTIDY-8d9dd908cb4d8452 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.132 --regex '^test_t7_132$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.132`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.133: bugprone-narrowing-conversions in httpd_utils.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/httpd_utils.c`, `tests/unit/test_t7_133.c`, `tests/unit/cmake/eng/t7_133.cmake`, `quality/evidence/T7.133.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-cb7511d8b0a3b651 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.133 --regex '^test_t7_133$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.133`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.134: bugprone-not-null-terminated-result in mqtt_destination_client.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/core/mqtt_destination_client.c`, `tests/unit/test_t7_134.c`, `tests/unit/cmake/eng/t7_134.cmake`, `quality/evidence/T7.134.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-d7edea27d80824ed +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.134 --regex '^test_t7_134$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.134`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.135: bugprone-not-null-terminated-result in linux_hardware.c +- **depends_on**: [T7, T13, T7.58] +- **agent_type**: worker +- **ownership**: `src/telemetry/providers/linux_hardware.c`, `tests/unit/test_t7_135.c`, `tests/unit/cmake/eng/t7_135.cmake`, `quality/evidence/T7.135.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-65ab86fae5fd2213 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.135 --regex '^test_t7_135$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.135`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.136: bugprone-suspicious-string-compare in db_storage_targets.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_storage_targets.c`, `tests/unit/test_t7_136.c`, `tests/unit/cmake/eng/t7_136.cmake`, `quality/evidence/T7.136.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-709dbb22240f409f, CLANGTIDY-d68060f1555ca324, CLANGTIDY-b922ced0e34aacea, CLANGTIDY-295d32efbfee9145 +- **acceptance_criteria**: + - Use equal, unequal, prefix-only and empty strings to prove the branch implements the intended comparison rather than pointer/boolean equality. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.136 --regex '^test_t7_136$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.136`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.137: bugprone-suspicious-string-compare in storage_deletion.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/storage/storage_deletion.c`, `tests/unit/test_t7_137.c`, `tests/unit/cmake/eng/t7_137.cmake`, `quality/evidence/T7.137.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-56955e0bf792f087 +- **acceptance_criteria**: + - Use equal, unequal, prefix-only and empty strings to prove the branch implements the intended comparison rather than pointer/boolean equality. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.137 --regex '^test_t7_137$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.137`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.138: bugprone-suspicious-string-compare in storage_migration.c +- **depends_on**: [T7, T13, T7.93] +- **agent_type**: worker +- **ownership**: `src/storage/storage_migration.c`, `tests/unit/test_t7_138.c`, `tests/unit/cmake/eng/t7_138.cmake`, `quality/evidence/T7.138.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-d6379e87cfa699fa +- **acceptance_criteria**: + - Use equal, unequal, prefix-only and empty strings to prove the branch implements the intended comparison rather than pointer/boolean equality. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.138 --regex '^test_t7_138$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.138`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.139: bugprone-suspicious-string-compare in storage_s3.c +- **depends_on**: [T7, T13, T7.94] +- **agent_type**: worker +- **ownership**: `src/storage/storage_s3.c`, `tests/unit/test_t7_139.c`, `tests/unit/cmake/eng/t7_139.cmake`, `quality/evidence/T7.139.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-789d9f9254afa1b1, CLANGTIDY-2f98dec54b741594, CLANGTIDY-852f97f8aacc5432, CLANGTIDY-ba57287cdb3eb096, CLANGTIDY-bfbbf95e2bedfe38, CLANGTIDY-65cc9415acf1be4d, CLANGTIDY-5561b78de6be772b, CLANGTIDY-6b719694dd2640c7 +- **acceptance_criteria**: + - Use equal, unequal, prefix-only and empty strings to prove the branch implements the intended comparison rather than pointer/boolean equality. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.139 --regex '^test_t7_139$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.139`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.140: bugprone-suspicious-string-compare in storage_source.c +- **depends_on**: [T7, T13, T7.110] +- **agent_type**: worker +- **ownership**: `src/storage/storage_source.c`, `tests/unit/test_t7_140.c`, `tests/unit/cmake/eng/t7_140.cmake`, `quality/evidence/T7.140.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-6a07b625f331b20e +- **acceptance_criteria**: + - Use equal, unequal, prefix-only and empty strings to prove the branch implements the intended comparison rather than pointer/boolean equality. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.140 --regex '^test_t7_140$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.140`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.141: bugprone-suspicious-string-compare in recording_archive.c +- **depends_on**: [T7, T13, T7.109] +- **agent_type**: worker +- **ownership**: `src/web/recording_archive.c`, `tests/unit/test_t7_141.c`, `tests/unit/cmake/eng/t7_141.cmake`, `quality/evidence/T7.141.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-adf6edf7670e9010 +- **acceptance_criteria**: + - Use equal, unequal, prefix-only and empty strings to prove the branch implements the intended comparison rather than pointer/boolean equality. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.141 --regex '^test_t7_141$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.141`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.142: bugprone-unsafe-functions,cert-msc24-c,cert-msc33-c in storage_s3.c +- **depends_on**: [T7, T13, T7.139] +- **agent_type**: worker +- **ownership**: `src/storage/storage_s3.c`, `tests/unit/test_t7_142.c`, `tests/unit/cmake/eng/t7_142.cmake`, `quality/evidence/T7.142.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-3a081de1dd30ebb2 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.142 --regex '^test_t7_142$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.142`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.143: cert-err34-c in linux_device_map.c, linux_hardware.c +- **depends_on**: [T7, T13, T7.135] +- **agent_type**: worker +- **ownership**: `src/telemetry/providers/linux_device_map.c`, `src/telemetry/providers/linux_hardware.c`, `tests/unit/test_t7_143.c`, `tests/unit/cmake/eng/t7_143.cmake`, `quality/evidence/T7.143.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-c52ffccc8c0fb590, CLANGTIDY-811ab08155776051 +- **acceptance_criteria**: + - Exercise empty, trailing-junk, negative, out-of-range and valid numeric strings; conversion must check end pointer and range before applying configuration. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.143 --regex '^test_t7_143$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.143`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.144: cert-err34-c in ffmpeg_rss_guard.c +- **depends_on**: [T7, T13, T7.96] +- **agent_type**: worker +- **ownership**: `src/tools/ffmpeg_rss_guard.c`, `tests/unit/test_t7_144.c`, `tests/unit/cmake/eng/t7_144.cmake`, `quality/evidence/T7.144.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-11d1a497d98b8490 +- **acceptance_criteria**: + - Exercise empty, trailing-junk, negative, out-of-range and valid numeric strings; conversion must check end pointer and range before applying configuration. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.144 --regex '^test_t7_144$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.144`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.145: cert-err34-c in go2rtc_integration.c, go2rtc_process.c +- **depends_on**: [T7, T13, T7.98, T7.60] +- **agent_type**: worker +- **ownership**: `src/video/go2rtc/go2rtc_integration.c`, `src/video/go2rtc/go2rtc_process.c`, `tests/unit/test_t7_145.c`, `tests/unit/cmake/eng/t7_145.cmake`, `quality/evidence/T7.145.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-a7a71d348e2c49f5, CLANGTIDY-41876b44c3442c4b, CLANGTIDY-3a3cc8c9282e0fb5, CLANGTIDY-43d0d5170d6a8434 +- **acceptance_criteria**: + - Exercise empty, trailing-junk, negative, out-of-range and valid numeric strings; conversion must check end pointer and range before applying configuration. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.145 --regex '^test_t7_145$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.145`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.146: cert-err34-c in onvif_detection.c +- **depends_on**: [T7, T13, T7.100] +- **agent_type**: worker +- **ownership**: `src/video/onvif_detection.c`, `tests/unit/test_t7_146.c`, `tests/unit/cmake/eng/t7_146.cmake`, `quality/evidence/T7.146.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-a6e1105b549e0cf0 +- **acceptance_criteria**: + - Exercise empty, trailing-junk, negative, out-of-range and valid numeric strings; conversion must check end pointer and range before applying configuration. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.146 --regex '^test_t7_146$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.146`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.147: cert-err34-c in api_handlers_go2rtc_proxy.c +- **depends_on**: [T7, T13, T7.67] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_go2rtc_proxy.c`, `tests/unit/test_t7_147.c`, `tests/unit/cmake/eng/t7_147.cmake`, `quality/evidence/T7.147.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-ab5e571ba64af645 +- **acceptance_criteria**: + - Exercise empty, trailing-junk, negative, out-of-range and valid numeric strings; conversion must check end pointer and range before applying configuration. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.147 --regex '^test_t7_147$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.147`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.148: cert-err34-c in api_handlers_investigations.c +- **depends_on**: [T7, T13, T7.102] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_investigations.c`, `tests/unit/test_t7_148.c`, `tests/unit/cmake/eng/t7_148.cmake`, `quality/evidence/T7.148.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-e5ec24184e5b758c +- **acceptance_criteria**: + - Exercise empty, trailing-junk, negative, out-of-range and valid numeric strings; conversion must check end pointer and range before applying configuration. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.148 --regex '^test_t7_148$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.148`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.149: cert-err34-c in api_handlers_system_logs.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_system_logs.c`, `tests/unit/test_t7_149.c`, `tests/unit/cmake/eng/t7_149.cmake`, `quality/evidence/T7.149.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-0fda904c59353043 +- **acceptance_criteria**: + - Exercise empty, trailing-junk, negative, out-of-range and valid numeric strings; conversion must check end pointer and range before applying configuration. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.149 --regex '^test_t7_149$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.149`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.150: cert-err34-c in go2rtc_websocket.c +- **depends_on**: [T7, T13, T7.108] +- **agent_type**: worker +- **ownership**: `src/web/go2rtc_websocket.c`, `tests/unit/test_t7_150.c`, `tests/unit/cmake/eng/t7_150.cmake`, `quality/evidence/T7.150.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-5c42b38e8a9c25ff +- **acceptance_criteria**: + - Exercise empty, trailing-junk, negative, out-of-range and valid numeric strings; conversion must check end pointer and range before applying configuration. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.150 --regex '^test_t7_150$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.150`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.151: cert-int09-c in authorization.h +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `include/core/authorization.h`, `tests/unit/test_t7_151.c`, `tests/unit/cmake/eng/t7_151.cmake`, `quality/evidence/T7.151.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-1539a5c009afd0df +- **acceptance_criteria**: + - Verify enum constants remain representable and unique on the supported ABI without changing public numeric values. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.151 --regex '^test_t7_151$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.151`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.152: cert-int09-c in faac.h +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_152-upstream.json`, `quality/evidence/T7.152.md`. +- **priority**: low +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CLANGTIDY-b6947bb24c18c8ac, CLANGTIDY-ddf685d0be472b86, CLANGTIDY-296d5f7499179bc0, CLANGTIDY-4c6957160cb5ae0c +- **acceptance_criteria**: + - Verify enum constants remain representable and unique on the supported ABI without changing public numeric values. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_152-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.152`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.153: clang-analyzer-deadcode.DeadStores in db_system_health_incidents.c +- **depends_on**: [T7, T13, T7.79] +- **agent_type**: worker +- **ownership**: `src/database/db_system_health_incidents.c`, `tests/unit/test_t7_153.c`, `tests/unit/cmake/eng/t7_153.cmake`, `quality/evidence/T7.153.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-fe8af642c27ce051 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.153 --regex '^test_t7_153$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.153`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.154: clang-analyzer-deadcode.DeadStores in go2rtc_integration.c +- **depends_on**: [T7, T13, T7.145] +- **agent_type**: worker +- **ownership**: `src/video/go2rtc/go2rtc_integration.c`, `tests/unit/test_t7_154.c`, `tests/unit/cmake/eng/t7_154.cmake`, `quality/evidence/T7.154.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-88fbdf8930f67549 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.154 --regex '^test_t7_154$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.154`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.155: clang-analyzer-deadcode.DeadStores in mp4_segment_recorder.c +- **depends_on**: [T7, T13, T7.119] +- **agent_type**: worker +- **ownership**: `src/video/mp4_segment_recorder.c`, `tests/unit/test_t7_155.c`, `tests/unit/cmake/eng/t7_155.cmake`, `quality/evidence/T7.155.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-27ac318897664d8a +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.155 --regex '^test_t7_155$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.155`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.156: clang-analyzer-deadcode.DeadStores in onvif_ptz.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/onvif_ptz.c`, `tests/unit/test_t7_156.c`, `tests/unit/cmake/eng/t7_156.cmake`, `quality/evidence/T7.156.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-7d7d3a3c4f1824bd +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.156 --regex '^test_t7_156$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.156`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.157: clang-analyzer-deadcode.DeadStores in recording_path.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/recording_path.c`, `tests/unit/test_t7_157.c`, `tests/unit/cmake/eng/t7_157.cmake`, `quality/evidence/T7.157.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-44c350a8b7e2fd4a, CLANGTIDY-a7fa9aad275f9425 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.157 --regex '^test_t7_157$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.157`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.158: clang-analyzer-deadcode.DeadStores in api_handlers_health.c +- **depends_on**: [T7, T13, T7.44] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_health.c`, `tests/unit/test_t7_158.c`, `tests/unit/cmake/eng/t7_158.cmake`, `quality/evidence/T7.158.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-cf5f09b5a02a9bca +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.158 --regex '^test_t7_158$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.158`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.159: invalidPointerCast in sod.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_159-upstream.json`, `quality/evidence/T7.159.md`. +- **priority**: low +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-7975c2d572bc32c0, CPPCHECK-291bebc3b95eca4e +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_159-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.159`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.160: jsx-a11y/anchor-is-valid in Header.jsx +- **depends_on**: [T7, T10] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/Header.jsx`, `web/tests/remediation/t7_160.spec.jsx`, `quality/evidence/T7.160.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-366138c5d194685c +- **acceptance_criteria**: + - Use valid navigable hrefs for links and buttons for actions; verify keyboard behavior and no unexpected page navigation. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_160` + - `mkdir -p build/eng-artifacts/T7.160` + - `web/node_modules/.bin/eslint web/js/components/preact/Header.jsx --format json --output-file build/eng-artifacts/T7.160/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.160/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/anchor-is-valid'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.160`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.161: jsx-a11y/click-events-have-key-events in GridPicker.jsx, HLSVideoCell.jsx, HealthView.jsx, MSEVideoCell.jsx, StreamCard.jsx, StreamsView.jsx +- **depends_on**: [T7, T10] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/GridPicker.jsx`, `web/js/components/preact/HLSVideoCell.jsx`, `web/js/components/preact/HealthView.jsx`, `web/js/components/preact/MSEVideoCell.jsx`, `web/js/components/preact/StreamCard.jsx`, `web/js/components/preact/StreamsView.jsx`, `web/tests/remediation/t7_161.spec.jsx`, `quality/evidence/T7.161.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-ed278d9594c2abdb, ESLINT-BUCKET-67fcff31d1a4cf75, ESLINT-BUCKET-a642f51dfd2a124a, ESLINT-BUCKET-404de092ea97cc43, ESLINT-BUCKET-6243e36ec0fdb5cd, ESLINT-BUCKET-5c63d53fbef3ba6d +- **acceptance_criteria**: + - Assert Enter and Space activation where the control semantics require it, focus visibility, no double dispatch, and unchanged pointer interaction. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_161` + - `mkdir -p build/eng-artifacts/T7.161` + - `web/node_modules/.bin/eslint web/js/components/preact/GridPicker.jsx web/js/components/preact/HLSVideoCell.jsx web/js/components/preact/HealthView.jsx web/js/components/preact/MSEVideoCell.jsx web/js/components/preact/StreamCard.jsx web/js/components/preact/StreamsView.jsx --format json --output-file build/eng-artifacts/T7.161/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.161/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/click-events-have-key-events'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.161`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.162: jsx-a11y/click-events-have-key-events in ToastContainer.jsx, UI.jsx, WebRTCVideoCell.jsx, ZoneEditor.jsx, LanguageSelector.jsx, ModalDialog.jsx +- **depends_on**: [T7, T10] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/ToastContainer.jsx`, `web/js/components/preact/UI.jsx`, `web/js/components/preact/WebRTCVideoCell.jsx`, `web/js/components/preact/ZoneEditor.jsx`, `web/js/components/preact/common/LanguageSelector.jsx`, `web/js/components/preact/common/ModalDialog.jsx`, `web/tests/remediation/t7_162.spec.jsx`, `quality/evidence/T7.162.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-ab2c863c82952346, ESLINT-BUCKET-f53a71c368c33ab9, ESLINT-BUCKET-45887456841ead8b, ESLINT-BUCKET-cb235968867c79e3, ESLINT-BUCKET-02418efc105b6ab9, ESLINT-BUCKET-4e8530c09d5fd082 +- **acceptance_criteria**: + - Assert Enter and Space activation where the control semantics require it, focus visibility, no double dispatch, and unchanged pointer interaction. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_162` + - `mkdir -p build/eng-artifacts/T7.162` + - `web/node_modules/.bin/eslint web/js/components/preact/ToastContainer.jsx web/js/components/preact/UI.jsx web/js/components/preact/WebRTCVideoCell.jsx web/js/components/preact/ZoneEditor.jsx web/js/components/preact/common/LanguageSelector.jsx web/js/components/preact/common/ModalDialog.jsx --format json --output-file build/eng-artifacts/T7.162/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.162/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/click-events-have-key-events'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.162`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.163: jsx-a11y/click-events-have-key-events in LiveOperatorNavigator.jsx, RecordingsGrid.jsx, Go2rtcTab.jsx, ClearLogsModal.jsx, RestartModal.jsx, TimelinePlayer.jsx +- **depends_on**: [T7, T10] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/live/LiveOperatorNavigator.jsx`, `web/js/components/preact/recordings/RecordingsGrid.jsx`, `web/js/components/preact/settings/Go2rtcTab.jsx`, `web/js/components/preact/system/ClearLogsModal.jsx`, `web/js/components/preact/system/RestartModal.jsx`, `web/js/components/preact/timeline/TimelinePlayer.jsx`, `web/tests/remediation/t7_163.spec.jsx`, `quality/evidence/T7.163.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-f16c5e93d86bc6f9, ESLINT-BUCKET-41381cd9bd64279e, ESLINT-BUCKET-422485a76dc61a9b, ESLINT-BUCKET-44ea0e63c82a7151, ESLINT-BUCKET-155480cbfd270011, ESLINT-BUCKET-79b6e7adf4959fbc +- **acceptance_criteria**: + - Assert Enter and Space activation where the control semantics require it, focus visibility, no double dispatch, and unchanged pointer interaction. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_163` + - `mkdir -p build/eng-artifacts/T7.163` + - `web/node_modules/.bin/eslint web/js/components/preact/live/LiveOperatorNavigator.jsx web/js/components/preact/recordings/RecordingsGrid.jsx web/js/components/preact/settings/Go2rtcTab.jsx web/js/components/preact/system/ClearLogsModal.jsx web/js/components/preact/system/RestartModal.jsx web/js/components/preact/timeline/TimelinePlayer.jsx --format json --output-file build/eng-artifacts/T7.163/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.163/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/click-events-have-key-events'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.163`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.164: jsx-a11y/click-events-have-key-events in AccessPolicyModal.jsx, AddUserModal.jsx, ApiKeyModal.jsx, AuditHistoryModal.jsx, DeleteUserModal.jsx, EditUserModal.jsx +- **depends_on**: [T7, T10] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/users/AccessPolicyModal.jsx`, `web/js/components/preact/users/AddUserModal.jsx`, `web/js/components/preact/users/ApiKeyModal.jsx`, `web/js/components/preact/users/AuditHistoryModal.jsx`, `web/js/components/preact/users/DeleteUserModal.jsx`, `web/js/components/preact/users/EditUserModal.jsx`, `web/tests/remediation/t7_164.spec.jsx`, `quality/evidence/T7.164.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-0a786d21e1ee7bd2, ESLINT-BUCKET-c2dc58af6543d1f5, ESLINT-BUCKET-3b71a4c47dfd1075, ESLINT-BUCKET-ea11ae604e62541e, ESLINT-BUCKET-8d573ae471211e73, ESLINT-BUCKET-22666b8c08cd887e +- **acceptance_criteria**: + - Assert Enter and Space activation where the control semantics require it, focus visibility, no double dispatch, and unchanged pointer interaction. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_164` + - `mkdir -p build/eng-artifacts/T7.164` + - `web/node_modules/.bin/eslint web/js/components/preact/users/AccessPolicyModal.jsx web/js/components/preact/users/AddUserModal.jsx web/js/components/preact/users/ApiKeyModal.jsx web/js/components/preact/users/AuditHistoryModal.jsx web/js/components/preact/users/DeleteUserModal.jsx web/js/components/preact/users/EditUserModal.jsx --format json --output-file build/eng-artifacts/T7.164/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.164/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/click-events-have-key-events'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.164`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.165: jsx-a11y/click-events-have-key-events in RoleManagerModal.jsx, TotpSetupModal.jsx +- **depends_on**: [T7, T10] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/users/RoleManagerModal.jsx`, `web/js/components/preact/users/TotpSetupModal.jsx`, `web/tests/remediation/t7_165.spec.jsx`, `quality/evidence/T7.165.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-9190884804c0c65d, ESLINT-BUCKET-e8ce699e42be07b3 +- **acceptance_criteria**: + - Assert Enter and Space activation where the control semantics require it, focus visibility, no double dispatch, and unchanged pointer interaction. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_165` + - `mkdir -p build/eng-artifacts/T7.165` + - `web/node_modules/.bin/eslint web/js/components/preact/users/RoleManagerModal.jsx web/js/components/preact/users/TotpSetupModal.jsx --format json --output-file build/eng-artifacts/T7.165/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.165/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/click-events-have-key-events'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.165`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.166: jsx-a11y/control-has-associated-label in AuthGate.jsx, BatchDownloadModal.jsx, DetectionOverlay.jsx, FleetView.jsx, FullscreenManager.jsx, HLSVideoCell.jsx +- **depends_on**: [T7, T10, T7.161] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/AuthGate.jsx`, `web/js/components/preact/BatchDownloadModal.jsx`, `web/js/components/preact/DetectionOverlay.jsx`, `web/js/components/preact/FleetView.jsx`, `web/js/components/preact/FullscreenManager.jsx`, `web/js/components/preact/HLSVideoCell.jsx`, `web/tests/remediation/t7_166.spec.jsx`, `quality/evidence/T7.166.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-0f4bbeb4ab715fee, ESLINT-BUCKET-ef00a494fd69875c, ESLINT-BUCKET-e93ca9cb727a0aee, ESLINT-BUCKET-20e1a03b32e40002, ESLINT-BUCKET-e7e0cc4f8fd4c513, ESLINT-BUCKET-aa839344c6e5b30d +- **acceptance_criteria**: + - Render each reported control and assert a stable accessible name, including icon-only actions, without relying on title alone; retain localized labels and original action callbacks. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_166` + - `mkdir -p build/eng-artifacts/T7.166` + - `web/node_modules/.bin/eslint web/js/components/preact/AuthGate.jsx web/js/components/preact/BatchDownloadModal.jsx web/js/components/preact/DetectionOverlay.jsx web/js/components/preact/FleetView.jsx web/js/components/preact/FullscreenManager.jsx web/js/components/preact/HLSVideoCell.jsx --format json --output-file build/eng-artifacts/T7.166/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.166/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/control-has-associated-label'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.166`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.167: jsx-a11y/control-has-associated-label in LiveView.jsx, LoginView.jsx, MSEVideoCell.jsx, SetupWizard.jsx, SnapshotManager.jsx, StreamConfigModal.jsx +- **depends_on**: [T7, T10, T7.161] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/LiveView.jsx`, `web/js/components/preact/LoginView.jsx`, `web/js/components/preact/MSEVideoCell.jsx`, `web/js/components/preact/SetupWizard.jsx`, `web/js/components/preact/SnapshotManager.jsx`, `web/js/components/preact/StreamConfigModal.jsx`, `web/tests/remediation/t7_167.spec.jsx`, `quality/evidence/T7.167.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-ae74d74f4f8f96b4, ESLINT-BUCKET-33c31857a85153c5, ESLINT-BUCKET-2b401ef7608cff74, ESLINT-BUCKET-6b623e0db3f455c7, ESLINT-BUCKET-63e9c68b97a2b704, ESLINT-BUCKET-3d882f111ea61422 +- **acceptance_criteria**: + - Render each reported control and assert a stable accessible name, including icon-only actions, without relying on title alone; retain localized labels and original action callbacks. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_167` + - `mkdir -p build/eng-artifacts/T7.167` + - `web/node_modules/.bin/eslint web/js/components/preact/LiveView.jsx web/js/components/preact/LoginView.jsx web/js/components/preact/MSEVideoCell.jsx web/js/components/preact/SetupWizard.jsx web/js/components/preact/SnapshotManager.jsx web/js/components/preact/StreamConfigModal.jsx --format json --output-file build/eng-artifacts/T7.167/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.167/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/control-has-associated-label'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.167`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.168: jsx-a11y/control-has-associated-label in StreamsView.jsx, ThemeCustomizer.jsx, UI.jsx, WebRTCVideoCell.jsx, ZoneEditor.jsx, ModalDialog.jsx +- **depends_on**: [T7, T10, T7.161, T7.162] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/StreamsView.jsx`, `web/js/components/preact/ThemeCustomizer.jsx`, `web/js/components/preact/UI.jsx`, `web/js/components/preact/WebRTCVideoCell.jsx`, `web/js/components/preact/ZoneEditor.jsx`, `web/js/components/preact/common/ModalDialog.jsx`, `web/tests/remediation/t7_168.spec.jsx`, `quality/evidence/T7.168.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-ba71da8483425ebf, ESLINT-BUCKET-6ffa955639ab6418, ESLINT-BUCKET-6faae6bddf434aab, ESLINT-BUCKET-9bd9a8994dceced4, ESLINT-BUCKET-e845a2e465702318, ESLINT-BUCKET-1f35f119bab13f92 +- **acceptance_criteria**: + - Render each reported control and assert a stable accessible name, including icon-only actions, without relying on title alone; retain localized labels and original action callbacks. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_168` + - `mkdir -p build/eng-artifacts/T7.168` + - `web/node_modules/.bin/eslint web/js/components/preact/StreamsView.jsx web/js/components/preact/ThemeCustomizer.jsx web/js/components/preact/UI.jsx web/js/components/preact/WebRTCVideoCell.jsx web/js/components/preact/ZoneEditor.jsx web/js/components/preact/common/ModalDialog.jsx --format json --output-file build/eng-artifacts/T7.168/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.168/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/control-has-associated-label'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.168`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.169: jsx-a11y/control-has-associated-label in EventDestinationEditor.jsx, EventRouteEditor.jsx, BulkOrganizeModal.jsx, CollectionManager.jsx, CollectionSelectorBuilder.jsx, FleetFilters.jsx +- **depends_on**: [T7, T10] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/events/EventDestinationEditor.jsx`, `web/js/components/preact/events/EventRouteEditor.jsx`, `web/js/components/preact/fleet/BulkOrganizeModal.jsx`, `web/js/components/preact/fleet/CollectionManager.jsx`, `web/js/components/preact/fleet/CollectionSelectorBuilder.jsx`, `web/js/components/preact/fleet/FleetFilters.jsx`, `web/tests/remediation/t7_169.spec.jsx`, `quality/evidence/T7.169.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-5088d976b993e707, ESLINT-BUCKET-fea403cece7fffa3, ESLINT-BUCKET-20d0442e85244a5d, ESLINT-BUCKET-03b8b95f3bd44235, ESLINT-BUCKET-993ef9a219cc29a2, ESLINT-BUCKET-eaa9041228587f50 +- **acceptance_criteria**: + - Render each reported control and assert a stable accessible name, including icon-only actions, without relying on title alone; retain localized labels and original action callbacks. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_169` + - `mkdir -p build/eng-artifacts/T7.169` + - `web/node_modules/.bin/eslint web/js/components/preact/events/EventDestinationEditor.jsx web/js/components/preact/events/EventRouteEditor.jsx web/js/components/preact/fleet/BulkOrganizeModal.jsx web/js/components/preact/fleet/CollectionManager.jsx web/js/components/preact/fleet/CollectionSelectorBuilder.jsx web/js/components/preact/fleet/FleetFilters.jsx --format json --output-file build/eng-artifacts/T7.169/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.169/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/control-has-associated-label'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.169`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.170: jsx-a11y/control-has-associated-label in OrganizationManager.jsx, SavedViewsBar.jsx, StaticCollectionMembers.jsx, InvestigationActions.jsx, InvestigationBookmarks.jsx, InvestigationView.jsx +- **depends_on**: [T7, T10] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/fleet/OrganizationManager.jsx`, `web/js/components/preact/fleet/SavedViewsBar.jsx`, `web/js/components/preact/fleet/StaticCollectionMembers.jsx`, `web/js/components/preact/investigation/InvestigationActions.jsx`, `web/js/components/preact/investigation/InvestigationBookmarks.jsx`, `web/js/components/preact/investigation/InvestigationView.jsx`, `web/tests/remediation/t7_170.spec.jsx`, `quality/evidence/T7.170.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-19d5fc636e3f15e6, ESLINT-BUCKET-2cdd7ef73529551e, ESLINT-BUCKET-5a25b9ace393f230, ESLINT-BUCKET-12c7bb31966e53aa, ESLINT-BUCKET-274240d1fc0300f7, ESLINT-BUCKET-2a20bf23c61a102e +- **acceptance_criteria**: + - Render each reported control and assert a stable accessible name, including icon-only actions, without relying on title alone; retain localized labels and original action callbacks. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_170` + - `mkdir -p build/eng-artifacts/T7.170` + - `web/node_modules/.bin/eslint web/js/components/preact/fleet/OrganizationManager.jsx web/js/components/preact/fleet/SavedViewsBar.jsx web/js/components/preact/fleet/StaticCollectionMembers.jsx web/js/components/preact/investigation/InvestigationActions.jsx web/js/components/preact/investigation/InvestigationBookmarks.jsx web/js/components/preact/investigation/InvestigationView.jsx --format json --output-file build/eng-artifacts/T7.170/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.170/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/control-has-associated-label'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.170`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.171: jsx-a11y/control-has-associated-label in LiveBuildingPlan.jsx, LiveOperatorNavigator.jsx, PlanSketchControls.jsx, FiltersSidebar.jsx, RecordingsGrid.jsx, RecordingsTable.jsx +- **depends_on**: [T7, T10, T7.163] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/live/LiveBuildingPlan.jsx`, `web/js/components/preact/live/LiveOperatorNavigator.jsx`, `web/js/components/preact/live/PlanSketchControls.jsx`, `web/js/components/preact/recordings/FiltersSidebar.jsx`, `web/js/components/preact/recordings/RecordingsGrid.jsx`, `web/js/components/preact/recordings/RecordingsTable.jsx`, `web/tests/remediation/t7_171.spec.jsx`, `quality/evidence/T7.171.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-bb1a968a245405ec, ESLINT-BUCKET-3a6fb0a94ef6ffdf, ESLINT-BUCKET-e0e4b387af698b40, ESLINT-BUCKET-389226ea0147ea5d, ESLINT-BUCKET-aab67d5bbb7b5489, ESLINT-BUCKET-f492731b13ec277c +- **acceptance_criteria**: + - Render each reported control and assert a stable accessible name, including icon-only actions, without relying on title alone; retain localized labels and original action callbacks. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_171` + - `mkdir -p build/eng-artifacts/T7.171` + - `web/node_modules/.bin/eslint web/js/components/preact/live/LiveBuildingPlan.jsx web/js/components/preact/live/LiveOperatorNavigator.jsx web/js/components/preact/live/PlanSketchControls.jsx web/js/components/preact/recordings/FiltersSidebar.jsx web/js/components/preact/recordings/RecordingsGrid.jsx web/js/components/preact/recordings/RecordingsTable.jsx --format json --output-file build/eng-artifacts/T7.171/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.171/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/control-has-associated-label'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.171`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.172: jsx-a11y/control-has-associated-label in TagsOverlay.jsx, AdvancedTab.jsx, AuthTab.jsx, DetectionTab.jsx, GeneralTab.jsx, Go2rtcTab.jsx +- **depends_on**: [T7, T10, T7.163] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/recordings/TagsOverlay.jsx`, `web/js/components/preact/settings/AdvancedTab.jsx`, `web/js/components/preact/settings/AuthTab.jsx`, `web/js/components/preact/settings/DetectionTab.jsx`, `web/js/components/preact/settings/GeneralTab.jsx`, `web/js/components/preact/settings/Go2rtcTab.jsx`, `web/tests/remediation/t7_172.spec.jsx`, `quality/evidence/T7.172.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-d03afa69ead3203e, ESLINT-BUCKET-8ce22b0413a485e1, ESLINT-BUCKET-40ef7b2f328bb9ef, ESLINT-BUCKET-93d2b8db97a42555, ESLINT-BUCKET-ea86635ccd79513e, ESLINT-BUCKET-5ec0649750441f81 +- **acceptance_criteria**: + - Render each reported control and assert a stable accessible name, including icon-only actions, without relying on title alone; retain localized labels and original action callbacks. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_172` + - `mkdir -p build/eng-artifacts/T7.172` + - `web/node_modules/.bin/eslint web/js/components/preact/recordings/TagsOverlay.jsx web/js/components/preact/settings/AdvancedTab.jsx web/js/components/preact/settings/AuthTab.jsx web/js/components/preact/settings/DetectionTab.jsx web/js/components/preact/settings/GeneralTab.jsx web/js/components/preact/settings/Go2rtcTab.jsx --format json --output-file build/eng-artifacts/T7.172/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.172/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/control-has-associated-label'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.172`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.173: jsx-a11y/control-has-associated-label in HealthTab.jsx, MqttTab.jsx, StorageTab.jsx, StreamsDefaultsTab.jsx, StreamStorage.jsx, CalendarPicker.jsx +- **depends_on**: [T7, T10] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/settings/HealthTab.jsx`, `web/js/components/preact/settings/MqttTab.jsx`, `web/js/components/preact/settings/StorageTab.jsx`, `web/js/components/preact/settings/StreamsDefaultsTab.jsx`, `web/js/components/preact/system/StreamStorage.jsx`, `web/js/components/preact/timeline/CalendarPicker.jsx`, `web/tests/remediation/t7_173.spec.jsx`, `quality/evidence/T7.173.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-fe8c1e237393fb23, ESLINT-BUCKET-59e343114dc251b1, ESLINT-BUCKET-5a1cbbfddf8f3fcc, ESLINT-BUCKET-350da16b1c3b2274, ESLINT-BUCKET-44b516dc2eeb97bf, ESLINT-BUCKET-5da42ce096a9fa82 +- **acceptance_criteria**: + - Render each reported control and assert a stable accessible name, including icon-only actions, without relying on title alone; retain localized labels and original action callbacks. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_173` + - `mkdir -p build/eng-artifacts/T7.173` + - `web/node_modules/.bin/eslint web/js/components/preact/settings/HealthTab.jsx web/js/components/preact/settings/MqttTab.jsx web/js/components/preact/settings/StorageTab.jsx web/js/components/preact/settings/StreamsDefaultsTab.jsx web/js/components/preact/system/StreamStorage.jsx web/js/components/preact/timeline/CalendarPicker.jsx --format json --output-file build/eng-artifacts/T7.173/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.173/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/control-has-associated-label'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.173`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.174: jsx-a11y/control-has-associated-label in TimelineControls.jsx, TimelinePlayer.jsx, AddUserModal.jsx, ApiKeyModal.jsx, AuditHistoryModal.jsx, EditUserModal.jsx +- **depends_on**: [T7, T10, T7.163, T7.164] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/timeline/TimelineControls.jsx`, `web/js/components/preact/timeline/TimelinePlayer.jsx`, `web/js/components/preact/users/AddUserModal.jsx`, `web/js/components/preact/users/ApiKeyModal.jsx`, `web/js/components/preact/users/AuditHistoryModal.jsx`, `web/js/components/preact/users/EditUserModal.jsx`, `web/tests/remediation/t7_174.spec.jsx`, `quality/evidence/T7.174.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-7b00d558899dd292, ESLINT-BUCKET-4e38c49052b49016, ESLINT-BUCKET-6af902622576c683, ESLINT-BUCKET-098293b0fb5320bb, ESLINT-BUCKET-f25f197e02c782fc, ESLINT-BUCKET-ccf3e6e7959d2bd7 +- **acceptance_criteria**: + - Render each reported control and assert a stable accessible name, including icon-only actions, without relying on title alone; retain localized labels and original action callbacks. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_174` + - `mkdir -p build/eng-artifacts/T7.174` + - `web/node_modules/.bin/eslint web/js/components/preact/timeline/TimelineControls.jsx web/js/components/preact/timeline/TimelinePlayer.jsx web/js/components/preact/users/AddUserModal.jsx web/js/components/preact/users/ApiKeyModal.jsx web/js/components/preact/users/AuditHistoryModal.jsx web/js/components/preact/users/EditUserModal.jsx --format json --output-file build/eng-artifacts/T7.174/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.174/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/control-has-associated-label'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.174`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.175: jsx-a11y/control-has-associated-label in RoleManagerModal.jsx, TotpSetupModal.jsx, UsersTable.jsx +- **depends_on**: [T7, T10, T7.165] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/users/RoleManagerModal.jsx`, `web/js/components/preact/users/TotpSetupModal.jsx`, `web/js/components/preact/users/UsersTable.jsx`, `web/tests/remediation/t7_175.spec.jsx`, `quality/evidence/T7.175.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-400e44e71536be4e, ESLINT-BUCKET-d3aede71a08c3a5f, ESLINT-BUCKET-fcf1de019f6b4533 +- **acceptance_criteria**: + - Render each reported control and assert a stable accessible name, including icon-only actions, without relying on title alone; retain localized labels and original action callbacks. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_175` + - `mkdir -p build/eng-artifacts/T7.175` + - `web/node_modules/.bin/eslint web/js/components/preact/users/RoleManagerModal.jsx web/js/components/preact/users/TotpSetupModal.jsx web/js/components/preact/users/UsersTable.jsx --format json --output-file build/eng-artifacts/T7.175/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.175/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/control-has-associated-label'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.175`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.176: jsx-a11y/interactive-supports-focus in MobileTileGestures.jsx +- **depends_on**: [T7, T10] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/MobileTileGestures.jsx`, `web/tests/remediation/t7_176.spec.jsx`, `quality/evidence/T7.176.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-3469a0a703cdbc12 +- **acceptance_criteria**: + - Assert each interactive control is keyboard focusable and acts once for its expected activation keys. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_176` + - `mkdir -p build/eng-artifacts/T7.176` + - `web/node_modules/.bin/eslint web/js/components/preact/MobileTileGestures.jsx --format json --output-file build/eng-artifacts/T7.176/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.176/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/interactive-supports-focus'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.176`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.177: jsx-a11y/label-has-associated-control in BatchDownloadModal.jsx, StreamConfigModal.jsx, EventDestinationEditor.jsx, EventRouteEditor.jsx, CollectionManager.jsx, StaticCollectionMembers.jsx +- **depends_on**: [T7, T10, T7.166, T7.167, T7.169, T7.170] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/BatchDownloadModal.jsx`, `web/js/components/preact/StreamConfigModal.jsx`, `web/js/components/preact/events/EventDestinationEditor.jsx`, `web/js/components/preact/events/EventRouteEditor.jsx`, `web/js/components/preact/fleet/CollectionManager.jsx`, `web/js/components/preact/fleet/StaticCollectionMembers.jsx`, `web/tests/remediation/t7_177.spec.jsx`, `quality/evidence/T7.177.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-199d3d91208953b4, ESLINT-BUCKET-81a756fe7228ad5b, ESLINT-BUCKET-ddc6803a9b16e391, ESLINT-BUCKET-7cde28afaa9ffb65, ESLINT-BUCKET-7dcecd444f491721, ESLINT-BUCKET-9308fe6583bcdce7 +- **acceptance_criteria**: + - Assert label/input association is programmatic, unique in repeated forms, localized and preserved during conditional rendering. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_177` + - `mkdir -p build/eng-artifacts/T7.177` + - `web/node_modules/.bin/eslint web/js/components/preact/BatchDownloadModal.jsx web/js/components/preact/StreamConfigModal.jsx web/js/components/preact/events/EventDestinationEditor.jsx web/js/components/preact/events/EventRouteEditor.jsx web/js/components/preact/fleet/CollectionManager.jsx web/js/components/preact/fleet/StaticCollectionMembers.jsx --format json --output-file build/eng-artifacts/T7.177/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.177/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/label-has-associated-control'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.177`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.178: jsx-a11y/label-has-associated-control in HealthTab.jsx, StorageTab.jsx, ApiKeyModal.jsx +- **depends_on**: [T7, T10, T7.173, T7.174] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/settings/HealthTab.jsx`, `web/js/components/preact/settings/StorageTab.jsx`, `web/js/components/preact/users/ApiKeyModal.jsx`, `web/tests/remediation/t7_178.spec.jsx`, `quality/evidence/T7.178.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-5e7cfcb56208eaa9, ESLINT-BUCKET-e84d458d8fcd3eef, ESLINT-BUCKET-cf4b93673820960b +- **acceptance_criteria**: + - Assert label/input association is programmatic, unique in repeated forms, localized and preserved during conditional rendering. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_178` + - `mkdir -p build/eng-artifacts/T7.178` + - `web/node_modules/.bin/eslint web/js/components/preact/settings/HealthTab.jsx web/js/components/preact/settings/StorageTab.jsx web/js/components/preact/users/ApiKeyModal.jsx --format json --output-file build/eng-artifacts/T7.178/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.178/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/label-has-associated-control'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.178`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.179: jsx-a11y/label-has-for in AuthGate.jsx, BatchDownloadModal.jsx, FleetView.jsx, LiveView.jsx, LoginView.jsx, SetupWizard.jsx +- **depends_on**: [T7, T10, T7.166, T7.177, T7.167] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/AuthGate.jsx`, `web/js/components/preact/BatchDownloadModal.jsx`, `web/js/components/preact/FleetView.jsx`, `web/js/components/preact/LiveView.jsx`, `web/js/components/preact/LoginView.jsx`, `web/js/components/preact/SetupWizard.jsx`, `web/tests/remediation/t7_179.spec.jsx`, `quality/evidence/T7.179.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-00c9eb79387b90d1, ESLINT-BUCKET-c603f4c09210c0bd, ESLINT-BUCKET-07e48ad6ea9ce45e, ESLINT-BUCKET-dfeaa6c4a9abf5fa, ESLINT-BUCKET-98f2a6813a7ad225, ESLINT-BUCKET-e73c0530b2243573 +- **acceptance_criteria**: + - Assert each label resolves to its intended input by id/for with unique IDs across repeated components and that clicking it focuses the input. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_179` + - `mkdir -p build/eng-artifacts/T7.179` + - `web/node_modules/.bin/eslint web/js/components/preact/AuthGate.jsx web/js/components/preact/BatchDownloadModal.jsx web/js/components/preact/FleetView.jsx web/js/components/preact/LiveView.jsx web/js/components/preact/LoginView.jsx web/js/components/preact/SetupWizard.jsx --format json --output-file build/eng-artifacts/T7.179/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.179/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/label-has-for'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.179`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.180: jsx-a11y/label-has-for in StreamCard.jsx, StreamConfigModal.jsx, StreamsView.jsx, UI.jsx, ZoneEditor.jsx, ModalDialog.jsx +- **depends_on**: [T7, T10, T7.161, T7.177, T7.168] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/StreamCard.jsx`, `web/js/components/preact/StreamConfigModal.jsx`, `web/js/components/preact/StreamsView.jsx`, `web/js/components/preact/UI.jsx`, `web/js/components/preact/ZoneEditor.jsx`, `web/js/components/preact/common/ModalDialog.jsx`, `web/tests/remediation/t7_180.spec.jsx`, `quality/evidence/T7.180.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-c4c40aa44f4e62e4, ESLINT-BUCKET-d900a116e1f06cf4, ESLINT-BUCKET-de63541e57266afb, ESLINT-BUCKET-e810ef87137eb5d8, ESLINT-BUCKET-38ac9714530327f7, ESLINT-BUCKET-b1a74f710eb47a22 +- **acceptance_criteria**: + - Assert each label resolves to its intended input by id/for with unique IDs across repeated components and that clicking it focuses the input. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_180` + - `mkdir -p build/eng-artifacts/T7.180` + - `web/node_modules/.bin/eslint web/js/components/preact/StreamCard.jsx web/js/components/preact/StreamConfigModal.jsx web/js/components/preact/StreamsView.jsx web/js/components/preact/UI.jsx web/js/components/preact/ZoneEditor.jsx web/js/components/preact/common/ModalDialog.jsx --format json --output-file build/eng-artifacts/T7.180/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.180/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/label-has-for'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.180`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.181: jsx-a11y/label-has-for in EventDestinationEditor.jsx, EventRouteEditor.jsx, BulkOrganizeModal.jsx, CollectionManager.jsx, CollectionSelectorBuilder.jsx, FleetTable.jsx +- **depends_on**: [T7, T10, T7.177, T7.169] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/events/EventDestinationEditor.jsx`, `web/js/components/preact/events/EventRouteEditor.jsx`, `web/js/components/preact/fleet/BulkOrganizeModal.jsx`, `web/js/components/preact/fleet/CollectionManager.jsx`, `web/js/components/preact/fleet/CollectionSelectorBuilder.jsx`, `web/js/components/preact/fleet/FleetTable.jsx`, `web/tests/remediation/t7_181.spec.jsx`, `quality/evidence/T7.181.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-2d6e882afea8fed1, ESLINT-BUCKET-f3bd5129ab03f352, ESLINT-BUCKET-7ba2e66a4eb3914f, ESLINT-BUCKET-05ad31a80cc2b3a2, ESLINT-BUCKET-30a2e484727d4a5a, ESLINT-BUCKET-b32370126e568d01 +- **acceptance_criteria**: + - Assert each label resolves to its intended input by id/for with unique IDs across repeated components and that clicking it focuses the input. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_181` + - `mkdir -p build/eng-artifacts/T7.181` + - `web/node_modules/.bin/eslint web/js/components/preact/events/EventDestinationEditor.jsx web/js/components/preact/events/EventRouteEditor.jsx web/js/components/preact/fleet/BulkOrganizeModal.jsx web/js/components/preact/fleet/CollectionManager.jsx web/js/components/preact/fleet/CollectionSelectorBuilder.jsx web/js/components/preact/fleet/FleetTable.jsx --format json --output-file build/eng-artifacts/T7.181/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.181/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/label-has-for'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.181`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.182: jsx-a11y/label-has-for in OrganizationManager.jsx, SavedViewsBar.jsx, StaticCollectionMembers.jsx, InvestigationActions.jsx, InvestigationBookmarks.jsx, InvestigationView.jsx +- **depends_on**: [T7, T10, T7.170, T7.177] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/fleet/OrganizationManager.jsx`, `web/js/components/preact/fleet/SavedViewsBar.jsx`, `web/js/components/preact/fleet/StaticCollectionMembers.jsx`, `web/js/components/preact/investigation/InvestigationActions.jsx`, `web/js/components/preact/investigation/InvestigationBookmarks.jsx`, `web/js/components/preact/investigation/InvestigationView.jsx`, `web/tests/remediation/t7_182.spec.jsx`, `quality/evidence/T7.182.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-f77074e66ed65721, ESLINT-BUCKET-e26c8068ece9c0e0, ESLINT-BUCKET-4246d4277a0b8f04, ESLINT-BUCKET-642b5326a1034302, ESLINT-BUCKET-c0802f3ddbb20b2e, ESLINT-BUCKET-137cbeae12c87193 +- **acceptance_criteria**: + - Assert each label resolves to its intended input by id/for with unique IDs across repeated components and that clicking it focuses the input. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_182` + - `mkdir -p build/eng-artifacts/T7.182` + - `web/node_modules/.bin/eslint web/js/components/preact/fleet/OrganizationManager.jsx web/js/components/preact/fleet/SavedViewsBar.jsx web/js/components/preact/fleet/StaticCollectionMembers.jsx web/js/components/preact/investigation/InvestigationActions.jsx web/js/components/preact/investigation/InvestigationBookmarks.jsx web/js/components/preact/investigation/InvestigationView.jsx --format json --output-file build/eng-artifacts/T7.182/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.182/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/label-has-for'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.182`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.183: jsx-a11y/label-has-for in LiveBuildingPlan.jsx, LiveOperatorNavigator.jsx, FiltersSidebar.jsx, RecordingsGrid.jsx, RecordingsTable.jsx, TagsOverlay.jsx +- **depends_on**: [T7, T10, T7.171, T7.172] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/live/LiveBuildingPlan.jsx`, `web/js/components/preact/live/LiveOperatorNavigator.jsx`, `web/js/components/preact/recordings/FiltersSidebar.jsx`, `web/js/components/preact/recordings/RecordingsGrid.jsx`, `web/js/components/preact/recordings/RecordingsTable.jsx`, `web/js/components/preact/recordings/TagsOverlay.jsx`, `web/tests/remediation/t7_183.spec.jsx`, `quality/evidence/T7.183.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-a167dfb879b1b9cf, ESLINT-BUCKET-b0e1dbc8e8cc536e, ESLINT-BUCKET-50994f387baeaa69, ESLINT-BUCKET-dcde47440ba091e3, ESLINT-BUCKET-114c375fcc3b4802, ESLINT-BUCKET-8b431e9fa35d81ba +- **acceptance_criteria**: + - Assert each label resolves to its intended input by id/for with unique IDs across repeated components and that clicking it focuses the input. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_183` + - `mkdir -p build/eng-artifacts/T7.183` + - `web/node_modules/.bin/eslint web/js/components/preact/live/LiveBuildingPlan.jsx web/js/components/preact/live/LiveOperatorNavigator.jsx web/js/components/preact/recordings/FiltersSidebar.jsx web/js/components/preact/recordings/RecordingsGrid.jsx web/js/components/preact/recordings/RecordingsTable.jsx web/js/components/preact/recordings/TagsOverlay.jsx --format json --output-file build/eng-artifacts/T7.183/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.183/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/label-has-for'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.183`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.184: jsx-a11y/label-has-for in AdvancedTab.jsx, AuthTab.jsx, DetectionTab.jsx, GeneralTab.jsx, Go2rtcTab.jsx, HealthTab.jsx +- **depends_on**: [T7, T10, T7.172, T7.178] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/settings/AdvancedTab.jsx`, `web/js/components/preact/settings/AuthTab.jsx`, `web/js/components/preact/settings/DetectionTab.jsx`, `web/js/components/preact/settings/GeneralTab.jsx`, `web/js/components/preact/settings/Go2rtcTab.jsx`, `web/js/components/preact/settings/HealthTab.jsx`, `web/tests/remediation/t7_184.spec.jsx`, `quality/evidence/T7.184.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-a4e1217d107c230c, ESLINT-BUCKET-4a0d0e1ea3635a24, ESLINT-BUCKET-d6ed69efe339ce37, ESLINT-BUCKET-61d1473d84fbeea6, ESLINT-BUCKET-dd680edebf6809ff, ESLINT-BUCKET-e267f8f47c3806d3 +- **acceptance_criteria**: + - Assert each label resolves to its intended input by id/for with unique IDs across repeated components and that clicking it focuses the input. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_184` + - `mkdir -p build/eng-artifacts/T7.184` + - `web/node_modules/.bin/eslint web/js/components/preact/settings/AdvancedTab.jsx web/js/components/preact/settings/AuthTab.jsx web/js/components/preact/settings/DetectionTab.jsx web/js/components/preact/settings/GeneralTab.jsx web/js/components/preact/settings/Go2rtcTab.jsx web/js/components/preact/settings/HealthTab.jsx --format json --output-file build/eng-artifacts/T7.184/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.184/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/label-has-for'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.184`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.185: jsx-a11y/label-has-for in MqttTab.jsx, StorageTab.jsx, StreamsDefaultsTab.jsx, WorkspacesTab.jsx, TimelinePage.jsx, TimelinePlayer.jsx +- **depends_on**: [T7, T10, T7.173, T7.178, T7.174] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/settings/MqttTab.jsx`, `web/js/components/preact/settings/StorageTab.jsx`, `web/js/components/preact/settings/StreamsDefaultsTab.jsx`, `web/js/components/preact/settings/WorkspacesTab.jsx`, `web/js/components/preact/timeline/TimelinePage.jsx`, `web/js/components/preact/timeline/TimelinePlayer.jsx`, `web/tests/remediation/t7_185.spec.jsx`, `quality/evidence/T7.185.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-d5ecbc0292c55216, ESLINT-BUCKET-c067bb3093f57d49, ESLINT-BUCKET-4e8b56001c3a0722, ESLINT-BUCKET-223399111dfd4016, ESLINT-BUCKET-7d2f50f4d066f6e4, ESLINT-BUCKET-00d366c5691b4bb5 +- **acceptance_criteria**: + - Assert each label resolves to its intended input by id/for with unique IDs across repeated components and that clicking it focuses the input. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_185` + - `mkdir -p build/eng-artifacts/T7.185` + - `web/node_modules/.bin/eslint web/js/components/preact/settings/MqttTab.jsx web/js/components/preact/settings/StorageTab.jsx web/js/components/preact/settings/StreamsDefaultsTab.jsx web/js/components/preact/settings/WorkspacesTab.jsx web/js/components/preact/timeline/TimelinePage.jsx web/js/components/preact/timeline/TimelinePlayer.jsx --format json --output-file build/eng-artifacts/T7.185/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.185/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/label-has-for'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.185`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.186: jsx-a11y/label-has-for in AccessPolicyModal.jsx, AddUserModal.jsx, ApiKeyModal.jsx, AuditDecisionModes.jsx, AuditHistoryModal.jsx, EditUserModal.jsx +- **depends_on**: [T7, T10, T7.164, T7.174, T7.178] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/users/AccessPolicyModal.jsx`, `web/js/components/preact/users/AddUserModal.jsx`, `web/js/components/preact/users/ApiKeyModal.jsx`, `web/js/components/preact/users/AuditDecisionModes.jsx`, `web/js/components/preact/users/AuditHistoryModal.jsx`, `web/js/components/preact/users/EditUserModal.jsx`, `web/tests/remediation/t7_186.spec.jsx`, `quality/evidence/T7.186.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-7f43090b7b01626a, ESLINT-BUCKET-17ad0e14291e8ec3, ESLINT-BUCKET-18b7f3add93999e4, ESLINT-BUCKET-d3157833e1568912, ESLINT-BUCKET-184f5809a1f3d621, ESLINT-BUCKET-682efc8151a90daf +- **acceptance_criteria**: + - Assert each label resolves to its intended input by id/for with unique IDs across repeated components and that clicking it focuses the input. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_186` + - `mkdir -p build/eng-artifacts/T7.186` + - `web/node_modules/.bin/eslint web/js/components/preact/users/AccessPolicyModal.jsx web/js/components/preact/users/AddUserModal.jsx web/js/components/preact/users/ApiKeyModal.jsx web/js/components/preact/users/AuditDecisionModes.jsx web/js/components/preact/users/AuditHistoryModal.jsx web/js/components/preact/users/EditUserModal.jsx --format json --output-file build/eng-artifacts/T7.186/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.186/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/label-has-for'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.186`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.187: jsx-a11y/label-has-for in RoleManagerModal.jsx, TotpSetupModal.jsx +- **depends_on**: [T7, T10, T7.175] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/users/RoleManagerModal.jsx`, `web/js/components/preact/users/TotpSetupModal.jsx`, `web/tests/remediation/t7_187.spec.jsx`, `quality/evidence/T7.187.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-2e14d60ae388c180, ESLINT-BUCKET-9a54a74c58d29d4c +- **acceptance_criteria**: + - Assert each label resolves to its intended input by id/for with unique IDs across repeated components and that clicking it focuses the input. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_187` + - `mkdir -p build/eng-artifacts/T7.187` + - `web/node_modules/.bin/eslint web/js/components/preact/users/RoleManagerModal.jsx web/js/components/preact/users/TotpSetupModal.jsx --format json --output-file build/eng-artifacts/T7.187/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.187/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/label-has-for'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.187`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.188: jsx-a11y/media-has-caption in HLSVideoCell.jsx, MSEVideoCell.jsx, UI.jsx, WebRTCVideoCell.jsx, InvestigationView.jsx, TimelinePlayer.jsx +- **depends_on**: [T7, T10, T7.166, T7.167, T7.180, T7.168, T7.182, T7.185] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/HLSVideoCell.jsx`, `web/js/components/preact/MSEVideoCell.jsx`, `web/js/components/preact/UI.jsx`, `web/js/components/preact/WebRTCVideoCell.jsx`, `web/js/components/preact/investigation/InvestigationView.jsx`, `web/js/components/preact/timeline/TimelinePlayer.jsx`, `web/tests/remediation/t7_188.spec.jsx`, `quality/evidence/T7.188.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-165a348ebdcecd71, ESLINT-BUCKET-1760eab07e0cce49, ESLINT-BUCKET-df0c5f209b6ef6ab, ESLINT-BUCKET-c464a6c1e23bf196, ESLINT-BUCKET-de50a4c99ae7d421, ESLINT-BUCKET-7189b497b5a855df +- **acceptance_criteria**: + - Identify prerecorded speech versus live/silent surveillance streams; provide applicable caption support, or an explicitly reviewed narrow semantic exception with evidence. Never add a fake empty caption track. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_188` + - `mkdir -p build/eng-artifacts/T7.188` + - `web/node_modules/.bin/eslint web/js/components/preact/HLSVideoCell.jsx web/js/components/preact/MSEVideoCell.jsx web/js/components/preact/UI.jsx web/js/components/preact/WebRTCVideoCell.jsx web/js/components/preact/investigation/InvestigationView.jsx web/js/components/preact/timeline/TimelinePlayer.jsx --format json --output-file build/eng-artifacts/T7.188/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.188/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/media-has-caption'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.188`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.189: jsx-a11y/mouse-events-have-key-events in DayNightControl.jsx, HLSVideoCell.jsx, SnapshotManager.jsx, StreamCard.jsx, StreamsView.jsx, Toast.jsx +- **depends_on**: [T7, T10, T7.188, T7.167, T7.180] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/DayNightControl.jsx`, `web/js/components/preact/HLSVideoCell.jsx`, `web/js/components/preact/SnapshotManager.jsx`, `web/js/components/preact/StreamCard.jsx`, `web/js/components/preact/StreamsView.jsx`, `web/js/components/preact/Toast.jsx`, `web/tests/remediation/t7_189.spec.jsx`, `quality/evidence/T7.189.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-bc4e9a8b10d83163, ESLINT-BUCKET-c31a4d9816cac7ce, ESLINT-BUCKET-e715a00f3dbe2f4f, ESLINT-BUCKET-9a70a1ccf37b9405, ESLINT-BUCKET-e876245abbef0a79, ESLINT-BUCKET-c811624672d6bfff +- **acceptance_criteria**: + - Assert focus/blur and mouse enter/leave expose and dismiss the same content without trapping focus. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_189` + - `mkdir -p build/eng-artifacts/T7.189` + - `web/node_modules/.bin/eslint web/js/components/preact/DayNightControl.jsx web/js/components/preact/HLSVideoCell.jsx web/js/components/preact/SnapshotManager.jsx web/js/components/preact/StreamCard.jsx web/js/components/preact/StreamsView.jsx web/js/components/preact/Toast.jsx --format json --output-file build/eng-artifacts/T7.189/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.189/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/mouse-events-have-key-events'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.189`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.190: jsx-a11y/mouse-events-have-key-events in WebRTCVideoCell.jsx, RecordingsTable.jsx, TimelinePage.jsx +- **depends_on**: [T7, T10, T7.188, T7.183, T7.185] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/WebRTCVideoCell.jsx`, `web/js/components/preact/recordings/RecordingsTable.jsx`, `web/js/components/preact/timeline/TimelinePage.jsx`, `web/tests/remediation/t7_190.spec.jsx`, `quality/evidence/T7.190.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-a4f59c579d19ce1e, ESLINT-BUCKET-7a540f91903a1e57, ESLINT-BUCKET-dcdb657c2038e332 +- **acceptance_criteria**: + - Assert focus/blur and mouse enter/leave expose and dismiss the same content without trapping focus. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_190` + - `mkdir -p build/eng-artifacts/T7.190` + - `web/node_modules/.bin/eslint web/js/components/preact/WebRTCVideoCell.jsx web/js/components/preact/recordings/RecordingsTable.jsx web/js/components/preact/timeline/TimelinePage.jsx --format json --output-file build/eng-artifacts/T7.190/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.190/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/mouse-events-have-key-events'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.190`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.191: jsx-a11y/no-autofocus in AuthGate.jsx, LoginView.jsx, EventDestinationEditor.jsx, EventRouteEditor.jsx, CollectionManager.jsx, OrganizationManager.jsx +- **depends_on**: [T7, T10, T7.179, T7.181, T7.182] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/AuthGate.jsx`, `web/js/components/preact/LoginView.jsx`, `web/js/components/preact/events/EventDestinationEditor.jsx`, `web/js/components/preact/events/EventRouteEditor.jsx`, `web/js/components/preact/fleet/CollectionManager.jsx`, `web/js/components/preact/fleet/OrganizationManager.jsx`, `web/tests/remediation/t7_191.spec.jsx`, `quality/evidence/T7.191.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-20016996a3c7e096, ESLINT-BUCKET-92718cbd3fc79c29, ESLINT-BUCKET-71520b6429344586, ESLINT-BUCKET-82f90000b805b238, ESLINT-BUCKET-2acf09b0886c70c8, ESLINT-BUCKET-e6884093b3a77737 +- **acceptance_criteria**: + - Assert initial render does not steal focus; explicit dialog-open focus management must return focus to the invoker on close. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_191` + - `mkdir -p build/eng-artifacts/T7.191` + - `web/node_modules/.bin/eslint web/js/components/preact/AuthGate.jsx web/js/components/preact/LoginView.jsx web/js/components/preact/events/EventDestinationEditor.jsx web/js/components/preact/events/EventRouteEditor.jsx web/js/components/preact/fleet/CollectionManager.jsx web/js/components/preact/fleet/OrganizationManager.jsx --format json --output-file build/eng-artifacts/T7.191/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.191/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-autofocus'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.191`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.192: jsx-a11y/no-autofocus in InvestigationBookmarks.jsx, TotpSetupModal.jsx +- **depends_on**: [T7, T10, T7.182, T7.187] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/investigation/InvestigationBookmarks.jsx`, `web/js/components/preact/users/TotpSetupModal.jsx`, `web/tests/remediation/t7_192.spec.jsx`, `quality/evidence/T7.192.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-24d767472f9eac0b, ESLINT-BUCKET-6040ad491a730d6d +- **acceptance_criteria**: + - Assert initial render does not steal focus; explicit dialog-open focus management must return focus to the invoker on close. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_192` + - `mkdir -p build/eng-artifacts/T7.192` + - `web/node_modules/.bin/eslint web/js/components/preact/investigation/InvestigationBookmarks.jsx web/js/components/preact/users/TotpSetupModal.jsx --format json --output-file build/eng-artifacts/T7.192/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.192/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-autofocus'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.192`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.193: jsx-a11y/no-noninteractive-element-interactions in FisheyeEptzCanvas.jsx, StreamCard.jsx, ZoneEditor.jsx, LanguageSelector.jsx, InvestigationView.jsx, LiveBuildingPlan.jsx +- **depends_on**: [T7, T10, T7.189, T7.180, T7.162, T7.188, T7.183] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/FisheyeEptzCanvas.jsx`, `web/js/components/preact/StreamCard.jsx`, `web/js/components/preact/ZoneEditor.jsx`, `web/js/components/preact/common/LanguageSelector.jsx`, `web/js/components/preact/investigation/InvestigationView.jsx`, `web/js/components/preact/live/LiveBuildingPlan.jsx`, `web/tests/remediation/t7_193.spec.jsx`, `quality/evidence/T7.193.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-d8c2127f8046b560, ESLINT-BUCKET-e4342be069acaf24, ESLINT-BUCKET-141e103765b7c505, ESLINT-BUCKET-370c727cb2690828, ESLINT-BUCKET-bf7012d93c48094c, ESLINT-BUCKET-11c6ba5b7bf02e40 +- **acceptance_criteria**: + - Remove unintended interactive behavior from structural elements or expose correct interactive semantics; preserve nested-control propagation and keyboard behavior. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_193` + - `mkdir -p build/eng-artifacts/T7.193` + - `web/node_modules/.bin/eslint web/js/components/preact/FisheyeEptzCanvas.jsx web/js/components/preact/StreamCard.jsx web/js/components/preact/ZoneEditor.jsx web/js/components/preact/common/LanguageSelector.jsx web/js/components/preact/investigation/InvestigationView.jsx web/js/components/preact/live/LiveBuildingPlan.jsx --format json --output-file build/eng-artifacts/T7.193/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.193/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-noninteractive-element-interactions'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.193`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.194: jsx-a11y/no-noninteractive-element-interactions in LiveOperatorNavigator.jsx, RecordingsGrid.jsx, TimelineCursor.jsx, TimelineSegments.jsx, AccessPolicyModal.jsx, AddUserModal.jsx +- **depends_on**: [T7, T10, T7.183, T7.186] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/live/LiveOperatorNavigator.jsx`, `web/js/components/preact/recordings/RecordingsGrid.jsx`, `web/js/components/preact/timeline/TimelineCursor.jsx`, `web/js/components/preact/timeline/TimelineSegments.jsx`, `web/js/components/preact/users/AccessPolicyModal.jsx`, `web/js/components/preact/users/AddUserModal.jsx`, `web/tests/remediation/t7_194.spec.jsx`, `quality/evidence/T7.194.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-87cfe9ce5d499faf, ESLINT-BUCKET-4d679d89b4da6865, ESLINT-BUCKET-d670cad0625d4f2c, ESLINT-BUCKET-03caeab009bdc4fd, ESLINT-BUCKET-939df4abd7adefdd, ESLINT-BUCKET-4cf2eab3dda13b90 +- **acceptance_criteria**: + - Remove unintended interactive behavior from structural elements or expose correct interactive semantics; preserve nested-control propagation and keyboard behavior. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_194` + - `mkdir -p build/eng-artifacts/T7.194` + - `web/node_modules/.bin/eslint web/js/components/preact/live/LiveOperatorNavigator.jsx web/js/components/preact/recordings/RecordingsGrid.jsx web/js/components/preact/timeline/TimelineCursor.jsx web/js/components/preact/timeline/TimelineSegments.jsx web/js/components/preact/users/AccessPolicyModal.jsx web/js/components/preact/users/AddUserModal.jsx --format json --output-file build/eng-artifacts/T7.194/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.194/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-noninteractive-element-interactions'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.194`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.195: jsx-a11y/no-noninteractive-element-interactions in ApiKeyModal.jsx, AuditHistoryModal.jsx, EditUserModal.jsx, RoleManagerModal.jsx +- **depends_on**: [T7, T10, T7.186, T7.187] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/users/ApiKeyModal.jsx`, `web/js/components/preact/users/AuditHistoryModal.jsx`, `web/js/components/preact/users/EditUserModal.jsx`, `web/js/components/preact/users/RoleManagerModal.jsx`, `web/tests/remediation/t7_195.spec.jsx`, `quality/evidence/T7.195.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-68103860cfe78d89, ESLINT-BUCKET-be996c224380b85e, ESLINT-BUCKET-65f403c439392041, ESLINT-BUCKET-752682010e0c301c +- **acceptance_criteria**: + - Remove unintended interactive behavior from structural elements or expose correct interactive semantics; preserve nested-control propagation and keyboard behavior. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_195` + - `mkdir -p build/eng-artifacts/T7.195` + - `web/node_modules/.bin/eslint web/js/components/preact/users/ApiKeyModal.jsx web/js/components/preact/users/AuditHistoryModal.jsx web/js/components/preact/users/EditUserModal.jsx web/js/components/preact/users/RoleManagerModal.jsx --format json --output-file build/eng-artifacts/T7.195/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.195/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-noninteractive-element-interactions'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.195`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.196: jsx-a11y/no-noninteractive-tabindex in FisheyeEptzCanvas.jsx, LanguageSelector.jsx +- **depends_on**: [T7, T10, T7.193] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/FisheyeEptzCanvas.jsx`, `web/js/components/preact/common/LanguageSelector.jsx`, `web/tests/remediation/t7_196.spec.jsx`, `quality/evidence/T7.196.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-f32c4fd5a51337d3, ESLINT-BUCKET-d5958c65428cdc31 +- **acceptance_criteria**: + - Assert the tab order includes only intended interactive controls; keyboard navigation of composite widgets must follow their documented role. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_196` + - `mkdir -p build/eng-artifacts/T7.196` + - `web/node_modules/.bin/eslint web/js/components/preact/FisheyeEptzCanvas.jsx web/js/components/preact/common/LanguageSelector.jsx --format json --output-file build/eng-artifacts/T7.196/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.196/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-noninteractive-tabindex'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.196`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.197: jsx-a11y/no-static-element-interactions in GridPicker.jsx, HLSVideoCell.jsx, HealthView.jsx, LiveView.jsx, MSEVideoCell.jsx, StreamCard.jsx +- **depends_on**: [T7, T10, T7.161, T7.189, T7.179, T7.188, T7.193] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/GridPicker.jsx`, `web/js/components/preact/HLSVideoCell.jsx`, `web/js/components/preact/HealthView.jsx`, `web/js/components/preact/LiveView.jsx`, `web/js/components/preact/MSEVideoCell.jsx`, `web/js/components/preact/StreamCard.jsx`, `web/tests/remediation/t7_197.spec.jsx`, `quality/evidence/T7.197.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-45ebdb33421d89d5, ESLINT-BUCKET-d6af678aacfbb026, ESLINT-BUCKET-e48ab90f6d76f69a, ESLINT-BUCKET-6cf65d94c0e817c8, ESLINT-BUCKET-d0493f3174391c77, ESLINT-BUCKET-134e1087e8cda477 +- **acceptance_criteria**: + - Make reported actions native interactive controls or provide correct role, focus and keyboard activation; pointer and keyboard must execute the same action once. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_197` + - `mkdir -p build/eng-artifacts/T7.197` + - `web/node_modules/.bin/eslint web/js/components/preact/GridPicker.jsx web/js/components/preact/HLSVideoCell.jsx web/js/components/preact/HealthView.jsx web/js/components/preact/LiveView.jsx web/js/components/preact/MSEVideoCell.jsx web/js/components/preact/StreamCard.jsx --format json --output-file build/eng-artifacts/T7.197/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.197/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-static-element-interactions'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.197`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.198: jsx-a11y/no-static-element-interactions in StreamConfigModal.jsx, StreamsView.jsx, ToastContainer.jsx, UI.jsx, WebRTCVideoCell.jsx, ZoneEditor.jsx +- **depends_on**: [T7, T10, T7.180, T7.189, T7.162, T7.188, T7.190, T7.193] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/StreamConfigModal.jsx`, `web/js/components/preact/StreamsView.jsx`, `web/js/components/preact/ToastContainer.jsx`, `web/js/components/preact/UI.jsx`, `web/js/components/preact/WebRTCVideoCell.jsx`, `web/js/components/preact/ZoneEditor.jsx`, `web/tests/remediation/t7_198.spec.jsx`, `quality/evidence/T7.198.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-8a059d804561f236, ESLINT-BUCKET-21e6c2fa9c26c964, ESLINT-BUCKET-b18881a630321191, ESLINT-BUCKET-d9d81163d1e1193d, ESLINT-BUCKET-3322f39793a9258c, ESLINT-BUCKET-6bdf7c909180cb5e +- **acceptance_criteria**: + - Make reported actions native interactive controls or provide correct role, focus and keyboard activation; pointer and keyboard must execute the same action once. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_198` + - `mkdir -p build/eng-artifacts/T7.198` + - `web/node_modules/.bin/eslint web/js/components/preact/StreamConfigModal.jsx web/js/components/preact/StreamsView.jsx web/js/components/preact/ToastContainer.jsx web/js/components/preact/UI.jsx web/js/components/preact/WebRTCVideoCell.jsx web/js/components/preact/ZoneEditor.jsx --format json --output-file build/eng-artifacts/T7.198/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.198/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-static-element-interactions'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.198`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.199: jsx-a11y/no-static-element-interactions in ModalDialog.jsx, BulkOrganizeModal.jsx, CollectionManager.jsx, OrganizationManager.jsx, LiveBuildingPlan.jsx, LiveOperatorNavigator.jsx +- **depends_on**: [T7, T10, T7.180, T7.181, T7.191, T7.193, T7.194] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/common/ModalDialog.jsx`, `web/js/components/preact/fleet/BulkOrganizeModal.jsx`, `web/js/components/preact/fleet/CollectionManager.jsx`, `web/js/components/preact/fleet/OrganizationManager.jsx`, `web/js/components/preact/live/LiveBuildingPlan.jsx`, `web/js/components/preact/live/LiveOperatorNavigator.jsx`, `web/tests/remediation/t7_199.spec.jsx`, `quality/evidence/T7.199.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-243fa74ece4acc83, ESLINT-BUCKET-aa87081e964848f0, ESLINT-BUCKET-b9126919c0a748d2, ESLINT-BUCKET-ac70bbab0047fa80, ESLINT-BUCKET-23073b0c71d7d2e3, ESLINT-BUCKET-be705595f12d1850 +- **acceptance_criteria**: + - Make reported actions native interactive controls or provide correct role, focus and keyboard activation; pointer and keyboard must execute the same action once. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_199` + - `mkdir -p build/eng-artifacts/T7.199` + - `web/node_modules/.bin/eslint web/js/components/preact/common/ModalDialog.jsx web/js/components/preact/fleet/BulkOrganizeModal.jsx web/js/components/preact/fleet/CollectionManager.jsx web/js/components/preact/fleet/OrganizationManager.jsx web/js/components/preact/live/LiveBuildingPlan.jsx web/js/components/preact/live/LiveOperatorNavigator.jsx --format json --output-file build/eng-artifacts/T7.199/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.199/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-static-element-interactions'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.199`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.200: jsx-a11y/no-static-element-interactions in RecordingsGrid.jsx, Go2rtcTab.jsx, ClearLogsModal.jsx, RestartModal.jsx, TimelinePlayer.jsx, AccessPolicyModal.jsx +- **depends_on**: [T7, T10, T7.194, T7.184, T7.163, T7.188] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/recordings/RecordingsGrid.jsx`, `web/js/components/preact/settings/Go2rtcTab.jsx`, `web/js/components/preact/system/ClearLogsModal.jsx`, `web/js/components/preact/system/RestartModal.jsx`, `web/js/components/preact/timeline/TimelinePlayer.jsx`, `web/js/components/preact/users/AccessPolicyModal.jsx`, `web/tests/remediation/t7_200.spec.jsx`, `quality/evidence/T7.200.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-55a74c5d3180cf15, ESLINT-BUCKET-fd743aa60d9abb1f, ESLINT-BUCKET-fbc7ca1e0083c1d1, ESLINT-BUCKET-259ca1824a1d1447, ESLINT-BUCKET-c06de8e6c5473e61, ESLINT-BUCKET-6bab06cb3c8102a9 +- **acceptance_criteria**: + - Make reported actions native interactive controls or provide correct role, focus and keyboard activation; pointer and keyboard must execute the same action once. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_200` + - `mkdir -p build/eng-artifacts/T7.200` + - `web/node_modules/.bin/eslint web/js/components/preact/recordings/RecordingsGrid.jsx web/js/components/preact/settings/Go2rtcTab.jsx web/js/components/preact/system/ClearLogsModal.jsx web/js/components/preact/system/RestartModal.jsx web/js/components/preact/timeline/TimelinePlayer.jsx web/js/components/preact/users/AccessPolicyModal.jsx --format json --output-file build/eng-artifacts/T7.200/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.200/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-static-element-interactions'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.200`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.201: jsx-a11y/no-static-element-interactions in AddUserModal.jsx, ApiKeyModal.jsx, AuditHistoryModal.jsx, DeleteUserModal.jsx, EditUserModal.jsx, RoleManagerModal.jsx +- **depends_on**: [T7, T10, T7.194, T7.195, T7.164] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/users/AddUserModal.jsx`, `web/js/components/preact/users/ApiKeyModal.jsx`, `web/js/components/preact/users/AuditHistoryModal.jsx`, `web/js/components/preact/users/DeleteUserModal.jsx`, `web/js/components/preact/users/EditUserModal.jsx`, `web/js/components/preact/users/RoleManagerModal.jsx`, `web/tests/remediation/t7_201.spec.jsx`, `quality/evidence/T7.201.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-3ace786e8c2cd1a8, ESLINT-BUCKET-08d8785eb7476330, ESLINT-BUCKET-51093f104f4e1cbb, ESLINT-BUCKET-7c82f257c4fb1103, ESLINT-BUCKET-c4dd2be3483455e5, ESLINT-BUCKET-5c8c07852ed0b107 +- **acceptance_criteria**: + - Make reported actions native interactive controls or provide correct role, focus and keyboard activation; pointer and keyboard must execute the same action once. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_201` + - `mkdir -p build/eng-artifacts/T7.201` + - `web/node_modules/.bin/eslint web/js/components/preact/users/AddUserModal.jsx web/js/components/preact/users/ApiKeyModal.jsx web/js/components/preact/users/AuditHistoryModal.jsx web/js/components/preact/users/DeleteUserModal.jsx web/js/components/preact/users/EditUserModal.jsx web/js/components/preact/users/RoleManagerModal.jsx --format json --output-file build/eng-artifacts/T7.201/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.201/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-static-element-interactions'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.201`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.202: jsx-a11y/no-static-element-interactions in TotpSetupModal.jsx +- **depends_on**: [T7, T10, T7.192] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/users/TotpSetupModal.jsx`, `web/tests/remediation/t7_202.spec.jsx`, `quality/evidence/T7.202.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-e046fbe269eed0dc +- **acceptance_criteria**: + - Make reported actions native interactive controls or provide correct role, focus and keyboard activation; pointer and keyboard must execute the same action once. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_202` + - `mkdir -p build/eng-artifacts/T7.202` + - `web/node_modules/.bin/eslint web/js/components/preact/users/TotpSetupModal.jsx --format json --output-file build/eng-artifacts/T7.202/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.202/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-static-element-interactions'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.202`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.203: nullPointerArithmeticRedundantCheck in sod_img_writer.h +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_203-upstream.json`, `quality/evidence/T7.203.md`. +- **priority**: low +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-38d664fd8e77f607, CPPCHECK-3d1693ad77a15fa2, CPPCHECK-3508a7db3ef7fc03, CPPCHECK-ca79e52beb5f22bb, CPPCHECK-5941fdb9ccb989f3 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_203-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.203`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.204: nullPointerRedundantCheck in sod_img_writer.h +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_204-upstream.json`, `quality/evidence/T7.204.md`. +- **priority**: low +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-10a0fa2f24fefc90, CPPCHECK-ffdd97ac6ebb6b4b, CPPCHECK-7dc87bf617f52146, CPPCHECK-347fec696ca3fcab, CPPCHECK-1980a8233237856a +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_204-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.204`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.205: wrongPrintfScanfArgNum in linux_thermal.c +- **depends_on**: [T7, T13, T7.95] +- **agent_type**: worker +- **ownership**: `src/telemetry/collectors/linux_thermal.c`, `tests/unit/test_t7_205.c`, `tests/unit/cmake/eng/t7_205.cmake`, `quality/evidence/T7.205.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-e9cd8f29e136cbb8 +- **acceptance_criteria**: + - Exercise every reported format/library call with boundary values; argument types/counts, buffer extents and returned errors must match the library contract with no UB. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.205 --regex '^test_t7_205$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.205`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.206: zerodivcond in sod_img_reader.h +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_206-upstream.json`, `quality/evidence/T7.206.md`. +- **priority**: low +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-ac6f81ae03a685f3 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_206-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.206`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.207: arrayIndexThenCheck in sod_img_writer.h +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_207-upstream.json`, `quality/evidence/T7.207.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-8bb35cef096bd68d +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_207-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.207`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.208: constParameter in linux_network.c +- **depends_on**: [T7, T13, T7.95] +- **agent_type**: worker +- **ownership**: `src/telemetry/collectors/linux_network.c`, `tests/unit/test_t7_208.c`, `tests/unit/cmake/eng/t7_208.cmake`, `quality/evidence/T7.208.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-7e66ded89b37cb4f +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.208 --regex '^test_t7_208$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.208`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.209: constParameter in api_handlers_investigations.c +- **depends_on**: [T7, T13, T7.148] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_investigations.c`, `tests/unit/test_t7_209.c`, `tests/unit/cmake/eng/t7_209.cmake`, `quality/evidence/T7.209.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-c6d1df4e6770f40e +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.209 --regex '^test_t7_209$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.209`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.210: constParameterCallback in sod_img_reader.h, sod_img_writer.h +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_210-upstream.json`, `quality/evidence/T7.210.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-fb37582a72f59582, CPPCHECK-BUCKET-c7b3ef530f996e26 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_210-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.210`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.211: constParameterCallback in storage_migration.c +- **depends_on**: [T7, T13, T7.138] +- **agent_type**: worker +- **ownership**: `src/storage/storage_migration.c`, `tests/unit/test_t7_211.c`, `tests/unit/cmake/eng/t7_211.cmake`, `quality/evidence/T7.211.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-90ec02278e01bcac +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.211 --regex '^test_t7_211$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.211`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.212: constParameterCallback in yaml_redact.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/utils/yaml_redact.c`, `tests/unit/test_t7_212.c`, `tests/unit/cmake/eng/t7_212.cmake`, `quality/evidence/T7.212.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-6291a48798ed350c +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.212 --regex '^test_t7_212$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.212`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.213: constParameterCallback in api_detection.c +- **depends_on**: [T7, T13, T7.112] +- **agent_type**: worker +- **ownership**: `src/video/api_detection.c`, `tests/unit/test_t7_213.c`, `tests/unit/cmake/eng/t7_213.cmake`, `quality/evidence/T7.213.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-681aedac30d87a1e +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.213 --regex '^test_t7_213$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.213`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.214: constParameterCallback in go2rtc_api.c, go2rtc_integration.c, go2rtc_snapshot.c +- **depends_on**: [T7, T13, T7.98, T7.154] +- **agent_type**: worker +- **ownership**: `src/video/go2rtc/go2rtc_api.c`, `src/video/go2rtc/go2rtc_integration.c`, `src/video/go2rtc/go2rtc_snapshot.c`, `tests/unit/test_t7_214.c`, `tests/unit/cmake/eng/t7_214.cmake`, `quality/evidence/T7.214.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-ee781b371da39bf5, CPPCHECK-BUCKET-dc056676c7084f53, CPPCHECK-BUCKET-0130dae8fb623afa +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.214 --regex '^test_t7_214$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.214`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.215: constParameterCallback in onvif_detection.c +- **depends_on**: [T7, T13, T7.146] +- **agent_type**: worker +- **ownership**: `src/video/onvif_detection.c`, `tests/unit/test_t7_215.c`, `tests/unit/cmake/eng/t7_215.cmake`, `quality/evidence/T7.215.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-365ebbda46eacf74 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.215 --regex '^test_t7_215$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.215`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.216: constParameterCallback in onvif_device_management.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/onvif_device_management.c`, `tests/unit/test_t7_216.c`, `tests/unit/cmake/eng/t7_216.cmake`, `quality/evidence/T7.216.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-8737ababcc06f484 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.216 --regex '^test_t7_216$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.216`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.217: constParameterCallback in onvif_imaging.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/onvif_imaging.c`, `tests/unit/test_t7_217.c`, `tests/unit/cmake/eng/t7_217.cmake`, `quality/evidence/T7.217.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-baf28ba17bc25dd0 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.217 --regex '^test_t7_217$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.217`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.218: constParameterCallback in onvif_ptz.c +- **depends_on**: [T7, T13, T7.156] +- **agent_type**: worker +- **ownership**: `src/video/onvif_ptz.c`, `tests/unit/test_t7_218.c`, `tests/unit/cmake/eng/t7_218.cmake`, `quality/evidence/T7.218.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-462bf13ae3867115 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.218 --regex '^test_t7_218$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.218`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.219: constParameterCallback in api_handlers_go2rtc_proxy.c +- **depends_on**: [T7, T13, T7.147] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_go2rtc_proxy.c`, `tests/unit/test_t7_219.c`, `tests/unit/cmake/eng/t7_219.cmake`, `quality/evidence/T7.219.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-b6f82c4c9b287eba +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.219 --regex '^test_t7_219$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.219`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.220: constParameterCallback in api_handlers_health.c +- **depends_on**: [T7, T13, T7.158] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_health.c`, `tests/unit/test_t7_220.c`, `tests/unit/cmake/eng/t7_220.cmake`, `quality/evidence/T7.220.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-c7a8e9a51802c60d +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.220 --regex '^test_t7_220$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.220`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.221: constParameterCallback in go2rtc_proxy_thread.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/go2rtc_proxy_thread.c`, `tests/unit/test_t7_221.c`, `tests/unit/cmake/eng/t7_221.cmake`, `quality/evidence/T7.221.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-d3985740b2ac6585 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.221 --regex '^test_t7_221$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.221`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.222: constParameterPointer in sod_img_reader.h, sod_img_writer.h +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_222-upstream.json`, `quality/evidence/T7.222.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-82a085f0cc04468f, CPPCHECK-BUCKET-27ab7ab1e74c2e72 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_222-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.222`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.223: constParameterPointer in authorization.c +- **depends_on**: [T7, T13, T7.114] +- **agent_type**: worker +- **ownership**: `src/core/authorization.c`, `tests/unit/test_t7_223.c`, `tests/unit/cmake/eng/t7_223.cmake`, `quality/evidence/T7.223.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-d0de2e4ac47c3191 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.223 --regex '^test_t7_223$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.223`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.224: constParameterPointer in mqtt_destination_client.c +- **depends_on**: [T7, T13, T7.134] +- **agent_type**: worker +- **ownership**: `src/core/mqtt_destination_client.c`, `tests/unit/test_t7_224.c`, `tests/unit/cmake/eng/t7_224.cmake`, `quality/evidence/T7.224.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-fbb9e9402242eaba +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.224 --regex '^test_t7_224$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.224`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.225: constParameterPointer in db_camera_collections.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_camera_collections.c`, `tests/unit/test_t7_225.c`, `tests/unit/cmake/eng/t7_225.cmake`, `quality/evidence/T7.225.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-fd8d6a4b8cc77400 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.225 --regex '^test_t7_225$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.225`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.226: constParameterPointer in ezxml.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_226-upstream.json`, `quality/evidence/T7.226.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-43fcd9340a9e63ed +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_226-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.226`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.227: constParameterPointer in sod.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_227-upstream.json`, `quality/evidence/T7.227.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-e7f8f80f0cd95f0d +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_227-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.227`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.228: constParameterPointer in linux_cgroup.c +- **depends_on**: [T7, T13, T7.83] +- **agent_type**: worker +- **ownership**: `src/telemetry/collectors/linux_cgroup.c`, `tests/unit/test_t7_228.c`, `tests/unit/cmake/eng/t7_228.cmake`, `quality/evidence/T7.228.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-70e0496568faa30f +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.228 --regex '^test_t7_228$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.228`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.229: constParameterPointer in nvme_provider.c +- **depends_on**: [T7, T13, T7.76] +- **agent_type**: worker +- **ownership**: `src/telemetry/providers/nvme_provider.c`, `tests/unit/test_t7_229.c`, `tests/unit/cmake/eng/t7_229.cmake`, `quality/evidence/T7.229.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-5bdf073f41a6c65d +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.229 --regex '^test_t7_229$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.229`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.230: constParameterPointer in system_health_evaluator.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/telemetry/system_health_evaluator.c`, `tests/unit/test_t7_230.c`, `tests/unit/cmake/eng/t7_230.cmake`, `quality/evidence/T7.230.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-527aa4750d3ac84a +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.230 --regex '^test_t7_230$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.230`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.231: constParameterPointer in go2rtc_base_path.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/utils/go2rtc_base_path.c`, `tests/unit/test_t7_231.c`, `tests/unit/cmake/eng/t7_231.cmake`, `quality/evidence/T7.231.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-d9684d3aa203568c +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.231 --regex '^test_t7_231$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.231`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.232: constParameterPointer in strings.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/utils/strings.c`, `tests/unit/test_t7_232.c`, `tests/unit/cmake/eng/t7_232.cmake`, `quality/evidence/T7.232.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-e228634622467328 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.232 --regex '^test_t7_232$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.232`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.233: constParameterPointer in faac_encoder.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/faac_encoder.c`, `tests/unit/test_t7_233.c`, `tests/unit/cmake/eng/t7_233.cmake`, `quality/evidence/T7.233.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-bdb708e597b5cade +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.233 --regex '^test_t7_233$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.233`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.234: constParameterPointer in hls_unified_thread.c +- **depends_on**: [T7, T13, T7.69] +- **agent_type**: worker +- **ownership**: `src/video/hls/hls_unified_thread.c`, `tests/unit/test_t7_234.c`, `tests/unit/cmake/eng/t7_234.cmake`, `quality/evidence/T7.234.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-cbab871259b9963d +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.234 --regex '^test_t7_234$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.234`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.235: constParameterPointer in unified_detection_thread.c +- **depends_on**: [T7, T13, T7.122] +- **agent_type**: worker +- **ownership**: `src/video/unified_detection_thread.c`, `tests/unit/test_t7_235.c`, `tests/unit/cmake/eng/t7_235.cmake`, `quality/evidence/T7.235.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-8c644cc847574bfe +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.235 --regex '^test_t7_235$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.235`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.236: constParameterPointer in go2rtc_websocket.c +- **depends_on**: [T7, T13, T7.150] +- **agent_type**: worker +- **ownership**: `src/web/go2rtc_websocket.c`, `tests/unit/test_t7_236.c`, `tests/unit/cmake/eng/t7_236.cmake`, `quality/evidence/T7.236.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-4c0052bc9de6e496 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.236 --regex '^test_t7_236$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.236`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.237: constParameterPointer in recording_archive.c +- **depends_on**: [T7, T13, T7.141] +- **agent_type**: worker +- **ownership**: `src/web/recording_archive.c`, `tests/unit/test_t7_237.c`, `tests/unit/cmake/eng/t7_237.cmake`, `quality/evidence/T7.237.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-45cfee19afe8668f +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.237 --regex '^test_t7_237$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.237`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.238: constVariable in sod_img_reader.h, sod_img_writer.h +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_238-upstream.json`, `quality/evidence/T7.238.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-933d7ae37be3c395, CPPCHECK-BUCKET-b1c0c559c6e17a23 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_238-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.238`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.239: constVariable in mqtt_delivery_worker.c +- **depends_on**: [T7, T13, T7.91] +- **agent_type**: worker +- **ownership**: `src/core/mqtt_delivery_worker.c`, `tests/unit/test_t7_239.c`, `tests/unit/cmake/eng/t7_239.cmake`, `quality/evidence/T7.239.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-8596888f0dd1cc7e +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.239 --regex '^test_t7_239$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.239`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.240: constVariable in sod.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_240-upstream.json`, `quality/evidence/T7.240.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-298feb4a490d6252 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_240-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.240`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.241: constVariable in sod_ingenic_mxu.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_241-upstream.json`, `quality/evidence/T7.241.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-a8ce2c3168c021de +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_241-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.241`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.242: constVariablePointer in sod_img_reader.h, sod_img_writer.h +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_242-upstream.json`, `quality/evidence/T7.242.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-9575437f939001d5, CPPCHECK-BUCKET-df230b0a5672f192 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_242-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.242`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.243: constVariablePointer in path_utils.c +- **depends_on**: [T7, T13, T7.128] +- **agent_type**: worker +- **ownership**: `src/core/path_utils.c`, `tests/unit/test_t7_243.c`, `tests/unit/cmake/eng/t7_243.cmake`, `quality/evidence/T7.243.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-8e110c5360beb299 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.243 --regex '^test_t7_243$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.243`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.244: constVariablePointer in db_auth.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_auth.c`, `tests/unit/test_t7_244.c`, `tests/unit/cmake/eng/t7_244.cmake`, `quality/evidence/T7.244.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-6c5cf9bd3f338f84 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.244 --regex '^test_t7_244$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.244`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.245: constVariablePointer in db_authorization.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_authorization.c`, `tests/unit/test_t7_245.c`, `tests/unit/cmake/eng/t7_245.cmake`, `quality/evidence/T7.245.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-08f60b7ec76ce9d3 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.245 --regex '^test_t7_245$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.245`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.246: constVariablePointer in db_camera_tags.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_camera_tags.c`, `tests/unit/test_t7_246.c`, `tests/unit/cmake/eng/t7_246.cmake`, `quality/evidence/T7.246.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-7e7f6cc12d937123 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.246 --regex '^test_t7_246$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.246`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.247: constVariablePointer in db_core.c +- **depends_on**: [T7, T13, T7.25] +- **agent_type**: worker +- **ownership**: `src/database/db_core.c`, `tests/unit/test_t7_247.c`, `tests/unit/cmake/eng/t7_247.cmake`, `quality/evidence/T7.247.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-f21c65912e355ace +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.247 --regex '^test_t7_247$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.247`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.248: constVariablePointer in db_fleet_query.c +- **depends_on**: [T7, T13, T7.113] +- **agent_type**: worker +- **ownership**: `src/database/db_fleet_query.c`, `tests/unit/test_t7_248.c`, `tests/unit/cmake/eng/t7_248.cmake`, `quality/evidence/T7.248.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-9f651ab0c8ea6422 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.248 --regex '^test_t7_248$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.248`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.249: constVariablePointer in db_storage_lifecycle.c +- **depends_on**: [T7, T13, T7.129] +- **agent_type**: worker +- **ownership**: `src/database/db_storage_lifecycle.c`, `tests/unit/test_t7_249.c`, `tests/unit/cmake/eng/t7_249.cmake`, `quality/evidence/T7.249.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-353deb8bba479029 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.249 --regex '^test_t7_249$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.249`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.250: constVariablePointer in ezxml.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_250-upstream.json`, `quality/evidence/T7.250.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-c6ee03168003661f +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_250-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.250`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.251: constVariablePointer in sod.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_251-upstream.json`, `quality/evidence/T7.251.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-5d8aaf042fefce78 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_251-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.251`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.252: constVariablePointer in storage_deletion.c +- **depends_on**: [T7, T13, T7.137] +- **agent_type**: worker +- **ownership**: `src/storage/storage_deletion.c`, `tests/unit/test_t7_252.c`, `tests/unit/cmake/eng/t7_252.cmake`, `quality/evidence/T7.252.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-b4e128a1af325d4f +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.252 --regex '^test_t7_252$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.252`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.253: constVariablePointer in storage_source.c +- **depends_on**: [T7, T13, T7.140] +- **agent_type**: worker +- **ownership**: `src/storage/storage_source.c`, `tests/unit/test_t7_253.c`, `tests/unit/cmake/eng/t7_253.cmake`, `quality/evidence/T7.253.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-77479b4ba7ef9849 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.253 --regex '^test_t7_253$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.253`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.254: constVariablePointer in linux_network.c, linux_process.c, linux_thermal.c +- **depends_on**: [T7, T13, T7.208, T7.95, T7.205] +- **agent_type**: worker +- **ownership**: `src/telemetry/collectors/linux_network.c`, `src/telemetry/collectors/linux_process.c`, `src/telemetry/collectors/linux_thermal.c`, `tests/unit/test_t7_254.c`, `tests/unit/cmake/eng/t7_254.cmake`, `quality/evidence/T7.254.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-c9404ed2a73b0977, CPPCHECK-BUCKET-e924700b1413accd, CPPCHECK-BUCKET-2ca7413944026780 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.254 --regex '^test_t7_254$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.254`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.255: constVariablePointer in linux_device_map.c, linux_hardware.c, nvme_provider.c +- **depends_on**: [T7, T13, T7.143, T7.229] +- **agent_type**: worker +- **ownership**: `src/telemetry/providers/linux_device_map.c`, `src/telemetry/providers/linux_hardware.c`, `src/telemetry/providers/nvme_provider.c`, `tests/unit/test_t7_255.c`, `tests/unit/cmake/eng/t7_255.cmake`, `quality/evidence/T7.255.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-a1edb744b382f8f5, CPPCHECK-BUCKET-4001e3b91223c7ad, CPPCHECK-BUCKET-ae15015525d96c08 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.255 --regex '^test_t7_255$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.255`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.256: constVariablePointer in system_health.c +- **depends_on**: [T7, T13, T7.59] +- **agent_type**: worker +- **ownership**: `src/telemetry/system_health.c`, `tests/unit/test_t7_256.c`, `tests/unit/cmake/eng/t7_256.cmake`, `quality/evidence/T7.256.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-f3bb2108694b562f +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.256 --regex '^test_t7_256$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.256`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.257: constVariablePointer in system_health_evaluator.c +- **depends_on**: [T7, T13, T7.230] +- **agent_type**: worker +- **ownership**: `src/telemetry/system_health_evaluator.c`, `tests/unit/test_t7_257.c`, `tests/unit/cmake/eng/t7_257.cmake`, `quality/evidence/T7.257.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-57093ce27e4aabc5 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.257 --regex '^test_t7_257$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.257`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.258: constVariablePointer in go2rtc_base_path.c +- **depends_on**: [T7, T13, T7.231] +- **agent_type**: worker +- **ownership**: `src/utils/go2rtc_base_path.c`, `tests/unit/test_t7_258.c`, `tests/unit/cmake/eng/t7_258.cmake`, `quality/evidence/T7.258.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-4dc0544d99c6a120 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.258 --regex '^test_t7_258$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.258`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.259: constVariablePointer in detection_model.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/detection_model.c`, `tests/unit/test_t7_259.c`, `tests/unit/cmake/eng/t7_259.cmake`, `quality/evidence/T7.259.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-aa0082260172b3b9 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.259 --regex '^test_t7_259$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.259`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.260: constVariablePointer in go2rtc_integration.c, go2rtc_process.c +- **depends_on**: [T7, T13, T7.214, T7.145] +- **agent_type**: worker +- **ownership**: `src/video/go2rtc/go2rtc_integration.c`, `src/video/go2rtc/go2rtc_process.c`, `tests/unit/test_t7_260.c`, `tests/unit/cmake/eng/t7_260.cmake`, `quality/evidence/T7.260.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-5f736ad7b9095aea, CPPCHECK-BUCKET-eabea03354c7b4b7 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.260 --regex '^test_t7_260$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.260`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.261: constVariablePointer in mp4_recording_core.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/mp4_recording_core.c`, `tests/unit/test_t7_261.c`, `tests/unit/cmake/eng/t7_261.cmake`, `quality/evidence/T7.261.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-e9a38e72fa2e4a7c +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.261 --regex '^test_t7_261$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.261`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.262: constVariablePointer in mp4_recording_writer.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/mp4_recording_writer.c`, `tests/unit/test_t7_262.c`, `tests/unit/cmake/eng/t7_262.cmake`, `quality/evidence/T7.262.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-3ec7089cfaa16e94 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.262 --regex '^test_t7_262$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.262`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.263: constVariablePointer in stream_state_adapter.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/stream_state_adapter.c`, `tests/unit/test_t7_263.c`, `tests/unit/cmake/eng/t7_263.cmake`, `quality/evidence/T7.263.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-4ffd5c5d72b2c6a0 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.263 --regex '^test_t7_263$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.263`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.264: constVariablePointer in api_handlers_go2rtc_proxy.c +- **depends_on**: [T7, T13, T7.219] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_go2rtc_proxy.c`, `tests/unit/test_t7_264.c`, `tests/unit/cmake/eng/t7_264.cmake`, `quality/evidence/T7.264.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-f4469b09cc19dae9 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.264 --regex '^test_t7_264$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.264`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.265: constVariablePointer in api_handlers_recordings_list.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_recordings_list.c`, `tests/unit/test_t7_265.c`, `tests/unit/cmake/eng/t7_265.cmake`, `quality/evidence/T7.265.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-611000c5c122ad1e +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.265 --regex '^test_t7_265$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.265`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.266: constVariablePointer in api_handlers_recordings_thumbnail.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_recordings_thumbnail.c`, `tests/unit/test_t7_266.c`, `tests/unit/cmake/eng/t7_266.cmake`, `quality/evidence/T7.266.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-d41611e4fb1c1abd +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.266 --regex '^test_t7_266$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.266`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.267: constVariablePointer in api_handlers_system_logs.c +- **depends_on**: [T7, T13, T7.149] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_system_logs.c`, `tests/unit/test_t7_267.c`, `tests/unit/cmake/eng/t7_267.cmake`, `quality/evidence/T7.267.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-b14c25475c91b307 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.267 --regex '^test_t7_267$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.267`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.268: constVariablePointer in api_handlers_timeline.c +- **depends_on**: [T7, T13, T7.107] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_timeline.c`, `tests/unit/test_t7_268.c`, `tests/unit/cmake/eng/t7_268.cmake`, `quality/evidence/T7.268.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-03f92e362a140589 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.268 --regex '^test_t7_268$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.268`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.269: constVariablePointer in api_handlers_users_backend_agnostic.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_users_backend_agnostic.c`, `tests/unit/test_t7_269.c`, `tests/unit/cmake/eng/t7_269.cmake`, `quality/evidence/T7.269.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-d45c6fa42b05db96 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.269 --regex '^test_t7_269$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.269`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.270: constVariablePointer in httpd_utils.c +- **depends_on**: [T7, T13, T7.133] +- **agent_type**: worker +- **ownership**: `src/web/httpd_utils.c`, `tests/unit/test_t7_270.c`, `tests/unit/cmake/eng/t7_270.cmake`, `quality/evidence/T7.270.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-9551a431943d8273 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.270 --regex '^test_t7_270$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.270`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.271: duplicateAssignExpression in sod.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_271-upstream.json`, `quality/evidence/T7.271.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-86335be98f6f2e90 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_271-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.271`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.272: duplicateCondition in motion_detection.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/motion_detection.c`, `tests/unit/test_t7_272.c`, `tests/unit/cmake/eng/t7_272.cmake`, `quality/evidence/T7.272.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-f814692d9029a8a1 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.272 --regex '^test_t7_272$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.272`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.273: js/unused-local-variable in LanguageSelector.jsx +- **depends_on**: [T7, T10, T7.196] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/common/LanguageSelector.jsx`, `web/tests/remediation/t7_273.spec.jsx`, `quality/evidence/T7.273.md`. +- **priority**: info +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: CODEQUALITY-941 +- **acceptance_criteria**: + - Remove only the proven unused binding; assert language selection/persistence and localized rendering still work. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_273` + - `mkdir -p build/eng-artifacts/T7.273` + - `web/node_modules/.bin/eslint web/js/components/preact/common/LanguageSelector.jsx --format json --output-file build/eng-artifacts/T7.273/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.273/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'js/unused-local-variable'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.273`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.274: knownConditionTrueFalse in sod_img_reader.h +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_274-upstream.json`, `quality/evidence/T7.274.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-1f586f8741e770e9 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_274-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.274`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.275: knownConditionTrueFalse in event_router.c +- **depends_on**: [T7, T13, T7.90] +- **agent_type**: worker +- **ownership**: `src/core/event_router.c`, `tests/unit/test_t7_275.c`, `tests/unit/cmake/eng/t7_275.cmake`, `quality/evidence/T7.275.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-95058fe138843b1f +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.275 --regex '^test_t7_275$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.275`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.276: knownConditionTrueFalse in mqtt_event_adapter.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/core/mqtt_event_adapter.c`, `tests/unit/test_t7_276.c`, `tests/unit/cmake/eng/t7_276.cmake`, `quality/evidence/T7.276.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-9c71189558451cd4 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.276 --regex '^test_t7_276$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.276`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.277: knownConditionTrueFalse in db_storage_targets.c +- **depends_on**: [T7, T13, T7.136] +- **agent_type**: worker +- **ownership**: `src/database/db_storage_targets.c`, `tests/unit/test_t7_277.c`, `tests/unit/cmake/eng/t7_277.cmake`, `quality/evidence/T7.277.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-2f8dc61aeb7cdda6 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.277 --regex '^test_t7_277$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.277`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.278: knownConditionTrueFalse in ezxml.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_278-upstream.json`, `quality/evidence/T7.278.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-c7e9176ca688d280 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_278-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.278`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.279: knownConditionTrueFalse in sod.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_279-upstream.json`, `quality/evidence/T7.279.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-064299ecf7d09b55 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_279-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.279`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.280: knownConditionTrueFalse in linux_process.c +- **depends_on**: [T7, T13, T7.254] +- **agent_type**: worker +- **ownership**: `src/telemetry/collectors/linux_process.c`, `tests/unit/test_t7_280.c`, `tests/unit/cmake/eng/t7_280.cmake`, `quality/evidence/T7.280.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-28b7ea4b18c686f4 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.280 --regex '^test_t7_280$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.280`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.281: knownConditionTrueFalse in health_helper_runner.c +- **depends_on**: [T7, T13, T7.68] +- **agent_type**: worker +- **ownership**: `src/telemetry/health_helper_runner.c`, `tests/unit/test_t7_281.c`, `tests/unit/cmake/eng/t7_281.cmake`, `quality/evidence/T7.281.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-1ac7ae81e97d3df2 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.281 --regex '^test_t7_281$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.281`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.282: knownConditionTrueFalse in api_handlers_imaging.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_imaging.c`, `tests/unit/test_t7_282.c`, `tests/unit/cmake/eng/t7_282.cmake`, `quality/evidence/T7.282.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-0251d17e5b89df2a +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.282 --regex '^test_t7_282$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.282`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.283: redundantCondition in sod_img_reader.h +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_283-upstream.json`, `quality/evidence/T7.283.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-eee46ed30daef891 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_283-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.283`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.284: redundantInitialization in sod_img_reader.h +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_284-upstream.json`, `quality/evidence/T7.284.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-dcdbd8e6357d7e12 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_284-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.284`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.285: redundantInitialization in db_authorization.c +- **depends_on**: [T7, T13, T7.245] +- **agent_type**: worker +- **ownership**: `src/database/db_authorization.c`, `tests/unit/test_t7_285.c`, `tests/unit/cmake/eng/t7_285.cmake`, `quality/evidence/T7.285.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-bbeef7abfa51d073 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.285 --regex '^test_t7_285$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.285`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.286: redundantInitialization in recording_path.c +- **depends_on**: [T7, T13, T7.157] +- **agent_type**: worker +- **ownership**: `src/video/recording_path.c`, `tests/unit/test_t7_286.c`, `tests/unit/cmake/eng/t7_286.cmake`, `quality/evidence/T7.286.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-0be349a4e3fc0518 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.286 --regex '^test_t7_286$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.286`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.287: redundantPointerOp in sod.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_287-upstream.json`, `quality/evidence/T7.287.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-8f929a70e127f155 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_287-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.287`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.288: shadowFunction in db_storage_targets.c +- **depends_on**: [T7, T13, T7.277] +- **agent_type**: worker +- **ownership**: `src/database/db_storage_targets.c`, `tests/unit/test_t7_288.c`, `tests/unit/cmake/eng/t7_288.cmake`, `quality/evidence/T7.288.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-147fba26f7ae351b +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.288 --regex '^test_t7_288$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.288`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.289: shadowFunction in stream_manager.c +- **depends_on**: [T7, T13, T7.62] +- **agent_type**: worker +- **ownership**: `src/video/stream_manager.c`, `tests/unit/test_t7_289.c`, `tests/unit/cmake/eng/t7_289.cmake`, `quality/evidence/T7.289.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-05b22ae697eaa4ca +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.289 --regex '^test_t7_289$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.289`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.290: shadowVariable in config.h +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `include/core/config.h`, `tests/unit/test_t7_290.c`, `tests/unit/cmake/eng/t7_290.cmake`, `quality/evidence/T7.290.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-9d2c058ee958f85a +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.290 --regex '^test_t7_290$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.290`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.291: unpreciseMathCall in sod.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_291-upstream.json`, `quality/evidence/T7.291.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-426773bc9bc5a5d5 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_291-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.291`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.292: unreadVariable in sod_img_reader.h +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_292-upstream.json`, `quality/evidence/T7.292.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-eda9b7001501e847 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_292-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.292`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.293: unreadVariable in mqtt_client.c +- **depends_on**: [T7, T13, T7.29] +- **agent_type**: worker +- **ownership**: `src/core/mqtt_client.c`, `tests/unit/test_t7_293.c`, `tests/unit/cmake/eng/t7_293.cmake`, `quality/evidence/T7.293.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-779ca0994d939da1 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.293 --regex '^test_t7_293$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.293`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.294: unreadVariable in sod.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_294-upstream.json`, `quality/evidence/T7.294.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-93112ea9a6a3c10d +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_294-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.294`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.295: unreadVariable in onvif_ptz.c +- **depends_on**: [T7, T13, T7.218] +- **agent_type**: worker +- **ownership**: `src/video/onvif_ptz.c`, `tests/unit/test_t7_295.c`, `tests/unit/cmake/eng/t7_295.cmake`, `quality/evidence/T7.295.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-b1b17a4b9a2646a0 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.295 --regex '^test_t7_295$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.295`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.296: unsignedLessThanZero in sod.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_296-upstream.json`, `quality/evidence/T7.296.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-a4ae78869ec196b6 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_296-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.296`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.297: unusedStructMember in mqtt_destination_client.c +- **depends_on**: [T7, T13, T7.224] +- **agent_type**: worker +- **ownership**: `src/core/mqtt_destination_client.c`, `tests/unit/test_t7_297.c`, `tests/unit/cmake/eng/t7_297.cmake`, `quality/evidence/T7.297.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-efd7988ca87c95ed +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.297 --regex '^test_t7_297$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.297`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.298: unusedStructMember in sod.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_298-upstream.json`, `quality/evidence/T7.298.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-49117790281d294c +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_298-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.298`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.299: unusedStructMember in sod_detection.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/sod_detection.c`, `tests/unit/test_t7_299.c`, `tests/unit/cmake/eng/t7_299.cmake`, `quality/evidence/T7.299.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-a12a87ba590d2536 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.299 --regex '^test_t7_299$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.299`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.300: uselessAssignmentArg in sod.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_300-upstream.json`, `quality/evidence/T7.300.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-56c122b53a2e50cb +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_300-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.300`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.301: variableScope in sod_img_reader.h, sod_img_writer.h +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_301-upstream.json`, `quality/evidence/T7.301.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-ae4dbf08b9cfd1fe, CPPCHECK-BUCKET-b9ff6009cfa26f69 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_301-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.301`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.302: variableScope in db_detection_engines.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_detection_engines.c`, `tests/unit/test_t7_302.c`, `tests/unit/cmake/eng/t7_302.cmake`, `quality/evidence/T7.302.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-b614f3b94230fe9a +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.302 --regex '^test_t7_302$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.302`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.303: variableScope in db_lpr_reads.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_lpr_reads.c`, `tests/unit/test_t7_303.c`, `tests/unit/cmake/eng/t7_303.cmake`, `quality/evidence/T7.303.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-664e70c550c3ef36 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.303 --regex '^test_t7_303$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.303`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.304: variableScope in db_recordings.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_recordings.c`, `tests/unit/test_t7_304.c`, `tests/unit/cmake/eng/t7_304.cmake`, `quality/evidence/T7.304.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-2afdb0b1f1146eeb +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.304 --regex '^test_t7_304$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.304`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.305: variableScope in ezxml.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_305-upstream.json`, `quality/evidence/T7.305.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-96d5b13210206feb +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_305-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.305`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.306: variableScope in sod.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_306-upstream.json`, `quality/evidence/T7.306.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-50bc6e286ac69abd +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_306-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.306`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.307: variableScope in storage_deletion.c +- **depends_on**: [T7, T13, T7.252] +- **agent_type**: worker +- **ownership**: `src/storage/storage_deletion.c`, `tests/unit/test_t7_307.c`, `tests/unit/cmake/eng/t7_307.cmake`, `quality/evidence/T7.307.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-89a47a59067748c1 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.307 --regex '^test_t7_307$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.307`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.308: variableScope in storage_migration.c +- **depends_on**: [T7, T13, T7.211] +- **agent_type**: worker +- **ownership**: `src/storage/storage_migration.c`, `tests/unit/test_t7_308.c`, `tests/unit/cmake/eng/t7_308.cmake`, `quality/evidence/T7.308.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-da5006735d5c5165 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.308 --regex '^test_t7_308$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.308`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.309: variableScope in storage_placement.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/storage/storage_placement.c`, `tests/unit/test_t7_309.c`, `tests/unit/cmake/eng/t7_309.cmake`, `quality/evidence/T7.309.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-51dd1a644803f48d +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.309 --regex '^test_t7_309$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.309`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.310: variableScope in storage_s3.c +- **depends_on**: [T7, T13, T7.142] +- **agent_type**: worker +- **ownership**: `src/storage/storage_s3.c`, `tests/unit/test_t7_310.c`, `tests/unit/cmake/eng/t7_310.cmake`, `quality/evidence/T7.310.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-a3e8d56a93d61112 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.310 --regex '^test_t7_310$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.310`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.311: variableScope in linux_cgroup.c, linux_thermal.c +- **depends_on**: [T7, T13, T7.228, T7.254] +- **agent_type**: worker +- **ownership**: `src/telemetry/collectors/linux_cgroup.c`, `src/telemetry/collectors/linux_thermal.c`, `tests/unit/test_t7_311.c`, `tests/unit/cmake/eng/t7_311.cmake`, `quality/evidence/T7.311.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-771b3fde1937be8a, CPPCHECK-BUCKET-e4dae70b5d1bd770 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.311 --regex '^test_t7_311$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.311`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.312: variableScope in stream_metrics.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/telemetry/stream_metrics.c`, `tests/unit/test_t7_312.c`, `tests/unit/cmake/eng/t7_312.cmake`, `quality/evidence/T7.312.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-9cc73ce911540ad4 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.312 --regex '^test_t7_312$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.312`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.313: variableScope in api_detection.c +- **depends_on**: [T7, T13, T7.213] +- **agent_type**: worker +- **ownership**: `src/video/api_detection.c`, `tests/unit/test_t7_313.c`, `tests/unit/cmake/eng/t7_313.cmake`, `quality/evidence/T7.313.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-905555e786df0459 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.313 --regex '^test_t7_313$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.313`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.314: variableScope in hls_directory.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/hls/hls_directory.c`, `tests/unit/test_t7_314.c`, `tests/unit/cmake/eng/t7_314.cmake`, `quality/evidence/T7.314.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-5d0aacd6263110c5 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.314 --regex '^test_t7_314$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.314`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.315: variableScope in recording_transcode.c +- **depends_on**: [T7, T13, T7.66] +- **agent_type**: worker +- **ownership**: `src/video/recording_transcode.c`, `tests/unit/test_t7_315.c`, `tests/unit/cmake/eng/t7_315.cmake`, `quality/evidence/T7.315.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-ec17ee32f6d27cdb +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.315 --regex '^test_t7_315$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.315`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.316: variableScope in unified_detection_thread.c +- **depends_on**: [T7, T13, T7.235] +- **agent_type**: worker +- **ownership**: `src/video/unified_detection_thread.c`, `tests/unit/test_t7_316.c`, `tests/unit/cmake/eng/t7_316.cmake`, `quality/evidence/T7.316.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-d4393cc822a0c2d3 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.316 --regex '^test_t7_316$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.316`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.317: Authenticate before exposing stream existence +- **depends_on**: [T7, T11, T13, T7.64, T7.50] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_streams_get.c`, `src/web/api_handlers_streams_modify.c`, `tests/integration/specs/t7_317.api.spec.ts`, `quality/evidence/T7.317.md`. +- **priority**: medium +- **description**: Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect. +- **findings**: F-T11-01 +- **acceptance_criteria**: + - Unauthenticated known and unknown names both return the authentication failure; authenticated unauthorized users retain intentional policy response without leaking privileged data. + - Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage. +- **validation**: + - `node scripts/quality/run-integration.mjs --task T7.317 --project api --grep @t7_317` + - `npm run typecheck:tests` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.318: Correct documented Streams wire examples +- **depends_on**: [T7, T11, T7.319, T7.320, T7.321, T7.322, T7.323, T7.324, T7.325, T7.326, T7.327, T7.328, T7.329, T7.330, T7.331, T7.332, T7.333] +- **agent_type**: worker +- **ownership**: `docs/API.md`, `quality/evidence/T7.318.md`. +- **priority**: medium +- **description**: Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Update documentation only after the wire behavior is reconciled. +- **findings**: F-T11-02 +- **acceptance_criteria**: + - Examples use the real array/page envelopes, integer percentage threshold and emitted names/statuses; every example maps to the revised contract. + - Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage. +- **validation**: + - `python3 scripts/check_docs_links.py` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.319: Remove query credentials from viewer URLs +- **depends_on**: [T7, T11, T13, T7.317] +- **agent_type**: worker +- **ownership**: `src/core/url_utils.c`, `src/web/api_handlers_streams_get.c`, `tests/integration/specs/t7_319.api.spec.ts`, `quality/evidence/T7.319.md`. +- **priority**: high +- **description**: Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect. +- **findings**: F-T11-03 +- **acceptance_criteria**: + - Viewer responses contain neither userinfo nor sensitive query credentials, including encoded/mixed-case keys; configurers retain required edit data and benign query options remain usable. + - Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage. +- **validation**: + - `node scripts/quality/run-integration.mjs --task T7.319 --project api --grep @t7_319` + - `npm run typecheck:tests` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.320: Reject non-object stream updates +- **depends_on**: [T7, T11, T13, T7.317] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_streams_modify.c`, `tests/integration/specs/t7_320.api.spec.ts`, `quality/evidence/T7.320.md`. +- **priority**: medium +- **description**: Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect. +- **findings**: F-T11-04 +- **acceptance_criteria**: + - null, arrays and primitives return 400 with no mutation, ONVIF request or reload; an empty object has explicit unchanged semantics. + - Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage. +- **validation**: + - `node scripts/quality/run-integration.mjs --task T7.320 --project api --grep @t7_320` + - `npm run typecheck:tests` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.321: Reject wrong-typed stream fields +- **depends_on**: [T7, T11, T13, T7.320] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_streams_modify.c`, `tests/integration/specs/t7_321.api.spec.ts`, `quality/evidence/T7.321.md`. +- **priority**: medium +- **description**: Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect. +- **findings**: F-T11-05 +- **acceptance_criteria**: + - Wrong types return 400 with state unchanged; supported nullable clears retain their documented semantics and validation precedes all side effects. + - Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage. +- **validation**: + - `node scripts/quality/run-integration.mjs --task T7.321 --project api --grep @t7_321` + - `npm run typecheck:tests` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.322: Validate bounded stream numeric fields +- **depends_on**: [T7, T11, T13, T7.321] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_streams_modify.c`, `tests/integration/specs/t7_322.api.spec.ts`, `quality/evidence/T7.322.md`. +- **priority**: medium +- **description**: Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect. +- **findings**: F-T11-06 +- **acceptance_criteria**: + - Protocol enum, priorities, interval, buffer, storage, PTZ and port limits reject out-of-range and fractional values before mutation; boundaries agree with storage and runtime callers. + - Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage. +- **validation**: + - `node scripts/quality/run-integration.mjs --task T7.322 --project api --grep @t7_322` + - `npm run typecheck:tests` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.323: Validate complete boolean schedules +- **depends_on**: [T7, T11, T13, T7.322] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_streams_modify.c`, `tests/integration/specs/t7_323.api.spec.ts`, `quality/evidence/T7.323.md`. +- **priority**: medium +- **description**: Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect. +- **findings**: F-T11-07 +- **acceptance_criteria**: + - Only exactly 168 booleans are accepted; short/long/non-array or wrong element types fail atomically and valid week schedules round-trip unchanged. + - Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage. +- **validation**: + - `node scripts/quality/run-integration.mjs --task T7.323 --project api --grep @t7_323` + - `npm run typecheck:tests` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.324: Address encoded slash names without aliasing +- **depends_on**: [T7, T11, T13, T7.319] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_streams_get.c`, `tests/integration/specs/t7_324.api.spec.ts`, `quality/evidence/T7.324.md`. +- **priority**: medium +- **description**: Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect. +- **findings**: F-T11-08 +- **acceptance_criteria**: + - An encoded slash may either address the complete supported legacy name or be explicitly rejected; it must never select/authorize a different truncated camera. + - Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage. +- **validation**: + - `node scripts/quality/run-integration.mjs --task T7.324 --project api --grep @t7_324` + - `npm run typecheck:tests` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.325: Enforce decoded stream name limits consistently +- **depends_on**: [T7, T11, T13, T7.324] +- **agent_type**: worker +- **ownership**: `src/web/request_response.c`, `src/web/api_handlers_streams_get.c`, `tests/integration/specs/t7_325.api.spec.ts`, `quality/evidence/T7.325.md`. +- **priority**: medium +- **description**: Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect. +- **findings**: F-T11-09 +- **acceptance_criteria**: + - UTF-8 names at the stored byte limit are consistently addressable by PUT/full/zones; encoded suffix length does not truncate/alias a name. Malformed escapes/NUL/dot segments remain rejected. Current encoded suffix includes /full or /zones. + - Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage. +- **validation**: + - `node scripts/quality/run-integration.mjs --task T7.325 --project api --grep @t7_325` + - `npm run typecheck:tests` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.326: Handle missing fleet inventory rows consistently +- **depends_on**: [T7, T11, T13, T7.325] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_streams_get.c`, `tests/integration/specs/t7_326.api.spec.ts`, `quality/evidence/T7.326.md`. +- **priority**: medium +- **description**: Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect. +- **findings**: F-T11-10 +- **acceptance_criteria**: + - A missing authorization inventory row cannot expose a camera; document fail-closed behavior and isolate an inconsistent row only if policy permits, while preserving authorized list results and surfacing the inconsistency. + - Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage. +- **validation**: + - `node scripts/quality/run-integration.mjs --task T7.326 --project api --grep @t7_326` + - `npm run typecheck:tests` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.327: Preserve omitted ONVIF update state +- **depends_on**: [T7, T11, T13, T7.323] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_streams_modify.c`, `tests/integration/specs/t7_327.api.spec.ts`, `quality/evidence/T7.327.md`. +- **priority**: medium +- **description**: Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect. +- **findings**: F-T11-11 +- **acceptance_criteria**: + - A tags-only or empty update preserves isOnvif and credentials without an ONVIF network call; explicit ONVIF changes retain their intended behavior. + - Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage. +- **validation**: + - `node scripts/quality/run-integration.mjs --task T7.327 --project api --grep @t7_327` + - `npm run typecheck:tests` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.328: Make privacy mutations atomic and report failure +- **depends_on**: [T7, T11, T13, T7.327] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_streams_modify.c`, `tests/integration/specs/t7_328.api.spec.ts`, `quality/evidence/T7.328.md`. +- **priority**: medium +- **description**: Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect. +- **findings**: F-T11-12 +- **acceptance_criteria**: + - Privacy-only success follows a successful database write; database failure returns failure. Mixed privacy/edit requests are rejected before enable/reload/network side effects or handled through a separately specified atomic contract. + - Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage. +- **validation**: + - `node scripts/quality/run-integration.mjs --task T7.328 --project api --grep @t7_328` + - `npm run typecheck:tests` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.329: Expose demo mode for authenticated users +- **depends_on**: [T7, T11, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_auth_backend_agnostic.c`, `tests/integration/specs/t7_329.api.spec.ts`, `quality/evidence/T7.329.md`. +- **priority**: medium +- **description**: Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect. +- **findings**: F-T11-13 +- **acceptance_criteria**: + - Authenticated demo responses carry authoritative demo state while roles remain accurate, server-side redaction remains enforced and normal authenticated responses remain compatible. + - Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage. +- **validation**: + - `node scripts/quality/run-integration.mjs --task T7.329 --project api --grep @t7_329` + - `npm run typecheck:tests` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.330: Reject overlong stream strings without truncation +- **depends_on**: [T7, T11, T13, T7.328] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_streams_modify.c`, `tests/integration/specs/t7_330.api.spec.ts`, `quality/evidence/T7.330.md`. +- **priority**: medium +- **description**: Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect. +- **findings**: F-T11-14 +- **acceptance_criteria**: + - Each field checks UTF-8 byte length against the destination buffer before mutation; maximum valid values round-trip and one-byte overflow is rejected atomically, including detection_model temporary-buffer limits. + - Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage. +- **validation**: + - `node scripts/quality/run-integration.mjs --task T7.330 --project api --grep @t7_330` + - `npm run typecheck:tests` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.331: Bound ONVIF edit validation latency +- **depends_on**: [T7, T11, T13, T7.330] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_streams_modify.c`, `tests/integration/specs/t7_331.api.spec.ts`, `quality/evidence/T7.331.md`. +- **priority**: medium +- **description**: Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect. +- **findings**: F-T11-15 +- **acceptance_criteria**: + - An unresponsive synthetic ONVIF endpoint cannot monopolize a worker indefinitely; preserve accepted/persisted semantics and avoid blind retries of possibly successful mutations. Record the deadline before the test, below the client timeout or explicitly reconcile client behavior. + - Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage. +- **validation**: + - `node scripts/quality/run-integration.mjs --task T7.331 --project api --grep @t7_331` + - `npm run typecheck:tests` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.332: Preserve detection threshold round trips +- **depends_on**: [T7, T11, T13, T7.326, T7.331] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_streams_get.c`, `src/web/api_handlers_streams_modify.c`, `tests/integration/specs/t7_332.api.spec.ts`, `quality/evidence/T7.332.md`. +- **priority**: medium +- **description**: Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect. +- **findings**: F-T11-16 +- **acceptance_criteria**: + - All integer percentages 0..100 survive PUT→GET round trips; specifically 53 and 59 must not become 52 and 58. Preserve representation for existing stored floats with a documented rounding policy. + - Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage. +- **validation**: + - `node scripts/quality/run-integration.mjs --task T7.332 --project api --grep @t7_332` + - `npm run typecheck:tests` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.333: Specify password omission and explicit clear semantics +- **depends_on**: [T7, T11, T13, T7.332] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_streams_modify.c`, `tests/integration/specs/t7_333.api.spec.ts`, `quality/evidence/T7.333.md`. +- **priority**: medium +- **description**: Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect. +- **findings**: F-T11-17 +- **acceptance_criteria**: + - Omitted onvif_password leaves the secret unchanged; explicit empty clears only as an intentional authorized action. Client form construction never echoes a redacted empty value as a destructive update. + - Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage. +- **validation**: + - `node scripts/quality/run-integration.mjs --task T7.333 --project api --grep @t7_333` + - `npm run typecheck:tests` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.334: Reconcile Streams contracts after behavioral fixes +- **depends_on**: [T7, T12, T7.317, T7.318, T7.319, T7.320, T7.321, T7.322, T7.323, T7.324, T7.325, T7.326, T7.327, T7.328, T7.329, T7.330, T7.331, T7.332, T7.333] +- **agent_type**: local +- **ownership**: `docs/api/contracts/streams.yaml`, `docs/api/contracts/common.yaml`, `docs/api/openapi.yaml`, `tests/contracts/fixtures/streams/auth-verify.auth-disabled.valid.json`, `tests/contracts/fixtures/streams/auth-verify.demo-as-admin.invalid.json`, `tests/contracts/fixtures/streams/auth-verify.demo.valid.json`, `tests/contracts/fixtures/streams/auth-verify.user.valid.json`, `tests/contracts/fixtures/streams/client-config.camelcase-only.invalid.json`, `tests/contracts/fixtures/streams/client-config.valid.json`, `tests/contracts/fixtures/streams/detection-models.403-viewer.valid.json`, `tests/contracts/fixtures/streams/detection-models.no-directory.valid.json`, `tests/contracts/fixtures/streams/detection-models.unsupported-without-reason.invalid.json`, `tests/contracts/fixtures/streams/detection-models.valid.json`, `tests/contracts/fixtures/streams/error.400-retention.valid.json`, `tests/contracts/fixtures/streams/error.400-surface.valid.json`, `tests/contracts/fixtures/streams/error.401.valid.json`, `tests/contracts/fixtures/streams/error.403-put-viewer.valid.json`, `tests/contracts/fixtures/streams/error.404-camera.valid.json`, `tests/contracts/fixtures/streams/error.404-stream.valid.json`, `tests/contracts/fixtures/streams/error.413-publish-url.valid.json`, `tests/contracts/fixtures/streams/error.empty-message.invalid.json`, `tests/contracts/fixtures/streams/error.message-key.invalid.json`, `tests/contracts/fixtures/streams/full.any.generic-schema.valid.json`, `tests/contracts/fixtures/streams/full.configurer.legacy-name-plain-credentials.valid.json`, `tests/contracts/fixtures/streams/full.configurer.missing-onvif-password.invalid.json`, `tests/contracts/fixtures/streams/full.configurer.onvif-url-userinfo.invalid.json`, `tests/contracts/fixtures/streams/full.configurer.onvif.valid.json`, `tests/contracts/fixtures/streams/full.error-message-without-error.invalid.json`, `tests/contracts/fixtures/streams/full.live-only.claims-configure.invalid.json`, `tests/contracts/fixtures/streams/full.live-only.error-status.valid.json`, `tests/contracts/fixtures/streams/full.live-only.leaked-admin-url.invalid.json`, `tests/contracts/fixtures/streams/full.live-only.leaked-detection-url.invalid.json`, `tests/contracts/fixtures/streams/full.live-only.leaked-go2rtc-override.invalid.json`, `tests/contracts/fixtures/streams/full.live-only.leaked-onvif-password.invalid.json`, `tests/contracts/fixtures/streams/full.live-only.leaked-onvif-username.invalid.json`, `tests/contracts/fixtures/streams/full.live-only.leaked-publish-url.invalid.json`, `tests/contracts/fixtures/streams/full.live-only.leaked-sub-stream-url.invalid.json`, `tests/contracts/fixtures/streams/full.live-only.redacted.valid.json`, `tests/contracts/fixtures/streams/full.live-only.sensitive-keys-absent.valid.json`, `tests/contracts/fixtures/streams/full.live-only.url-query-secret.invalid.json`, `tests/contracts/fixtures/streams/full.live-only.url-userinfo.invalid.json`, `tests/contracts/fixtures/streams/full.live-only.url-username-only.invalid.json`, `tests/contracts/fixtures/streams/full.null-tags.invalid.json`, `tests/contracts/fixtures/streams/full.protocol-out-of-enum.invalid.json`, `tests/contracts/fixtures/streams/full.retention-below-inherit.invalid.json`, `tests/contracts/fixtures/streams/full.retention-over-max.invalid.json`, `tests/contracts/fixtures/streams/full.schedule-167-entries.invalid.json`, `tests/contracts/fixtures/streams/full.status-docs-value.invalid.json`, `tests/contracts/fixtures/streams/full.threshold-as-fraction.invalid.json`, `tests/contracts/fixtures/streams/full.unwrapped-object.invalid.json`, `tests/contracts/fixtures/streams/index.json`, `tests/contracts/fixtures/streams/path-encoding.cases.json`, `tests/contracts/fixtures/streams/put-response.200-privacy.valid.json`, `tests/contracts/fixtures/streams/put-response.202-onvif-failed.valid.json`, `tests/contracts/fixtures/streams/put-response.202-onvif-status-without-message.invalid.json`, `tests/contracts/fixtures/streams/put-response.202.valid.json`, `tests/contracts/fixtures/streams/put.clear-with-null.valid.json`, `tests/contracts/fixtures/streams/put.detection-retention-minus-2.invalid.json`, `tests/contracts/fixtures/streams/put.detection-url-file-scheme.invalid.json`, `tests/contracts/fixtures/streams/put.detection-url-too-long.invalid.json`, `tests/contracts/fixtures/streams/put.edit-form.valid.json`, `tests/contracts/fixtures/streams/put.empty-object.valid.json`, `tests/contracts/fixtures/streams/put.eptz-not-string.invalid.json`, `tests/contracts/fixtures/streams/put.eptz-wrong-projection.invalid.json`, `tests/contracts/fixtures/streams/put.is-deleted.invalid.json`, `tests/contracts/fixtures/streams/put.name-in-body.invalid.json`, `tests/contracts/fixtures/streams/put.playback-transport-bogus.invalid.json`, `tests/contracts/fixtures/streams/put.privacy-mixed-with-edit.invalid.json`, `tests/contracts/fixtures/streams/put.protocol-out-of-enum.invalid.json`, `tests/contracts/fixtures/streams/put.publish-and-detection-url.valid.json`, `tests/contracts/fixtures/streams/put.publish-url-http.invalid.json`, `tests/contracts/fixtures/streams/put.publish-url-quote.invalid.json`, `tests/contracts/fixtures/streams/put.record-as-string.invalid.json`, `tests/contracts/fixtures/streams/put.retention-366.invalid.json`, `tests/contracts/fixtures/streams/put.retention-finite-boundary.valid.json`, `tests/contracts/fixtures/streams/put.retention-tristate.valid.json`, `tests/contracts/fixtures/streams/put.schedule-weekday.valid.json`, `tests/contracts/fixtures/streams/put.schedule-wrong-length.invalid.json`, `tests/contracts/fixtures/streams/put.set-privacy-mode.valid.json`, `tests/contracts/fixtures/streams/put.tags-too-long.invalid.json`, `tests/contracts/fixtures/streams/summary.admin.admin-url-without-configure.invalid.json`, `tests/contracts/fixtures/streams/summary.admin.configurer-with-admin-url.valid.json`, `tests/contracts/fixtures/streams/summary.admin.contains-url.invalid.json`, `tests/contracts/fixtures/streams/summary.admin.empty.valid.json`, `tests/contracts/fixtures/streams/summary.admin.missing-can-configure.invalid.json`, `tests/contracts/fixtures/streams/summary.admin.page-beyond-end.valid.json`, `tests/contracts/fixtures/streams/summary.admin.page-size-over-max.invalid.json`, `tests/contracts/fixtures/streams/summary.admin.status-from-detail-enum.invalid.json`, `tests/contracts/fixtures/streams/summary.admin.viewer.valid.json`, `tests/contracts/fixtures/streams/summary.live.contains-admin-url.invalid.json`, `tests/contracts/fixtures/streams/summary.live.contains-onvif-password.invalid.json`, `tests/contracts/fixtures/streams/summary.live.viewer.valid.json`, `tests/contracts/fixtures/streams/summary.lpr.leaks-location.invalid.json`, `tests/contracts/fixtures/streams/summary.lpr.valid.json`, `tests/contracts/fixtures/streams/zones.empty.valid.json`, `tests/contracts/fixtures/streams/zones.valid.json`, `web/js/api/generated/`, `tests/contracts/generated/`, `quality/evidence/T7.334.md`. +- **priority**: high +- **description**: Under the exclusive generation lease, reconcile the exact schemas and affected fixture files after the preceding fixes. The exact fixture list is recorded in ownership; generated directories are exclusively owned outputs of T12. Regenerate only through T12 tooling; no concurrent generation. Preserve separate desired-client and current-wire cases where intentionally different. +- **findings**: policy/integration requirement +- **acceptance_criteria**: + - All valid and invalid fixtures retain explicit reasons and agree with the corrected real backend. + - Generate deterministic artifacts and run real pilot regressions; T18/T19 cannot use stale contracts. +- **validation**: + - `node scripts/quality/contracts.mjs --generate` + - `node scripts/quality/contracts.mjs --check` + - `node --test tests/quality/contracts.test.mjs` + - `npm --prefix web run typecheck` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.335: Resolve proposed ownership and exception review records +- **depends_on**: [T7, T7.1] +- **agent_type**: local +- **ownership**: `quality/reviews/exception-ownership.json`, `quality/evidence/T7.335.md`. +- **priority**: high +- **description**: Collect accountable owners and explicit approvals/denials for T1/T6 proposals and any new residual exceptions. Existing maintainers/ strings and proposed dates are not acceptance. Prepare a concrete review record; leave pending entries unresolved until actual authorized reviewer input arrives. +- **findings**: policy/integration requirement +- **acceptance_criteria**: + - Every unresolved proposal names its exact finding/gap, requested owner, exposure, rationale, proposed expiry and approval state. + - No approval, repository protection change, CODEOWNERS assignment or publication is inferred from implementation authorization. +- **validation**: + - `python3 -m json.tool quality/reviews/exception-ownership.json` +- **status**: Not Completed +- **log**: +- **files edited/created**: diff --git a/quality/evidence/T7.md b/quality/evidence/T7.md new file mode 100644 index 000000000..eceb36f25 --- /dev/null +++ b/quality/evidence/T7.md @@ -0,0 +1,101 @@ +# T7 — Atomic remediation expansion + +T7 has materialized the remediation work. The coordinator must insert +`T7-expansion.md` into `engineering-foundation-plan.md` and apply every +`gate_dependency_additions` entry before marking the expansion complete. +Planning does not mean remediation or final PRD acceptance is complete. + +## Evidence and scope + +- Reviewed baseline: T1 inventory at `27e4d57e`, T2 API/application inventory, + T3 native/operational evidence, T4 archived asset/budget evidence, and T11 + committed specification `a764b6ca` and 17 newly documented candidates. +- All **743** original fingerprints are mapped exactly once: 384 itemized + findings and 359 buckets. Twenty-one informational coverage buckets map to + T14; they are scanner diagnostics, not proven-clean code. +- All **17** T11 candidates have separate bounded work records. T11 confirmed + threshold round-trip loss at 53→52 and 59→58; the encoded-name limit includes + the `/full` or `/zones` suffix. The map uses those corrected facts. +- **335** child records: 226 native fixes, 44 web fixes, 36 upstream reviews, + 16 pilot behavioral fixes, 6 advisory reviews, 3 dependency tasks, and one + each for policy enforcement, API documentation, contract reconciliation and + exception ownership review. A task has at most six implementation files. +- Every T2 discrepancy D-01 through D-10 has an assigned pilot, rollout, or + harness owner. T3 gaps stay with T13/T14/T27–T30/T35/T36, not artificial fixes. +- T8's root development dependency path for the minimatch advisory was discovered + after the T1 inventory. T7.9 now owns both root/web manifests and locks; T33 must + reconcile the new occurrence. This task does not rewrite the baseline. + +## Approval and uncertainty + +No owner, date, private advisory outcome or scanner gap is approved here. All +564 proposed baseline-debt entries, 11 dismissed alert exceptions and four +coverage-gap proposals retain unresolved approval status. A false positive +requires site-specific evidence and an actual reviewed disposition; a scanner +exclusion or missing report cannot count as a fix. + +T7.1 is already completed by the coordinator in `c285a0c2`: 65 tests pass after +RED evidence, and real T1 reports fail the unapproved proposals. The checker +validates approval metadata; it cannot authenticate who actually granted it. +Production approvals must never be fabricated merely to satisfy the checker. + +The raw diagnostics establish hypotheses, not proven root causes. Every work +record requires the actual path/line/fingerprint and caller to be examined +before implementation. Distinct causes discovered inside a bounded rule cluster +must become separate explicit children and gate edges. Private advisory and +upstream review tasks remain open when their evidence is inaccessible or a +needed implementation child has not been materialized and completed. No review +placeholder can be used to pass T33. + +## Integration and resources + +- The same-path remediation writers are explicitly ordered. New native tests + and CMake fragments are unique to each task; T13 must implement sorted + `tests/unit/cmake/eng/*.cmake` discovery without workers editing the shared + CMake list. Focused native commands are **planned consumers** of T13, not + assertions that those tests already exist. +- Package fixes follow T8, serialize both manifest writers and precede T15. + Preserve Node 24/direct major versions. Incompatible patched versions or + absent upstream patches require concrete review, not forced upgrades. +- T12 produces generators before exclusive T7.334 reconciliation. The latter + owns exact existing fixture paths and the generated output directories, + then releases T18/T19. Pilot behavior must not be frozen around known defects. +- Overlapping pilot JS consumers depend on their exact repair predecessors; + all web repairs precede T25, which must incorporate final paths into rollout. +- T31 selection is read-only and can proceed. Its future implementation children + must inherit the last remediation writer for their selected paths; the map + records that integration requirement rather than blocking selection on every + unrelated C warning. +- All T7.* tasks explicitly fence T33. Required-check enforcement T38 is also + a closure dependency. Whole-tree builds, package installs, generation and + server/native workloads require the plan's exclusive lease. + +## Verification + +`reason_not_testable`: T7 is inventory reconciliation and dependency planning, +with no production behavior to put through a TDD cycle. Static verification is +appropriate. The committed checker validates the actual map plus the existing +plan and proposed gate additions. + +Commands run from repository root: + +```sh +python3 -m json.tool quality/remediation-map.json > /dev/null +python3 quality/evidence/T7-check.py +``` + +Result: 743 inventory findings, 17 candidates, 335 remediation tasks and a +374-node acyclic combined DAG. Completeness, uniqueness, existing source paths, +bounded ownership, same-file writer ordering, valid dependency IDs, and the +explicit T33 fence pass. No production fixes are attributed to this check. + +Eight temporary corrupted-map controls were all rejected: missing finding, +duplicate finding, unknown dependency, cycle, missing closure dependency, +unordered writer, broad ownership, and invented approval. Temporary files were +removed. JSON parse and staged whitespace checks also pass. + +The coordinator must rerun this check after insertion and inspect newly added +cross-task edges. Future inventory edits intentionally require reconciliation +of the stored inventory hash. Required external approval, device, repository +administration and fresh full-profile scan results remain outside this planning +evidence. diff --git a/quality/remediation-map.json b/quality/remediation-map.json new file mode 100644 index 000000000..3b8a4be03 --- /dev/null +++ b/quality/remediation-map.json @@ -0,0 +1,24317 @@ +{ + "schema_version": 1, + "producer": "T7", + "revision_reviewed": "27e4d57e", + "status": "materialized-awaiting-coordinator-integration", + "approval_policy": "No T1/T6 proposal accepted by this map; all exception and private status reviews remain unresolved until evidence/approval exists. Mapping is not remediation.", + "inventory_sha256": "3008e6ae8c22ca8b4edf0da633beb66daa7f7fdc205c15edad95589bebe45d34", + "summary": { + "inventory_fingerprints": 743, + "mapped_inventory_fingerprints": 743, + "candidate_findings": 17, + "tasks": 335 + }, + "tasks": [ + { + "id": "T7.1", + "title": "Reject unapproved findings and coverage exceptions", + "depends_on": [ + "T7", + "T6" + ], + "kind": "policy", + "priority": "high", + "status": "Completed", + "ownership": [ + "scripts/quality/findings.py", + "tests/quality/test_findings.py", + "quality/findings-policy.json", + "quality/evidence/T7.1.md" + ], + "source_paths": [], + "description": "Require explicit reviewed approval evidence before an exception can affect --check or --release. The existing proposed-by-T1/T6 dates and maintainers/ owners are proposals, not approvals. Preserve diagnostic reporting and the read-only normal check. Do not silently bless old records during schema migration.", + "acceptance_criteria": [ + "Tests first prove proposed, missing, expired and malformed approvals fail; an explicitly approved current exception succeeds only in its permitted mode.", + "An approval must name an accountable reviewer/owner, date and reason; placeholders do not qualify. --release still rejects coverage gaps.", + "Run against actual T1 reports: unapproved proposals must cause policy failure. Hash the inventory before/after --check." + ], + "validation": [ + "python3 -m unittest discover -s tests/quality -p test_findings.py", + "python3 scripts/quality/findings.py --check --reports build/eng-artifacts/T1 --inventory quality/findings.json" + ], + "evidence": "quality/evidence/T7.1.md", + "finding_ids": [], + "expected_exit": { + "real_T1_check": 1 + }, + "reason_not_testable": null, + "commit": "c285a0c2", + "log": "Coordinator implemented RED -> GREEN approval enforcement: 65 tests pass; real T1 fails 575 inventory and 4 gap approval proposals; no accepted gaps. Metadata validation does not authenticate a human approval; do not fabricate production approval records." + }, + { + "id": "T7.2", + "title": "Verify disposition and regression evidence for ADVISORY-GHSA-cv53-mq7p-6jp2", + "depends_on": [ + "T7" + ], + "kind": "advisory-review", + "priority": "high", + "status": "Not Completed", + "ownership": [ + "quality/reviews/advisory-ghsa-cv53-mq7p-6jp2.json", + "quality/evidence/T7.2.md" + ], + "source_paths": [], + "description": "Read the source advisory through authorized access; record sanitized affected paths, fixed revision and exact existing regression command without publishing private identifiers or text. Published-version exclusion alone is not regression proof. If a regression or fix is absent, append a bounded child task and add it to T33 before this review can close; inaccessible private evidence leaves this task blocked.", + "acceptance_criteria": [ + "Confirm state and affected/current versions at the actual execution date.", + "Record reviewer, evidence reference and passing regression, or explicit unresolved blocker; a draft or closed label alone is not a verified fix.", + "No private advisory text, IDs or credentials in committed evidence." + ], + "validation": [ + "python3 -m json.tool quality/reviews/advisory-ghsa-cv53-mq7p-6jp2.json" + ], + "evidence": "quality/evidence/T7.2.md", + "finding_ids": [ + "ADVISORY-GHSA-cv53-mq7p-6jp2" + ], + "requires_external_evidence": true + }, + { + "id": "T7.3", + "title": "Verify disposition and regression evidence for ADVISORY-repo-advisory-draft-1", + "depends_on": [ + "T7" + ], + "kind": "advisory-review", + "priority": "high", + "status": "Not Completed", + "ownership": [ + "quality/reviews/advisory-repo-advisory-draft-1.json", + "quality/evidence/T7.3.md" + ], + "source_paths": [], + "description": "Read the source advisory through authorized access; record sanitized affected paths, fixed revision and exact existing regression command without publishing private identifiers or text. Published-version exclusion alone is not regression proof. If a regression or fix is absent, append a bounded child task and add it to T33 before this review can close; inaccessible private evidence leaves this task blocked.", + "acceptance_criteria": [ + "Confirm state and affected/current versions at the actual execution date.", + "Record reviewer, evidence reference and passing regression, or explicit unresolved blocker; a draft or closed label alone is not a verified fix.", + "No private advisory text, IDs or credentials in committed evidence." + ], + "validation": [ + "python3 -m json.tool quality/reviews/advisory-repo-advisory-draft-1.json" + ], + "evidence": "quality/evidence/T7.3.md", + "finding_ids": [ + "ADVISORY-repo-advisory-draft-1" + ], + "requires_external_evidence": true + }, + { + "id": "T7.4", + "title": "Verify disposition and regression evidence for ADVISORY-repo-advisory-closed-1", + "depends_on": [ + "T7" + ], + "kind": "advisory-review", + "priority": "high", + "status": "Not Completed", + "ownership": [ + "quality/reviews/advisory-repo-advisory-closed-1.json", + "quality/evidence/T7.4.md" + ], + "source_paths": [], + "description": "Read the source advisory through authorized access; record sanitized affected paths, fixed revision and exact existing regression command without publishing private identifiers or text. Published-version exclusion alone is not regression proof. If a regression or fix is absent, append a bounded child task and add it to T33 before this review can close; inaccessible private evidence leaves this task blocked.", + "acceptance_criteria": [ + "Confirm state and affected/current versions at the actual execution date.", + "Record reviewer, evidence reference and passing regression, or explicit unresolved blocker; a draft or closed label alone is not a verified fix.", + "No private advisory text, IDs or credentials in committed evidence." + ], + "validation": [ + "python3 -m json.tool quality/reviews/advisory-repo-advisory-closed-1.json" + ], + "evidence": "quality/evidence/T7.4.md", + "finding_ids": [ + "ADVISORY-repo-advisory-closed-1" + ], + "requires_external_evidence": true + }, + { + "id": "T7.5", + "title": "Verify disposition and regression evidence for ADVISORY-repo-advisory-draft-2", + "depends_on": [ + "T7" + ], + "kind": "advisory-review", + "priority": "high", + "status": "Not Completed", + "ownership": [ + "quality/reviews/advisory-repo-advisory-draft-2.json", + "quality/evidence/T7.5.md" + ], + "source_paths": [], + "description": "Read the source advisory through authorized access; record sanitized affected paths, fixed revision and exact existing regression command without publishing private identifiers or text. Published-version exclusion alone is not regression proof. If a regression or fix is absent, append a bounded child task and add it to T33 before this review can close; inaccessible private evidence leaves this task blocked.", + "acceptance_criteria": [ + "Confirm state and affected/current versions at the actual execution date.", + "Record reviewer, evidence reference and passing regression, or explicit unresolved blocker; a draft or closed label alone is not a verified fix.", + "No private advisory text, IDs or credentials in committed evidence." + ], + "validation": [ + "python3 -m json.tool quality/reviews/advisory-repo-advisory-draft-2.json" + ], + "evidence": "quality/evidence/T7.5.md", + "finding_ids": [ + "ADVISORY-repo-advisory-draft-2" + ], + "requires_external_evidence": true + }, + { + "id": "T7.6", + "title": "Verify disposition and regression evidence for ADVISORY-GHSA-rqj3-pch5-rq4f", + "depends_on": [ + "T7" + ], + "kind": "advisory-review", + "priority": "critical", + "status": "Not Completed", + "ownership": [ + "quality/reviews/advisory-ghsa-rqj3-pch5-rq4f.json", + "quality/evidence/T7.6.md" + ], + "source_paths": [], + "description": "Read the source advisory through authorized access; record sanitized affected paths, fixed revision and exact existing regression command without publishing private identifiers or text. Published-version exclusion alone is not regression proof. If a regression or fix is absent, append a bounded child task and add it to T33 before this review can close; inaccessible private evidence leaves this task blocked.", + "acceptance_criteria": [ + "Confirm state and affected/current versions at the actual execution date.", + "Record reviewer, evidence reference and passing regression, or explicit unresolved blocker; a draft or closed label alone is not a verified fix.", + "No private advisory text, IDs or credentials in committed evidence." + ], + "validation": [ + "python3 -m json.tool quality/reviews/advisory-ghsa-rqj3-pch5-rq4f.json" + ], + "evidence": "quality/evidence/T7.6.md", + "finding_ids": [ + "ADVISORY-GHSA-rqj3-pch5-rq4f" + ], + "requires_external_evidence": true + }, + { + "id": "T7.7", + "title": "Verify disposition and regression evidence for ADVISORY-GHSA-pvw7-7j8c-qx96", + "depends_on": [ + "T7" + ], + "kind": "advisory-review", + "priority": "high", + "status": "Not Completed", + "ownership": [ + "quality/reviews/advisory-ghsa-pvw7-7j8c-qx96.json", + "quality/evidence/T7.7.md" + ], + "source_paths": [], + "description": "Read the source advisory through authorized access; record sanitized affected paths, fixed revision and exact existing regression command without publishing private identifiers or text. Published-version exclusion alone is not regression proof. If a regression or fix is absent, append a bounded child task and add it to T33 before this review can close; inaccessible private evidence leaves this task blocked.", + "acceptance_criteria": [ + "Confirm state and affected/current versions at the actual execution date.", + "Record reviewer, evidence reference and passing regression, or explicit unresolved blocker; a draft or closed label alone is not a verified fix.", + "No private advisory text, IDs or credentials in committed evidence." + ], + "validation": [ + "python3 -m json.tool quality/reviews/advisory-ghsa-pvw7-7j8c-qx96.json" + ], + "evidence": "quality/evidence/T7.7.md", + "finding_ids": [ + "ADVISORY-GHSA-pvw7-7j8c-qx96" + ], + "requires_external_evidence": true + }, + { + "id": "T7.8", + "title": "Remediate glob dependency advisory GHSA-3g3m-2fjr-6pw4", + "depends_on": [ + "T7", + "T8" + ], + "kind": "dependency", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "web/package.json", + "web/package-lock.json", + "quality/evidence/T7.8.md" + ], + "source_paths": [ + "web/package-lock.json" + ], + "description": "Resolve GHSA-3g3m-2fjr-6pw4 for glob using an actually available compatible patched transitive version or remove the vulnerable dependency path. Inspect npm explain and production/dev reachability. Preserve Node 24 and installed direct major versions. If no compatible fix exists, submit a specific owner/expiry/rationale proposal and keep this task open until explicitly reviewed; do not force an unrelated major upgrade.", + "acceptance_criteria": [ + "npm audit no longer reports the advisory on each original dependency path, or an explicitly reviewed current exception documents the residual exposure.", + "Dependency graph, unit tests and both web builds remain compatible; no broad overrides that violate parent ranges." + ], + "validation": [ + "npm --prefix web explain glob", + "npm --prefix web audit --json", + "npm --prefix web audit --omit=dev --json", + "npm --prefix web test -- --runInBand", + "npm --prefix web run build", + "LIGHTNVR_WEB_LEGACY=false npm --prefix web run build" + ], + "evidence": "quality/evidence/T7.8.md", + "finding_ids": [ + "NPM-WEB-GHSA-3g3m-2fjr-6pw4-glob" + ], + "lease": "exclusive package/install/build lease" + }, + { + "id": "T7.9", + "title": "Remediate minimatch dependency advisory GHSA-g3hv-75wg-m249", + "depends_on": [ + "T7", + "T8", + "T7.8" + ], + "kind": "dependency", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "web/package.json", + "web/package-lock.json", + "quality/evidence/T7.9.md", + "package.json", + "package-lock.json" + ], + "source_paths": [ + "web/package-lock.json", + "package-lock.json" + ], + "description": "Resolve GHSA-g3hv-75wg-m249 for minimatch using an actually available compatible patched transitive version or remove the vulnerable dependency path. Inspect npm explain and production/dev reachability. Preserve Node 24 and installed direct major versions. If no compatible fix exists, submit a specific owner/expiry/rationale proposal and keep this task open until explicitly reviewed; do not force an unrelated major upgrade. T8 introduced the same advisory through root openapi-typescript 7.13 -> @redocly/openapi-core 2.6; include root dev graph and audit evidence from build/eng-artifacts/dependency-review/root-all.json. Do not update the findings baseline automatically; T33 must reconcile this new occurrence.", + "acceptance_criteria": [ + "npm audit no longer reports the advisory on each original dependency path, or an explicitly reviewed current exception documents the residual exposure.", + "Dependency graph, unit tests and both web builds remain compatible; no broad overrides that violate parent ranges." + ], + "validation": [ + "npm --prefix web explain minimatch", + "npm --prefix web audit --json", + "npm --prefix web audit --omit=dev --json", + "npm --prefix web test -- --runInBand", + "npm --prefix web run build", + "LIGHTNVR_WEB_LEGACY=false npm --prefix web run build", + "npm explain minimatch", + "npm audit --json", + "npm audit --omit=dev --json" + ], + "evidence": "quality/evidence/T7.9.md", + "finding_ids": [ + "NPM-WEB-GHSA-g3hv-75wg-m249-minimatch" + ], + "lease": "exclusive package/install/build lease" + }, + { + "id": "T7.10", + "title": "Remediate deepmerge dependency advisory GHSA-gcqx-w48m-w2h4", + "depends_on": [ + "T7", + "T8", + "T7.9" + ], + "kind": "dependency", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "web/package.json", + "web/package-lock.json", + "quality/evidence/T7.10.md" + ], + "source_paths": [ + "web/package-lock.json" + ], + "description": "Resolve GHSA-gcqx-w48m-w2h4 for deepmerge using an actually available compatible patched transitive version or remove the vulnerable dependency path. Inspect npm explain and production/dev reachability. Preserve Node 24 and installed direct major versions. If no compatible fix exists, submit a specific owner/expiry/rationale proposal and keep this task open until explicitly reviewed; do not force an unrelated major upgrade.", + "acceptance_criteria": [ + "npm audit no longer reports the advisory on each original dependency path, or an explicitly reviewed current exception documents the residual exposure.", + "Dependency graph, unit tests and both web builds remain compatible; no broad overrides that violate parent ranges." + ], + "validation": [ + "npm --prefix web explain deepmerge", + "npm --prefix web audit --json", + "npm --prefix web audit --omit=dev --json", + "npm --prefix web test -- --runInBand", + "npm --prefix web run build", + "LIGHTNVR_WEB_LEGACY=false npm --prefix web run build" + ], + "evidence": "quality/evidence/T7.10.md", + "finding_ids": [ + "DEPENDABOT-101", + "NPM-WEB-GHSA-gcqx-w48m-w2h4-deepmerge" + ], + "lease": "exclusive package/install/build lease" + }, + { + "id": "T7.11", + "title": "cpp/cleartext-storage-database in db_event_destinations.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "high", + "status": "Not Completed", + "ownership": [ + "src/database/db_event_destinations.c", + "tests/unit/test_t7_11.c", + "tests/unit/cmake/eng/t7_11.cmake", + "quality/evidence/T7.11.md" + ], + "source_paths": [ + "src/database/db_event_destinations.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Trace credential persistence and read access; document existing at-rest security and migration constraints. Test redaction and restricted access. If encryption changes the storage contract, materialize a separate bounded migration task instead of inventing a key-management scheme.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.11 --regex '^test_t7_11$'" + ], + "evidence": "quality/evidence/T7.11.md", + "finding_ids": [ + "CODEQL-316", + "CODEQL-307" + ], + "rule_id": "cpp/cleartext-storage-database", + "reproducers": [ + { + "id": "CODEQL-316", + "path": "src/database/db_event_destinations.c", + "line": 484, + "fingerprint": "codeql:cpp/cleartext-storage-database:src/database/db_event_destinations.c:fbb7880f337a5c64:1", + "original_count": 1, + "scanner": "codeql-cpp" + }, + { + "id": "CODEQL-307", + "path": "src/database/db_event_destinations.c", + "line": 562, + "fingerprint": "codeql:cpp/cleartext-storage-database:src/database/db_event_destinations.c:1e56b090fc53c9de:1", + "original_count": 1, + "scanner": "codeql-cpp" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.12", + "title": "cpp/cleartext-storage-database in db_streams.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "high", + "status": "Not Completed", + "ownership": [ + "src/database/db_streams.c", + "tests/unit/test_t7_12.c", + "tests/unit/cmake/eng/t7_12.cmake", + "quality/evidence/T7.12.md" + ], + "source_paths": [ + "src/database/db_streams.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Trace credential persistence and read access; document existing at-rest security and migration constraints. Test redaction and restricted access. If encryption changes the storage contract, materialize a separate bounded migration task instead of inventing a key-management scheme.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.12 --regex '^test_t7_12$'" + ], + "evidence": "quality/evidence/T7.12.md", + "finding_ids": [ + "CODEQL-185", + "CODEQL-183", + "CODEQL-181" + ], + "rule_id": "cpp/cleartext-storage-database", + "reproducers": [ + { + "id": "CODEQL-185", + "path": "src/database/db_streams.c", + "line": 423, + "fingerprint": "codeql:cpp/cleartext-storage-database:src/database/db_streams.c:8dbda857d93080d5:1", + "original_count": 1, + "scanner": "codeql-cpp" + }, + { + "id": "CODEQL-183", + "path": "src/database/db_streams.c", + "line": 242, + "fingerprint": "codeql:cpp/cleartext-storage-database:src/database/db_streams.c:4d9d6f22e2bfe78b:1", + "original_count": 1, + "scanner": "codeql-cpp" + }, + { + "id": "CODEQL-181", + "path": "src/database/db_streams.c", + "line": 615, + "fingerprint": "codeql:cpp/cleartext-storage-database:src/database/db_streams.c:8dbda857d93080d5:2", + "original_count": 1, + "scanner": "codeql-cpp" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.13", + "title": "cpp/cleartext-storage-file in config.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "high", + "status": "Not Completed", + "ownership": [ + "src/core/config.c", + "tests/unit/test_t7_13.c", + "tests/unit/cmake/eng/t7_13.cmake", + "quality/evidence/T7.13.md" + ], + "source_paths": [ + "src/core/config.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Verify file permissions, creation umask, redacted logs and credential read access; preserve compatible config loading. Residual necessary plaintext needs explicit reviewed exposure acceptance.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.13 --regex '^test_t7_13$'" + ], + "evidence": "quality/evidence/T7.13.md", + "finding_ids": [ + "CODEQL-267", + "CODEQL-64", + "CODEQL-63" + ], + "rule_id": "cpp/cleartext-storage-file", + "reproducers": [ + { + "id": "CODEQL-267", + "path": "src/core/config.c", + "line": 1930, + "fingerprint": "codeql:cpp/cleartext-storage-file:src/core/config.c:13c44693f16fcef2:1", + "original_count": 1, + "scanner": "codeql-cpp" + }, + { + "id": "CODEQL-64", + "path": "src/core/config.c", + "line": 1999, + "fingerprint": "codeql:cpp/cleartext-storage-file:src/core/config.c:c49a430640c7292a:1", + "original_count": 1, + "scanner": "codeql-cpp" + }, + { + "id": "CODEQL-63", + "path": "src/core/config.c", + "line": 1985, + "fingerprint": "codeql:cpp/cleartext-storage-file:src/core/config.c:308f36dd4bb6055e:1", + "original_count": 1, + "scanner": "codeql-cpp" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.14", + "title": "cpp/cleartext-transmission in hls_unified_thread.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "high", + "status": "Not Completed", + "ownership": [ + "src/video/hls/hls_unified_thread.c", + "tests/unit/test_t7_14.c", + "tests/unit/cmake/eng/t7_14.cmake", + "quality/evidence/T7.14.md" + ], + "source_paths": [ + "src/video/hls/hls_unified_thread.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Assert credential-bearing payloads are not disclosed to an untrusted/insecure destination; verify supported camera transport behavior. Any required legacy cleartext transport needs an explicit reviewed exposure exception.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.14 --regex '^test_t7_14$'" + ], + "evidence": "quality/evidence/T7.14.md", + "finding_ids": [ + "CODEQL-264" + ], + "rule_id": "cpp/cleartext-transmission", + "reproducers": [ + { + "id": "CODEQL-264", + "path": "src/video/hls/hls_unified_thread.c", + "line": 765, + "fingerprint": "codeql:cpp/cleartext-transmission:src/video/hls/hls_unified_thread.c:6590b2857f911535:1", + "original_count": 1, + "scanner": "codeql-cpp" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.15", + "title": "cpp/cleartext-transmission in stream_protocol.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "high", + "status": "Not Completed", + "ownership": [ + "src/video/stream_protocol.c", + "tests/unit/test_t7_15.c", + "tests/unit/cmake/eng/t7_15.cmake", + "quality/evidence/T7.15.md" + ], + "source_paths": [ + "src/video/stream_protocol.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Assert credential-bearing payloads are not disclosed to an untrusted/insecure destination; verify supported camera transport behavior. Any required legacy cleartext transport needs an explicit reviewed exposure exception.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.15 --regex '^test_t7_15$'" + ], + "evidence": "quality/evidence/T7.15.md", + "finding_ids": [ + "CODEQL-14" + ], + "rule_id": "cpp/cleartext-transmission", + "reproducers": [ + { + "id": "CODEQL-14", + "path": "src/video/stream_protocol.c", + "line": 241, + "fingerprint": "codeql:cpp/cleartext-transmission:src/video/stream_protocol.c:3b0c02f7eb3743b:1", + "original_count": 1, + "scanner": "codeql-cpp" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.16", + "title": "cpp/integer-multiplication-cast-to-long in mp4_writer_utils.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "high", + "status": "Not Completed", + "ownership": [ + "src/video/mp4_writer_utils.c", + "tests/unit/test_t7_16.c", + "tests/unit/cmake/eng/t7_16.cmake", + "quality/evidence/T7.16.md" + ], + "source_paths": [ + "src/video/mp4_writer_utils.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.16 --regex '^test_t7_16$'" + ], + "evidence": "quality/evidence/T7.16.md", + "finding_ids": [ + "CODEQL-329" + ], + "rule_id": "cpp/integer-multiplication-cast-to-long", + "reproducers": [ + { + "id": "CODEQL-329", + "path": "src/video/mp4_writer_utils.c", + "line": 1249, + "fingerprint": "codeql:cpp/integer-multiplication-cast-to-long:src/video/mp4_writer_utils.c:3e119948d005a888:1", + "original_count": 1, + "scanner": "codeql-cpp" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.17", + "title": "cpp/non-https-url in go2rtc_api.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "high", + "status": "Not Completed", + "ownership": [ + "src/video/go2rtc/go2rtc_api.c", + "tests/unit/test_t7_17.c", + "tests/unit/cmake/eng/t7_17.cmake", + "quality/evidence/T7.17.md" + ], + "source_paths": [ + "src/video/go2rtc/go2rtc_api.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Prove endpoint trust and transport policy for each reported URL; retain HTTP-only camera compatibility only with an explicitly reviewed exposure exception. Do not rewrite device endpoints to HTTPS without negotiation/support.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.17 --regex '^test_t7_17$'" + ], + "evidence": "quality/evidence/T7.17.md", + "finding_ids": [ + "CODEQL-78", + "CODEQL-77", + "CODEQL-76", + "CODEQL-75", + "CODEQL-71", + "CODEQL-70", + "CODEQL-69", + "CODEQL-20", + "CODEQL-19" + ], + "rule_id": "cpp/non-https-url", + "reproducers": [ + { + "id": "CODEQL-78", + "path": "src/video/go2rtc/go2rtc_api.c", + "line": 702, + "fingerprint": "codeql-alert:78", + "original_count": 1, + "scanner": "codeql-cpp" + }, + { + "id": "CODEQL-77", + "path": "src/video/go2rtc/go2rtc_api.c", + "line": 433, + "fingerprint": "codeql-alert:77", + "original_count": 1, + "scanner": "codeql-cpp" + }, + { + "id": "CODEQL-76", + "path": "src/video/go2rtc/go2rtc_api.c", + "line": 520, + "fingerprint": "codeql-alert:76", + "original_count": 1, + "scanner": "codeql-cpp" + }, + { + "id": "CODEQL-75", + "path": "src/video/go2rtc/go2rtc_api.c", + "line": 578, + "fingerprint": "codeql-alert:75", + "original_count": 1, + "scanner": "codeql-cpp" + }, + { + "id": "CODEQL-71", + "path": "src/video/go2rtc/go2rtc_api.c", + "line": 149, + "fingerprint": "codeql-alert:71", + "original_count": 1, + "scanner": "codeql-cpp" + }, + { + "id": "CODEQL-70", + "path": "src/video/go2rtc/go2rtc_api.c", + "line": 225, + "fingerprint": "codeql-alert:70", + "original_count": 1, + "scanner": "codeql-cpp" + }, + { + "id": "CODEQL-69", + "path": "src/video/go2rtc/go2rtc_api.c", + "line": 626, + "fingerprint": "codeql-alert:69", + "original_count": 1, + "scanner": "codeql-cpp" + }, + { + "id": "CODEQL-20", + "path": "src/video/go2rtc/go2rtc_api.c", + "line": 371, + "fingerprint": "codeql-alert:20", + "original_count": 1, + "scanner": "codeql-cpp" + }, + { + "id": "CODEQL-19", + "path": "src/video/go2rtc/go2rtc_api.c", + "line": 335, + "fingerprint": "codeql-alert:19", + "original_count": 1, + "scanner": "codeql-cpp" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.18", + "title": "cpp/non-https-url in onvif_detection.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "high", + "status": "Not Completed", + "ownership": [ + "src/video/onvif_detection.c", + "tests/unit/test_t7_18.c", + "tests/unit/cmake/eng/t7_18.cmake", + "quality/evidence/T7.18.md" + ], + "source_paths": [ + "src/video/onvif_detection.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Prove endpoint trust and transport policy for each reported URL; retain HTTP-only camera compatibility only with an explicitly reviewed exposure exception. Do not rewrite device endpoints to HTTPS without negotiation/support.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.18 --regex '^test_t7_18$'" + ], + "evidence": "quality/evidence/T7.18.md", + "finding_ids": [ + "CODEQL-337", + "CODEQL-336", + "CODEQL-335", + "CODEQL-334", + "CODEQL-272", + "CODEQL-271", + "CODEQL-270" + ], + "rule_id": "cpp/non-https-url", + "reproducers": [ + { + "id": "CODEQL-337", + "path": "src/video/onvif_detection.c", + "line": 702, + "fingerprint": "codeql:cpp/non-https-url:src/video/onvif_detection.c:2d6ec8d9ecce5414:1", + "original_count": 1, + "scanner": "codeql-cpp" + }, + { + "id": "CODEQL-336", + "path": "src/video/onvif_detection.c", + "line": 723, + "fingerprint": "codeql:cpp/non-https-url:src/video/onvif_detection.c:57c43ec28ee12785:1", + "original_count": 1, + "scanner": "codeql-cpp" + }, + { + "id": "CODEQL-335", + "path": "src/video/onvif_detection.c", + "line": 1493, + "fingerprint": "codeql:cpp/non-https-url:src/video/onvif_detection.c:978550b1b964438a:1", + "original_count": 1, + "scanner": "codeql-cpp" + }, + { + "id": "CODEQL-334", + "path": "src/video/onvif_detection.c", + "line": 1480, + "fingerprint": "codeql:cpp/non-https-url:src/video/onvif_detection.c:92ace6b8b6fbfcac:1", + "original_count": 1, + "scanner": "codeql-cpp" + }, + { + "id": "CODEQL-272", + "path": "src/video/onvif_detection.c", + "line": 752, + "fingerprint": "codeql:cpp/non-https-url:src/video/onvif_detection.c:8d57a932121d72cd:1", + "original_count": 1, + "scanner": "codeql-cpp" + }, + { + "id": "CODEQL-271", + "path": "src/video/onvif_detection.c", + "line": 904, + "fingerprint": "codeql:cpp/non-https-url:src/video/onvif_detection.c:a545ba6f506950f0:1", + "original_count": 1, + "scanner": "codeql-cpp" + }, + { + "id": "CODEQL-270", + "path": "src/video/onvif_detection.c", + "line": 882, + "fingerprint": "codeql:cpp/non-https-url:src/video/onvif_detection.c:2f7971b3450981cc:1", + "original_count": 1, + "scanner": "codeql-cpp" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.19", + "title": "cpp/non-https-url in onvif_discovery.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "high", + "status": "Not Completed", + "ownership": [ + "src/video/onvif_discovery.c", + "tests/unit/test_t7_19.c", + "tests/unit/cmake/eng/t7_19.cmake", + "quality/evidence/T7.19.md" + ], + "source_paths": [ + "src/video/onvif_discovery.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Prove endpoint trust and transport policy for each reported URL; retain HTTP-only camera compatibility only with an explicitly reviewed exposure exception. Do not rewrite device endpoints to HTTPS without negotiation/support.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.19 --regex '^test_t7_19$'" + ], + "evidence": "quality/evidence/T7.19.md", + "finding_ids": [ + "CODEQL-59" + ], + "rule_id": "cpp/non-https-url", + "reproducers": [ + { + "id": "CODEQL-59", + "path": "src/video/onvif_discovery.c", + "line": 531, + "fingerprint": "codeql:cpp/non-https-url:src/video/onvif_discovery.c:366d15987af98d51:1", + "original_count": 1, + "scanner": "codeql-cpp" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.20", + "title": "cpp/non-https-url in api_handlers_ptz.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "high", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_ptz.c", + "tests/unit/test_t7_20.c", + "tests/unit/cmake/eng/t7_20.cmake", + "quality/evidence/T7.20.md" + ], + "source_paths": [ + "src/web/api_handlers_ptz.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Prove endpoint trust and transport policy for each reported URL; retain HTTP-only camera compatibility only with an explicitly reviewed exposure exception. Do not rewrite device endpoints to HTTPS without negotiation/support.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.20 --regex '^test_t7_20$'" + ], + "evidence": "quality/evidence/T7.20.md", + "finding_ids": [ + "CODEQL-73" + ], + "rule_id": "cpp/non-https-url", + "reproducers": [ + { + "id": "CODEQL-73", + "path": "src/web/api_handlers_ptz.c", + "line": 58, + "fingerprint": "codeql-alert:73", + "original_count": 1, + "scanner": "codeql-cpp" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.21", + "title": "cpp/path-injection in storage_s3.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "high", + "status": "Not Completed", + "ownership": [ + "src/storage/storage_s3.c", + "tests/unit/test_t7_21.c", + "tests/unit/cmake/eng/t7_21.cmake", + "quality/evidence/T7.21.md" + ], + "source_paths": [ + "src/storage/storage_s3.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reject dot segments, separators and encoded traversal from untrusted names before filesystem access; assert normal names still select the intended file and no outside-tree path is opened.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.21 --regex '^test_t7_21$'" + ], + "evidence": "quality/evidence/T7.21.md", + "finding_ids": [ + "CODEQL-325" + ], + "rule_id": "cpp/path-injection", + "reproducers": [ + { + "id": "CODEQL-325", + "path": "src/storage/storage_s3.c", + "line": 138, + "fingerprint": "codeql:cpp/path-injection:src/storage/storage_s3.c:53b5b52ec460fa95:1", + "original_count": 1, + "scanner": "codeql-cpp" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.22", + "title": "cpp/path-injection in linux_cgroup.c, linux_network.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "high", + "status": "Not Completed", + "ownership": [ + "src/telemetry/collectors/linux_cgroup.c", + "src/telemetry/collectors/linux_network.c", + "tests/unit/test_t7_22.c", + "tests/unit/cmake/eng/t7_22.cmake", + "quality/evidence/T7.22.md" + ], + "source_paths": [ + "src/telemetry/collectors/linux_cgroup.c", + "src/telemetry/collectors/linux_network.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reject dot segments, separators and encoded traversal from untrusted names before filesystem access; assert normal names still select the intended file and no outside-tree path is opened.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.22 --regex '^test_t7_22$'" + ], + "evidence": "quality/evidence/T7.22.md", + "finding_ids": [ + "CODEQL-320", + "CODEQL-319", + "CODEQL-318", + "CODEQL-317" + ], + "rule_id": "cpp/path-injection", + "reproducers": [ + { + "id": "CODEQL-320", + "path": "src/telemetry/collectors/linux_network.c", + "line": 608, + "fingerprint": "codeql:cpp/path-injection:src/telemetry/collectors/linux_network.c:b5bcd3edc53410b8:1", + "original_count": 1, + "scanner": "codeql-cpp" + }, + { + "id": "CODEQL-319", + "path": "src/telemetry/collectors/linux_network.c", + "line": 575, + "fingerprint": "codeql:cpp/path-injection:src/telemetry/collectors/linux_network.c:3b3bfc107203db0b:1", + "original_count": 1, + "scanner": "codeql-cpp" + }, + { + "id": "CODEQL-318", + "path": "src/telemetry/collectors/linux_cgroup.c", + "line": 305, + "fingerprint": "codeql:cpp/path-injection:src/telemetry/collectors/linux_cgroup.c:e566474d56b69fef:1", + "original_count": 1, + "scanner": "codeql-cpp" + }, + { + "id": "CODEQL-317", + "path": "src/telemetry/collectors/linux_cgroup.c", + "line": 320, + "fingerprint": "codeql:cpp/path-injection:src/telemetry/collectors/linux_cgroup.c:2c8aa240e0b8e201:1", + "original_count": 1, + "scanner": "codeql-cpp" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.23", + "title": "cpp/sql-injection in sqlite_migrate.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "high", + "status": "Not Completed", + "ownership": [ + "src/database/sqlite_migrate.c", + "tests/unit/test_t7_23.c", + "tests/unit/cmake/eng/t7_23.cmake", + "quality/evidence/T7.23.md" + ], + "source_paths": [ + "src/database/sqlite_migrate.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Use quote, semicolon and comment-bearing identifiers in a disposable database; ensure they cannot execute a second statement or alter unrelated schema, while valid migration names still work.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.23 --regex '^test_t7_23$'" + ], + "evidence": "quality/evidence/T7.23.md", + "finding_ids": [ + "CODEQL-67", + "CODEQL-66" + ], + "rule_id": "cpp/sql-injection", + "reproducers": [ + { + "id": "CODEQL-67", + "path": "src/database/sqlite_migrate.c", + "line": 916, + "fingerprint": "codeql:cpp/sql-injection:src/database/sqlite_migrate.c:661998ab041486b2:1", + "original_count": 1, + "scanner": "codeql-cpp" + }, + { + "id": "CODEQL-66", + "path": "src/database/sqlite_migrate.c", + "line": 1005, + "fingerprint": "codeql:cpp/sql-injection:src/database/sqlite_migrate.c:65daccbf29f61c5f:1", + "original_count": 1, + "scanner": "codeql-cpp" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.24", + "title": "cpp/suspicious-pointer-scaling in frame.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "high", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_24-upstream.json", + "quality/evidence/T7.24.md" + ], + "source_paths": [ + "third_party/faac/libfaac/frame.c" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_24-upstream.json" + ], + "evidence": "quality/evidence/T7.24.md", + "finding_ids": [ + "CODEQL-330" + ], + "rule_id": "cpp/suspicious-pointer-scaling", + "reproducers": [ + { + "id": "CODEQL-330", + "path": "third_party/faac/libfaac/frame.c", + "line": 557, + "fingerprint": "codeql:cpp/suspicious-pointer-scaling:third_party/faac/libfaac/frame.c:fa72f8f97382e2ed:1", + "original_count": 1, + "scanner": "codeql-cpp" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.25", + "title": "cpp/toctou-race-condition in db_core.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "high", + "status": "Not Completed", + "ownership": [ + "src/database/db_core.c", + "tests/unit/test_t7_25.c", + "tests/unit/cmake/eng/t7_25.cmake", + "quality/evidence/T7.25.md" + ], + "source_paths": [ + "src/database/db_core.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise replacement/symlink races between validation and use; operations must hold and use the validated descriptor or reject changed identity, preserving normal success and cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.25 --regex '^test_t7_25$'" + ], + "evidence": "quality/evidence/T7.25.md", + "finding_ids": [ + "CODEQL-321" + ], + "rule_id": "cpp/toctou-race-condition", + "reproducers": [ + { + "id": "CODEQL-321", + "path": "src/database/db_core.c", + "line": 255, + "fingerprint": "codeql:cpp/toctou-race-condition:src/database/db_core.c:6494527ea640ab58:1", + "original_count": 1, + "scanner": "codeql-cpp" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.26", + "title": "cpp/toctou-race-condition in storage_migration.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "high", + "status": "Not Completed", + "ownership": [ + "src/storage/storage_migration.c", + "tests/unit/test_t7_26.c", + "tests/unit/cmake/eng/t7_26.cmake", + "quality/evidence/T7.26.md" + ], + "source_paths": [ + "src/storage/storage_migration.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise replacement/symlink races between validation and use; operations must hold and use the validated descriptor or reject changed identity, preserving normal success and cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.26 --regex '^test_t7_26$'" + ], + "evidence": "quality/evidence/T7.26.md", + "finding_ids": [ + "CODEQL-310" + ], + "rule_id": "cpp/toctou-race-condition", + "reproducers": [ + { + "id": "CODEQL-310", + "path": "src/storage/storage_migration.c", + "line": 430, + "fingerprint": "codeql:cpp/toctou-race-condition:src/storage/storage_migration.c:a72d1e0db3e808a7:1", + "original_count": 1, + "scanner": "codeql-cpp" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.27", + "title": "cpp/toctou-race-condition in api_handlers_operator_floor_plans.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "high", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_operator_floor_plans.c", + "tests/unit/test_t7_27.c", + "tests/unit/cmake/eng/t7_27.cmake", + "quality/evidence/T7.27.md" + ], + "source_paths": [ + "src/web/api_handlers_operator_floor_plans.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise replacement/symlink races between validation and use; operations must hold and use the validated descriptor or reject changed identity, preserving normal success and cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.27 --regex '^test_t7_27$'" + ], + "evidence": "quality/evidence/T7.27.md", + "finding_ids": [ + "CODEQL-315", + "CODEQL-314", + "CODEQL-313" + ], + "rule_id": "cpp/toctou-race-condition", + "reproducers": [ + { + "id": "CODEQL-315", + "path": "src/web/api_handlers_operator_floor_plans.c", + "line": 1073, + "fingerprint": "codeql:cpp/toctou-race-condition:src/web/api_handlers_operator_floor_plans.c:3e1df25fb5a82b27:1", + "original_count": 1, + "scanner": "codeql-cpp" + }, + { + "id": "CODEQL-314", + "path": "src/web/api_handlers_operator_floor_plans.c", + "line": 1064, + "fingerprint": "codeql:cpp/toctou-race-condition:src/web/api_handlers_operator_floor_plans.c:78db8851175c4ba2:1", + "original_count": 1, + "scanner": "codeql-cpp" + }, + { + "id": "CODEQL-313", + "path": "src/web/api_handlers_operator_floor_plans.c", + "line": 1053, + "fingerprint": "codeql:cpp/toctou-race-condition:src/web/api_handlers_operator_floor_plans.c:61278a1e48f4f467:1", + "original_count": 1, + "scanner": "codeql-cpp" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.28", + "title": "cpp/uncontrolled-allocation-size in event_router.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "high", + "status": "Not Completed", + "ownership": [ + "src/core/event_router.c", + "tests/unit/test_t7_28.c", + "tests/unit/cmake/eng/t7_28.cmake", + "quality/evidence/T7.28.md" + ], + "source_paths": [ + "src/core/event_router.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise zero, maximum accepted, one-past maximum and overflow-sized user inputs; reject before allocation/multiplication, leave state unchanged, and preserve ordinary delivery.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.28 --regex '^test_t7_28$'" + ], + "evidence": "quality/evidence/T7.28.md", + "finding_ids": [ + "CODEQL-306", + "CODEQL-305" + ], + "rule_id": "cpp/uncontrolled-allocation-size", + "reproducers": [ + { + "id": "CODEQL-306", + "path": "src/core/event_router.c", + "line": 267, + "fingerprint": "codeql:cpp/uncontrolled-allocation-size:src/core/event_router.c:5c77678f179baed1:1", + "original_count": 1, + "scanner": "codeql-cpp" + }, + { + "id": "CODEQL-305", + "path": "src/core/event_router.c", + "line": 265, + "fingerprint": "codeql:cpp/uncontrolled-allocation-size:src/core/event_router.c:77111263db291c60:1", + "original_count": 1, + "scanner": "codeql-cpp" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.29", + "title": "cpp/world-writable-file-creation in mqtt_client.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "high", + "status": "Not Completed", + "ownership": [ + "src/core/mqtt_client.c", + "tests/unit/test_t7_29.c", + "tests/unit/cmake/eng/t7_29.cmake", + "quality/evidence/T7.29.md" + ], + "source_paths": [ + "src/core/mqtt_client.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Create the credential-bearing file under a permissive umask and assert effective permissions exclude group/other access; retain existing owner and normal reload semantics.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.29 --regex '^test_t7_29$'" + ], + "evidence": "quality/evidence/T7.29.md", + "finding_ids": [ + "CODEQL-293" + ], + "rule_id": "cpp/world-writable-file-creation", + "reproducers": [ + { + "id": "CODEQL-293", + "path": "src/core/mqtt_client.c", + "line": 621, + "fingerprint": "codeql:cpp/world-writable-file-creation:src/core/mqtt_client.c:9bdc818fba83116:1", + "original_count": 1, + "scanner": "codeql-cpp" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.30", + "title": "arrayIndexOutOfBounds in stream_protocol.c", + "depends_on": [ + "T7", + "T13", + "T7.15" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/video/stream_protocol.c", + "tests/unit/test_t7_30.c", + "tests/unit/cmake/eng/t7_30.cmake", + "quality/evidence/T7.30.md" + ], + "source_paths": [ + "src/video/stream_protocol.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.30 --regex '^test_t7_30$'" + ], + "evidence": "quality/evidence/T7.30.md", + "finding_ids": [ + "CPPCHECK-0dfdce44e3f2c522" + ], + "rule_id": "arrayIndexOutOfBounds", + "reproducers": [ + { + "id": "CPPCHECK-0dfdce44e3f2c522", + "path": "src/video/stream_protocol.c", + "line": 637, + "fingerprint": "cppcheck:arrayIndexOutOfBounds:src/video/stream_protocol.c:0dfdce44e3f2c522", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.31", + "title": "clang-analyzer-core.CallAndMessage in system_health_policy.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/telemetry/system_health_policy.c", + "tests/unit/test_t7_31.c", + "tests/unit/cmake/eng/t7_31.cmake", + "quality/evidence/T7.31.md" + ], + "source_paths": [ + "src/telemetry/system_health_policy.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.31 --regex '^test_t7_31$'" + ], + "evidence": "quality/evidence/T7.31.md", + "finding_ids": [ + "CLANGTIDY-9b21a14b97b3a15e" + ], + "rule_id": "clang-analyzer-core.CallAndMessage", + "reproducers": [ + { + "id": "CLANGTIDY-9b21a14b97b3a15e", + "path": "src/telemetry/system_health_policy.c", + "line": 496, + "fingerprint": "clang-tidy:clang-analyzer-core.CallAndMessage:src/telemetry/system_health_policy.c:9b21a14b97b3a15e", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.32", + "title": "clang-analyzer-core.DivideZero in db_storage_pools.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/database/db_storage_pools.c", + "tests/unit/test_t7_32.c", + "tests/unit/cmake/eng/t7_32.cmake", + "quality/evidence/T7.32.md" + ], + "source_paths": [ + "src/database/db_storage_pools.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.32 --regex '^test_t7_32$'" + ], + "evidence": "quality/evidence/T7.32.md", + "finding_ids": [ + "CLANGTIDY-b7cb62f9287bca53" + ], + "rule_id": "clang-analyzer-core.DivideZero", + "reproducers": [ + { + "id": "CLANGTIDY-b7cb62f9287bca53", + "path": "src/database/db_storage_pools.c", + "line": 385, + "fingerprint": "clang-tidy:clang-analyzer-core.DivideZero:src/database/db_storage_pools.c:b7cb62f9287bca53", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.33", + "title": "clang-analyzer-core.NonNullParamChecker in camera_collection_filter.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/core/camera_collection_filter.c", + "tests/unit/test_t7_33.c", + "tests/unit/cmake/eng/t7_33.cmake", + "quality/evidence/T7.33.md" + ], + "source_paths": [ + "src/core/camera_collection_filter.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.33 --regex '^test_t7_33$'" + ], + "evidence": "quality/evidence/T7.33.md", + "finding_ids": [ + "CLANGTIDY-a918c6008bfe9234" + ], + "rule_id": "clang-analyzer-core.NonNullParamChecker", + "reproducers": [ + { + "id": "CLANGTIDY-a918c6008bfe9234", + "path": "src/core/camera_collection_filter.c", + "line": 152, + "fingerprint": "clang-tidy:clang-analyzer-core.NonNullParamChecker:src/core/camera_collection_filter.c:a918c6008bfe9234", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.34", + "title": "clang-analyzer-core.NonNullParamChecker in db_storage_policies.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/database/db_storage_policies.c", + "tests/unit/test_t7_34.c", + "tests/unit/cmake/eng/t7_34.cmake", + "quality/evidence/T7.34.md" + ], + "source_paths": [ + "src/database/db_storage_policies.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.34 --regex '^test_t7_34$'" + ], + "evidence": "quality/evidence/T7.34.md", + "finding_ids": [ + "CLANGTIDY-a5ab5fe6add78d8e" + ], + "rule_id": "clang-analyzer-core.NonNullParamChecker", + "reproducers": [ + { + "id": "CLANGTIDY-a5ab5fe6add78d8e", + "path": "src/database/db_storage_policies.c", + "line": 47, + "fingerprint": "clang-tidy:clang-analyzer-core.NonNullParamChecker:src/database/db_storage_policies.c:a5ab5fe6add78d8e", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.35", + "title": "clang-analyzer-core.NonNullParamChecker in storage_s3.c", + "depends_on": [ + "T7", + "T13", + "T7.21" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/storage/storage_s3.c", + "tests/unit/test_t7_35.c", + "tests/unit/cmake/eng/t7_35.cmake", + "quality/evidence/T7.35.md" + ], + "source_paths": [ + "src/storage/storage_s3.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.35 --regex '^test_t7_35$'" + ], + "evidence": "quality/evidence/T7.35.md", + "finding_ids": [ + "CLANGTIDY-cb260984bd5750f8" + ], + "rule_id": "clang-analyzer-core.NonNullParamChecker", + "reproducers": [ + { + "id": "CLANGTIDY-cb260984bd5750f8", + "path": "src/storage/storage_s3.c", + "line": 717, + "fingerprint": "clang-tidy:clang-analyzer-core.NonNullParamChecker:src/storage/storage_s3.c:cb260984bd5750f8", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.36", + "title": "clang-analyzer-core.NullDereference in event_envelope.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/core/event_envelope.c", + "tests/unit/test_t7_36.c", + "tests/unit/cmake/eng/t7_36.cmake", + "quality/evidence/T7.36.md" + ], + "source_paths": [ + "src/core/event_envelope.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.36 --regex '^test_t7_36$'" + ], + "evidence": "quality/evidence/T7.36.md", + "finding_ids": [ + "CLANGTIDY-f240093f03b567fb" + ], + "rule_id": "clang-analyzer-core.NullDereference", + "reproducers": [ + { + "id": "CLANGTIDY-f240093f03b567fb", + "path": "src/core/event_envelope.c", + "line": 407, + "fingerprint": "clang-tidy:clang-analyzer-core.NullDereference:src/core/event_envelope.c:f240093f03b567fb", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.37", + "title": "clang-analyzer-core.NullDereference in db_live_saved_layouts.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/database/db_live_saved_layouts.c", + "tests/unit/test_t7_37.c", + "tests/unit/cmake/eng/t7_37.cmake", + "quality/evidence/T7.37.md" + ], + "source_paths": [ + "src/database/db_live_saved_layouts.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.37 --regex '^test_t7_37$'" + ], + "evidence": "quality/evidence/T7.37.md", + "finding_ids": [ + "CLANGTIDY-f8203edcc8863cd8" + ], + "rule_id": "clang-analyzer-core.NullDereference", + "reproducers": [ + { + "id": "CLANGTIDY-f8203edcc8863cd8", + "path": "src/database/db_live_saved_layouts.c", + "line": 76, + "fingerprint": "clang-tidy:clang-analyzer-core.NullDereference:src/database/db_live_saved_layouts.c:f8203edcc8863cd8", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.38", + "title": "clang-analyzer-core.NullDereference in db_storage_policies.c", + "depends_on": [ + "T7", + "T13", + "T7.34" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/database/db_storage_policies.c", + "tests/unit/test_t7_38.c", + "tests/unit/cmake/eng/t7_38.cmake", + "quality/evidence/T7.38.md" + ], + "source_paths": [ + "src/database/db_storage_policies.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.38 --regex '^test_t7_38$'" + ], + "evidence": "quality/evidence/T7.38.md", + "finding_ids": [ + "CLANGTIDY-179513c629f1ecac" + ], + "rule_id": "clang-analyzer-core.NullDereference", + "reproducers": [ + { + "id": "CLANGTIDY-179513c629f1ecac", + "path": "src/database/db_storage_policies.c", + "line": 509, + "fingerprint": "clang-tidy:clang-analyzer-core.NullDereference:src/database/db_storage_policies.c:179513c629f1ecac", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.39", + "title": "clang-analyzer-core.NullDereference in smartctl_provider.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/telemetry/providers/smartctl_provider.c", + "tests/unit/test_t7_39.c", + "tests/unit/cmake/eng/t7_39.cmake", + "quality/evidence/T7.39.md" + ], + "source_paths": [ + "src/telemetry/providers/smartctl_provider.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.39 --regex '^test_t7_39$'" + ], + "evidence": "quality/evidence/T7.39.md", + "finding_ids": [ + "CLANGTIDY-33d1c32daba1778e" + ], + "rule_id": "clang-analyzer-core.NullDereference", + "reproducers": [ + { + "id": "CLANGTIDY-33d1c32daba1778e", + "path": "src/telemetry/providers/smartctl_provider.c", + "line": 194, + "fingerprint": "clang-tidy:clang-analyzer-core.NullDereference:src/telemetry/providers/smartctl_provider.c:33d1c32daba1778e", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.40", + "title": "clang-analyzer-core.NullDereference in go2rtc_api.c", + "depends_on": [ + "T7", + "T13", + "T7.17" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/video/go2rtc/go2rtc_api.c", + "tests/unit/test_t7_40.c", + "tests/unit/cmake/eng/t7_40.cmake", + "quality/evidence/T7.40.md" + ], + "source_paths": [ + "src/video/go2rtc/go2rtc_api.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.40 --regex '^test_t7_40$'" + ], + "evidence": "quality/evidence/T7.40.md", + "finding_ids": [ + "CLANGTIDY-14fc6cb721e4ff46" + ], + "rule_id": "clang-analyzer-core.NullDereference", + "reproducers": [ + { + "id": "CLANGTIDY-14fc6cb721e4ff46", + "path": "src/video/go2rtc/go2rtc_api.c", + "line": 782, + "fingerprint": "clang-tidy:clang-analyzer-core.NullDereference:src/video/go2rtc/go2rtc_api.c:14fc6cb721e4ff46", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.41", + "title": "clang-analyzer-core.NullDereference in hls_writer.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/video/hls_writer.c", + "tests/unit/test_t7_41.c", + "tests/unit/cmake/eng/t7_41.cmake", + "quality/evidence/T7.41.md" + ], + "source_paths": [ + "src/video/hls_writer.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.41 --regex '^test_t7_41$'" + ], + "evidence": "quality/evidence/T7.41.md", + "finding_ids": [ + "CLANGTIDY-848024a1059f9105", + "CLANGTIDY-c18dbfa67bfd519e" + ], + "rule_id": "clang-analyzer-core.NullDereference", + "reproducers": [ + { + "id": "CLANGTIDY-848024a1059f9105", + "path": "src/video/hls_writer.c", + "line": 366, + "fingerprint": "clang-tidy:clang-analyzer-core.NullDereference:src/video/hls_writer.c:848024a1059f9105", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-c18dbfa67bfd519e", + "path": "src/video/hls_writer.c", + "line": 555, + "fingerprint": "clang-tidy:clang-analyzer-core.NullDereference:src/video/hls_writer.c:c18dbfa67bfd519e", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.42", + "title": "clang-analyzer-core.NullDereference in api_handlers_authorization.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_authorization.c", + "tests/unit/test_t7_42.c", + "tests/unit/cmake/eng/t7_42.cmake", + "quality/evidence/T7.42.md" + ], + "source_paths": [ + "src/web/api_handlers_authorization.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.42 --regex '^test_t7_42$'" + ], + "evidence": "quality/evidence/T7.42.md", + "finding_ids": [ + "CLANGTIDY-3853c804fd823d76", + "CLANGTIDY-e903e0b58c1ab7fb", + "CLANGTIDY-7037bcf50d8dd6e1", + "CLANGTIDY-468c829b1cc867f5", + "CLANGTIDY-5546a3c4710ffc07", + "CLANGTIDY-9c42b9e1d1f45117", + "CLANGTIDY-b45db718e3e94b0d" + ], + "rule_id": "clang-analyzer-core.NullDereference", + "reproducers": [ + { + "id": "CLANGTIDY-3853c804fd823d76", + "path": "src/web/api_handlers_authorization.c", + "line": 892, + "fingerprint": "clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_authorization.c:3853c804fd823d76", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-e903e0b58c1ab7fb", + "path": "src/web/api_handlers_authorization.c", + "line": 893, + "fingerprint": "clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_authorization.c:e903e0b58c1ab7fb", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-7037bcf50d8dd6e1", + "path": "src/web/api_handlers_authorization.c", + "line": 918, + "fingerprint": "clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_authorization.c:7037bcf50d8dd6e1", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-468c829b1cc867f5", + "path": "src/web/api_handlers_authorization.c", + "line": 1499, + "fingerprint": "clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_authorization.c:468c829b1cc867f5", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-5546a3c4710ffc07", + "path": "src/web/api_handlers_authorization.c", + "line": 1520, + "fingerprint": "clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_authorization.c:5546a3c4710ffc07", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-9c42b9e1d1f45117", + "path": "src/web/api_handlers_authorization.c", + "line": 1612, + "fingerprint": "clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_authorization.c:9c42b9e1d1f45117", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-b45db718e3e94b0d", + "path": "src/web/api_handlers_authorization.c", + "line": 1620, + "fingerprint": "clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_authorization.c:b45db718e3e94b0d", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.43", + "title": "clang-analyzer-core.NullDereference in api_handlers_fleet.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_fleet.c", + "tests/unit/test_t7_43.c", + "tests/unit/cmake/eng/t7_43.cmake", + "quality/evidence/T7.43.md" + ], + "source_paths": [ + "src/web/api_handlers_fleet.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.43 --regex '^test_t7_43$'" + ], + "evidence": "quality/evidence/T7.43.md", + "finding_ids": [ + "CLANGTIDY-dc1d8989b6dc0f0a" + ], + "rule_id": "clang-analyzer-core.NullDereference", + "reproducers": [ + { + "id": "CLANGTIDY-dc1d8989b6dc0f0a", + "path": "src/web/api_handlers_fleet.c", + "line": 816, + "fingerprint": "clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_fleet.c:dc1d8989b6dc0f0a", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.44", + "title": "clang-analyzer-core.NullDereference in api_handlers_health.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_health.c", + "tests/unit/test_t7_44.c", + "tests/unit/cmake/eng/t7_44.cmake", + "quality/evidence/T7.44.md" + ], + "source_paths": [ + "src/web/api_handlers_health.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.44 --regex '^test_t7_44$'" + ], + "evidence": "quality/evidence/T7.44.md", + "finding_ids": [ + "CLANGTIDY-18224b07c8f96008" + ], + "rule_id": "clang-analyzer-core.NullDereference", + "reproducers": [ + { + "id": "CLANGTIDY-18224b07c8f96008", + "path": "src/web/api_handlers_health.c", + "line": 367, + "fingerprint": "clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_health.c:18224b07c8f96008", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.45", + "title": "clang-analyzer-core.NullDereference in api_handlers_lpr.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_lpr.c", + "tests/unit/test_t7_45.c", + "tests/unit/cmake/eng/t7_45.cmake", + "quality/evidence/T7.45.md" + ], + "source_paths": [ + "src/web/api_handlers_lpr.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.45 --regex '^test_t7_45$'" + ], + "evidence": "quality/evidence/T7.45.md", + "finding_ids": [ + "CLANGTIDY-36ab8111fbec813b", + "CLANGTIDY-21f4fa94b0f2d17d" + ], + "rule_id": "clang-analyzer-core.NullDereference", + "reproducers": [ + { + "id": "CLANGTIDY-36ab8111fbec813b", + "path": "src/web/api_handlers_lpr.c", + "line": 32, + "fingerprint": "clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_lpr.c:36ab8111fbec813b", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-21f4fa94b0f2d17d", + "path": "src/web/api_handlers_lpr.c", + "line": 150, + "fingerprint": "clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_lpr.c:21f4fa94b0f2d17d", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.46", + "title": "clang-analyzer-core.NullDereference in api_handlers_recording_control.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_recording_control.c", + "tests/unit/test_t7_46.c", + "tests/unit/cmake/eng/t7_46.cmake", + "quality/evidence/T7.46.md" + ], + "source_paths": [ + "src/web/api_handlers_recording_control.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.46 --regex '^test_t7_46$'" + ], + "evidence": "quality/evidence/T7.46.md", + "finding_ids": [ + "CLANGTIDY-e722e2369c13444f" + ], + "rule_id": "clang-analyzer-core.NullDereference", + "reproducers": [ + { + "id": "CLANGTIDY-e722e2369c13444f", + "path": "src/web/api_handlers_recording_control.c", + "line": 153, + "fingerprint": "clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_recording_control.c:e722e2369c13444f", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.47", + "title": "clang-analyzer-core.NullDereference in api_handlers_retention.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_retention.c", + "tests/unit/test_t7_47.c", + "tests/unit/cmake/eng/t7_47.cmake", + "quality/evidence/T7.47.md" + ], + "source_paths": [ + "src/web/api_handlers_retention.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.47 --regex '^test_t7_47$'" + ], + "evidence": "quality/evidence/T7.47.md", + "finding_ids": [ + "CLANGTIDY-67d853afc9b7eefe" + ], + "rule_id": "clang-analyzer-core.NullDereference", + "reproducers": [ + { + "id": "CLANGTIDY-67d853afc9b7eefe", + "path": "src/web/api_handlers_retention.c", + "line": 532, + "fingerprint": "clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_retention.c:67d853afc9b7eefe", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.48", + "title": "clang-analyzer-core.NullDereference in api_handlers_storage_migrations.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_storage_migrations.c", + "tests/unit/test_t7_48.c", + "tests/unit/cmake/eng/t7_48.cmake", + "quality/evidence/T7.48.md" + ], + "source_paths": [ + "src/web/api_handlers_storage_migrations.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.48 --regex '^test_t7_48$'" + ], + "evidence": "quality/evidence/T7.48.md", + "finding_ids": [ + "CLANGTIDY-44c26e7cc4f14d25", + "CLANGTIDY-7f68b57abf95cdae" + ], + "rule_id": "clang-analyzer-core.NullDereference", + "reproducers": [ + { + "id": "CLANGTIDY-44c26e7cc4f14d25", + "path": "src/web/api_handlers_storage_migrations.c", + "line": 202, + "fingerprint": "clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_storage_migrations.c:44c26e7cc4f14d25", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-7f68b57abf95cdae", + "path": "src/web/api_handlers_storage_migrations.c", + "line": 206, + "fingerprint": "clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_storage_migrations.c:7f68b57abf95cdae", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.49", + "title": "clang-analyzer-core.NullDereference in api_handlers_streams_get.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_streams_get.c", + "tests/unit/test_t7_49.c", + "tests/unit/cmake/eng/t7_49.cmake", + "quality/evidence/T7.49.md" + ], + "source_paths": [ + "src/web/api_handlers_streams_get.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.49 --regex '^test_t7_49$'" + ], + "evidence": "quality/evidence/T7.49.md", + "finding_ids": [ + "CLANGTIDY-2b9b559954a51bc7" + ], + "rule_id": "clang-analyzer-core.NullDereference", + "reproducers": [ + { + "id": "CLANGTIDY-2b9b559954a51bc7", + "path": "src/web/api_handlers_streams_get.c", + "line": 358, + "fingerprint": "clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_streams_get.c:2b9b559954a51bc7", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.50", + "title": "clang-analyzer-core.NullDereference in api_handlers_streams_modify.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_streams_modify.c", + "tests/unit/test_t7_50.c", + "tests/unit/cmake/eng/t7_50.cmake", + "quality/evidence/T7.50.md" + ], + "source_paths": [ + "src/web/api_handlers_streams_modify.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.50 --regex '^test_t7_50$'" + ], + "evidence": "quality/evidence/T7.50.md", + "finding_ids": [ + "CLANGTIDY-3ac69a72123df761" + ], + "rule_id": "clang-analyzer-core.NullDereference", + "reproducers": [ + { + "id": "CLANGTIDY-3ac69a72123df761", + "path": "src/web/api_handlers_streams_modify.c", + "line": 529, + "fingerprint": "clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_streams_modify.c:3ac69a72123df761", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.51", + "title": "clang-analyzer-core.NullDereference in api_handlers_system_health.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_system_health.c", + "tests/unit/test_t7_51.c", + "tests/unit/cmake/eng/t7_51.cmake", + "quality/evidence/T7.51.md" + ], + "source_paths": [ + "src/web/api_handlers_system_health.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.51 --regex '^test_t7_51$'" + ], + "evidence": "quality/evidence/T7.51.md", + "finding_ids": [ + "CLANGTIDY-2eb8f8220e64672b", + "CLANGTIDY-8935718b76906f1e", + "CLANGTIDY-db6d4840afaa43ce", + "CLANGTIDY-6253a319b7ed3b31" + ], + "rule_id": "clang-analyzer-core.NullDereference", + "reproducers": [ + { + "id": "CLANGTIDY-2eb8f8220e64672b", + "path": "src/web/api_handlers_system_health.c", + "line": 769, + "fingerprint": "clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_system_health.c:2eb8f8220e64672b", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-8935718b76906f1e", + "path": "src/web/api_handlers_system_health.c", + "line": 787, + "fingerprint": "clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_system_health.c:8935718b76906f1e", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-db6d4840afaa43ce", + "path": "src/web/api_handlers_system_health.c", + "line": 800, + "fingerprint": "clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_system_health.c:db6d4840afaa43ce", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-6253a319b7ed3b31", + "path": "src/web/api_handlers_system_health.c", + "line": 810, + "fingerprint": "clang-tidy:clang-analyzer-core.NullDereference:src/web/api_handlers_system_health.c:6253a319b7ed3b31", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.52", + "title": "clang-analyzer-core.UndefinedBinaryOperatorResult in path_utils.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/core/path_utils.c", + "tests/unit/test_t7_52.c", + "tests/unit/cmake/eng/t7_52.cmake", + "quality/evidence/T7.52.md" + ], + "source_paths": [ + "src/core/path_utils.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.52 --regex '^test_t7_52$'" + ], + "evidence": "quality/evidence/T7.52.md", + "finding_ids": [ + "CLANGTIDY-d86514e7015dbd70" + ], + "rule_id": "clang-analyzer-core.UndefinedBinaryOperatorResult", + "reproducers": [ + { + "id": "CLANGTIDY-d86514e7015dbd70", + "path": "src/core/path_utils.c", + "line": 224, + "fingerprint": "clang-tidy:clang-analyzer-core.UndefinedBinaryOperatorResult:src/core/path_utils.c:d86514e7015dbd70", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.53", + "title": "clang-analyzer-security.ArrayBound in authorization.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/core/authorization.c", + "tests/unit/test_t7_53.c", + "tests/unit/cmake/eng/t7_53.cmake", + "quality/evidence/T7.53.md" + ], + "source_paths": [ + "src/core/authorization.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.53 --regex '^test_t7_53$'" + ], + "evidence": "quality/evidence/T7.53.md", + "finding_ids": [ + "CLANGTIDY-c4536c7eb269c97d", + "CLANGTIDY-dc57edf3e0b50ae4" + ], + "rule_id": "clang-analyzer-security.ArrayBound", + "reproducers": [ + { + "id": "CLANGTIDY-c4536c7eb269c97d", + "path": "src/core/authorization.c", + "line": 212, + "fingerprint": "clang-tidy:clang-analyzer-security.ArrayBound:src/core/authorization.c:c4536c7eb269c97d", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-dc57edf3e0b50ae4", + "path": "src/core/authorization.c", + "line": 251, + "fingerprint": "clang-tidy:clang-analyzer-security.ArrayBound:src/core/authorization.c:dc57edf3e0b50ae4", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.54", + "title": "clang-analyzer-security.ArrayBound in logger_json.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/core/logger_json.c", + "tests/unit/test_t7_54.c", + "tests/unit/cmake/eng/t7_54.cmake", + "quality/evidence/T7.54.md" + ], + "source_paths": [ + "src/core/logger_json.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.54 --regex '^test_t7_54$'" + ], + "evidence": "quality/evidence/T7.54.md", + "finding_ids": [ + "CLANGTIDY-ff30996a0be1b3ef" + ], + "rule_id": "clang-analyzer-security.ArrayBound", + "reproducers": [ + { + "id": "CLANGTIDY-ff30996a0be1b3ef", + "path": "src/core/logger_json.c", + "line": 258, + "fingerprint": "clang-tidy:clang-analyzer-security.ArrayBound:src/core/logger_json.c:ff30996a0be1b3ef", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.55", + "title": "clang-analyzer-security.ArrayBound in main.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/core/main.c", + "tests/unit/test_t7_55.c", + "tests/unit/cmake/eng/t7_55.cmake", + "quality/evidence/T7.55.md" + ], + "source_paths": [ + "src/core/main.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.55 --regex '^test_t7_55$'" + ], + "evidence": "quality/evidence/T7.55.md", + "finding_ids": [ + "CLANGTIDY-470e897ffa76864e" + ], + "rule_id": "clang-analyzer-security.ArrayBound", + "reproducers": [ + { + "id": "CLANGTIDY-470e897ffa76864e", + "path": "src/core/main.c", + "line": 362, + "fingerprint": "clang-tidy:clang-analyzer-security.ArrayBound:src/core/main.c:470e897ffa76864e", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.56", + "title": "clang-analyzer-security.ArrayBound in sqlite_migrate.c", + "depends_on": [ + "T7", + "T13", + "T7.23" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/database/sqlite_migrate.c", + "tests/unit/test_t7_56.c", + "tests/unit/cmake/eng/t7_56.cmake", + "quality/evidence/T7.56.md" + ], + "source_paths": [ + "src/database/sqlite_migrate.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.56 --regex '^test_t7_56$'" + ], + "evidence": "quality/evidence/T7.56.md", + "finding_ids": [ + "CLANGTIDY-2772ec37ee463512" + ], + "rule_id": "clang-analyzer-security.ArrayBound", + "reproducers": [ + { + "id": "CLANGTIDY-2772ec37ee463512", + "path": "src/database/sqlite_migrate.c", + "line": 404, + "fingerprint": "clang-tidy:clang-analyzer-security.ArrayBound:src/database/sqlite_migrate.c:2772ec37ee463512", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.57", + "title": "clang-analyzer-security.ArrayBound in linux_network.c, linux_process.c, linux_restart.c, linux_thermal.c", + "depends_on": [ + "T7", + "T13", + "T7.22" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/telemetry/collectors/linux_network.c", + "src/telemetry/collectors/linux_process.c", + "src/telemetry/collectors/linux_restart.c", + "src/telemetry/collectors/linux_thermal.c", + "tests/unit/test_t7_57.c", + "tests/unit/cmake/eng/t7_57.cmake", + "quality/evidence/T7.57.md" + ], + "source_paths": [ + "src/telemetry/collectors/linux_network.c", + "src/telemetry/collectors/linux_process.c", + "src/telemetry/collectors/linux_restart.c", + "src/telemetry/collectors/linux_thermal.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.57 --regex '^test_t7_57$'" + ], + "evidence": "quality/evidence/T7.57.md", + "finding_ids": [ + "CLANGTIDY-9259d0adb44e3ab3", + "CLANGTIDY-55f597a830e65b4d", + "CLANGTIDY-eaf20c1f0de62870", + "CLANGTIDY-c05a923060c50809", + "CLANGTIDY-30cd36651cb697e6" + ], + "rule_id": "clang-analyzer-security.ArrayBound", + "reproducers": [ + { + "id": "CLANGTIDY-9259d0adb44e3ab3", + "path": "src/telemetry/collectors/linux_network.c", + "line": 136, + "fingerprint": "clang-tidy:clang-analyzer-security.ArrayBound:src/telemetry/collectors/linux_network.c:9259d0adb44e3ab3", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-55f597a830e65b4d", + "path": "src/telemetry/collectors/linux_process.c", + "line": 212, + "fingerprint": "clang-tidy:clang-analyzer-security.ArrayBound:src/telemetry/collectors/linux_process.c:55f597a830e65b4d", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-eaf20c1f0de62870", + "path": "src/telemetry/collectors/linux_restart.c", + "line": 59, + "fingerprint": "clang-tidy:clang-analyzer-security.ArrayBound:src/telemetry/collectors/linux_restart.c:eaf20c1f0de62870", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-c05a923060c50809", + "path": "src/telemetry/collectors/linux_thermal.c", + "line": 92, + "fingerprint": "clang-tidy:clang-analyzer-security.ArrayBound:src/telemetry/collectors/linux_thermal.c:c05a923060c50809", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-30cd36651cb697e6", + "path": "src/telemetry/collectors/linux_thermal.c", + "line": 158, + "fingerprint": "clang-tidy:clang-analyzer-security.ArrayBound:src/telemetry/collectors/linux_thermal.c:30cd36651cb697e6", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.58", + "title": "clang-analyzer-security.ArrayBound in linux_hardware.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/telemetry/providers/linux_hardware.c", + "tests/unit/test_t7_58.c", + "tests/unit/cmake/eng/t7_58.cmake", + "quality/evidence/T7.58.md" + ], + "source_paths": [ + "src/telemetry/providers/linux_hardware.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.58 --regex '^test_t7_58$'" + ], + "evidence": "quality/evidence/T7.58.md", + "finding_ids": [ + "CLANGTIDY-29fe00c504db3f7e", + "CLANGTIDY-93f7df7451e39223" + ], + "rule_id": "clang-analyzer-security.ArrayBound", + "reproducers": [ + { + "id": "CLANGTIDY-29fe00c504db3f7e", + "path": "src/telemetry/providers/linux_hardware.c", + "line": 102, + "fingerprint": "clang-tidy:clang-analyzer-security.ArrayBound:src/telemetry/providers/linux_hardware.c:29fe00c504db3f7e", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-93f7df7451e39223", + "path": "src/telemetry/providers/linux_hardware.c", + "line": 148, + "fingerprint": "clang-tidy:clang-analyzer-security.ArrayBound:src/telemetry/providers/linux_hardware.c:93f7df7451e39223", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.59", + "title": "clang-analyzer-security.ArrayBound in system_health.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/telemetry/system_health.c", + "tests/unit/test_t7_59.c", + "tests/unit/cmake/eng/t7_59.cmake", + "quality/evidence/T7.59.md" + ], + "source_paths": [ + "src/telemetry/system_health.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.59 --regex '^test_t7_59$'" + ], + "evidence": "quality/evidence/T7.59.md", + "finding_ids": [ + "CLANGTIDY-192595ad5f7437f2" + ], + "rule_id": "clang-analyzer-security.ArrayBound", + "reproducers": [ + { + "id": "CLANGTIDY-192595ad5f7437f2", + "path": "src/telemetry/system_health.c", + "line": 765, + "fingerprint": "clang-tidy:clang-analyzer-security.ArrayBound:src/telemetry/system_health.c:192595ad5f7437f2", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.60", + "title": "clang-analyzer-security.ArrayBound in go2rtc_process.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/video/go2rtc/go2rtc_process.c", + "tests/unit/test_t7_60.c", + "tests/unit/cmake/eng/t7_60.cmake", + "quality/evidence/T7.60.md" + ], + "source_paths": [ + "src/video/go2rtc/go2rtc_process.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.60 --regex '^test_t7_60$'" + ], + "evidence": "quality/evidence/T7.60.md", + "finding_ids": [ + "CLANGTIDY-6eb7be7d5d4be88a" + ], + "rule_id": "clang-analyzer-security.ArrayBound", + "reproducers": [ + { + "id": "CLANGTIDY-6eb7be7d5d4be88a", + "path": "src/video/go2rtc/go2rtc_process.c", + "line": 95, + "fingerprint": "clang-tidy:clang-analyzer-security.ArrayBound:src/video/go2rtc/go2rtc_process.c:6eb7be7d5d4be88a", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.61", + "title": "clang-analyzer-security.ArrayBound in hls_cache_cleanup.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/video/hls/hls_cache_cleanup.c", + "tests/unit/test_t7_61.c", + "tests/unit/cmake/eng/t7_61.cmake", + "quality/evidence/T7.61.md" + ], + "source_paths": [ + "src/video/hls/hls_cache_cleanup.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.61 --regex '^test_t7_61$'" + ], + "evidence": "quality/evidence/T7.61.md", + "finding_ids": [ + "CLANGTIDY-e88c078f85b44a5e" + ], + "rule_id": "clang-analyzer-security.ArrayBound", + "reproducers": [ + { + "id": "CLANGTIDY-e88c078f85b44a5e", + "path": "src/video/hls/hls_cache_cleanup.c", + "line": 52, + "fingerprint": "clang-tidy:clang-analyzer-security.ArrayBound:src/video/hls/hls_cache_cleanup.c:e88c078f85b44a5e", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.62", + "title": "clang-analyzer-security.ArrayBound in stream_manager.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/video/stream_manager.c", + "tests/unit/test_t7_62.c", + "tests/unit/cmake/eng/t7_62.cmake", + "quality/evidence/T7.62.md" + ], + "source_paths": [ + "src/video/stream_manager.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.62 --regex '^test_t7_62$'" + ], + "evidence": "quality/evidence/T7.62.md", + "finding_ids": [ + "CLANGTIDY-87fe5c4f9b2c4103" + ], + "rule_id": "clang-analyzer-security.ArrayBound", + "reproducers": [ + { + "id": "CLANGTIDY-87fe5c4f9b2c4103", + "path": "src/video/stream_manager.c", + "line": 278, + "fingerprint": "clang-tidy:clang-analyzer-security.ArrayBound:src/video/stream_manager.c:87fe5c4f9b2c4103", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.63", + "title": "clang-analyzer-security.ArrayBound in api_handlers_fleet.c", + "depends_on": [ + "T7", + "T13", + "T7.43" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_fleet.c", + "tests/unit/test_t7_63.c", + "tests/unit/cmake/eng/t7_63.cmake", + "quality/evidence/T7.63.md" + ], + "source_paths": [ + "src/web/api_handlers_fleet.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.63 --regex '^test_t7_63$'" + ], + "evidence": "quality/evidence/T7.63.md", + "finding_ids": [ + "CLANGTIDY-b6500f12e4ee30b7", + "CLANGTIDY-a01b119b5b6a4463" + ], + "rule_id": "clang-analyzer-security.ArrayBound", + "reproducers": [ + { + "id": "CLANGTIDY-b6500f12e4ee30b7", + "path": "src/web/api_handlers_fleet.c", + "line": 274, + "fingerprint": "clang-tidy:clang-analyzer-security.ArrayBound:src/web/api_handlers_fleet.c:b6500f12e4ee30b7", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-a01b119b5b6a4463", + "path": "src/web/api_handlers_fleet.c", + "line": 816, + "fingerprint": "clang-tidy:clang-analyzer-security.ArrayBound:src/web/api_handlers_fleet.c:a01b119b5b6a4463", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.64", + "title": "clang-analyzer-security.ArrayBound in api_handlers_streams_get.c", + "depends_on": [ + "T7", + "T13", + "T7.49" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_streams_get.c", + "tests/unit/test_t7_64.c", + "tests/unit/cmake/eng/t7_64.cmake", + "quality/evidence/T7.64.md" + ], + "source_paths": [ + "src/web/api_handlers_streams_get.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.64 --regex '^test_t7_64$'" + ], + "evidence": "quality/evidence/T7.64.md", + "finding_ids": [ + "CLANGTIDY-d562d8dbfbb1dcc3", + "CLANGTIDY-24b2873ab4fb113e" + ], + "rule_id": "clang-analyzer-security.ArrayBound", + "reproducers": [ + { + "id": "CLANGTIDY-d562d8dbfbb1dcc3", + "path": "src/web/api_handlers_streams_get.c", + "line": 344, + "fingerprint": "clang-tidy:clang-analyzer-security.ArrayBound:src/web/api_handlers_streams_get.c:d562d8dbfbb1dcc3", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-24b2873ab4fb113e", + "path": "src/web/api_handlers_streams_get.c", + "line": 344, + "fingerprint": "clang-tidy:clang-analyzer-security.ArrayBound:src/web/api_handlers_streams_get.c:24b2873ab4fb113e", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.65", + "title": "clang-analyzer-security.ArrayBound in api_handlers_system.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_system.c", + "tests/unit/test_t7_65.c", + "tests/unit/cmake/eng/t7_65.cmake", + "quality/evidence/T7.65.md" + ], + "source_paths": [ + "src/web/api_handlers_system.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.65 --regex '^test_t7_65$'" + ], + "evidence": "quality/evidence/T7.65.md", + "finding_ids": [ + "CLANGTIDY-4f6abbd42f9a1855", + "CLANGTIDY-c7df8f3cce68c5a4" + ], + "rule_id": "clang-analyzer-security.ArrayBound", + "reproducers": [ + { + "id": "CLANGTIDY-4f6abbd42f9a1855", + "path": "src/web/api_handlers_system.c", + "line": 192, + "fingerprint": "clang-tidy:clang-analyzer-security.ArrayBound:src/web/api_handlers_system.c:4f6abbd42f9a1855", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-c7df8f3cce68c5a4", + "path": "src/web/api_handlers_system.c", + "line": 193, + "fingerprint": "clang-tidy:clang-analyzer-security.ArrayBound:src/web/api_handlers_system.c:c7df8f3cce68c5a4", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.66", + "title": "clang-analyzer-security.insecureAPI.strcpy in recording_transcode.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/video/recording_transcode.c", + "tests/unit/test_t7_66.c", + "tests/unit/cmake/eng/t7_66.cmake", + "quality/evidence/T7.66.md" + ], + "source_paths": [ + "src/video/recording_transcode.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.66 --regex '^test_t7_66$'" + ], + "evidence": "quality/evidence/T7.66.md", + "finding_ids": [ + "CLANGTIDY-d6eef8565b934dd8", + "CLANGTIDY-4976fee144691228" + ], + "rule_id": "clang-analyzer-security.insecureAPI.strcpy", + "reproducers": [ + { + "id": "CLANGTIDY-d6eef8565b934dd8", + "path": "src/video/recording_transcode.c", + "line": 311, + "fingerprint": "clang-tidy:clang-analyzer-security.insecureAPI.strcpy:src/video/recording_transcode.c:d6eef8565b934dd8", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-4976fee144691228", + "path": "src/video/recording_transcode.c", + "line": 312, + "fingerprint": "clang-tidy:clang-analyzer-security.insecureAPI.strcpy:src/video/recording_transcode.c:4976fee144691228", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.67", + "title": "clang-analyzer-security.insecureAPI.strcpy in api_handlers_go2rtc_proxy.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_go2rtc_proxy.c", + "tests/unit/test_t7_67.c", + "tests/unit/cmake/eng/t7_67.cmake", + "quality/evidence/T7.67.md" + ], + "source_paths": [ + "src/web/api_handlers_go2rtc_proxy.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.67 --regex '^test_t7_67$'" + ], + "evidence": "quality/evidence/T7.67.md", + "finding_ids": [ + "CLANGTIDY-4c710ebaa0f3ef18", + "CLANGTIDY-e7f2b500346b1db4", + "CLANGTIDY-59d7e244d1294daa", + "CLANGTIDY-de5c9750f9e973f2" + ], + "rule_id": "clang-analyzer-security.insecureAPI.strcpy", + "reproducers": [ + { + "id": "CLANGTIDY-4c710ebaa0f3ef18", + "path": "src/web/api_handlers_go2rtc_proxy.c", + "line": 259, + "fingerprint": "clang-tidy:clang-analyzer-security.insecureAPI.strcpy:src/web/api_handlers_go2rtc_proxy.c:4c710ebaa0f3ef18", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-e7f2b500346b1db4", + "path": "src/web/api_handlers_go2rtc_proxy.c", + "line": 264, + "fingerprint": "clang-tidy:clang-analyzer-security.insecureAPI.strcpy:src/web/api_handlers_go2rtc_proxy.c:e7f2b500346b1db4", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-59d7e244d1294daa", + "path": "src/web/api_handlers_go2rtc_proxy.c", + "line": 293, + "fingerprint": "clang-tidy:clang-analyzer-security.insecureAPI.strcpy:src/web/api_handlers_go2rtc_proxy.c:59d7e244d1294daa", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-de5c9750f9e973f2", + "path": "src/web/api_handlers_go2rtc_proxy.c", + "line": 332, + "fingerprint": "clang-tidy:clang-analyzer-security.insecureAPI.strcpy:src/web/api_handlers_go2rtc_proxy.c:de5c9750f9e973f2", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.68", + "title": "clang-analyzer-unix.BlockInCriticalSection in health_helper_runner.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/telemetry/health_helper_runner.c", + "tests/unit/test_t7_68.c", + "tests/unit/cmake/eng/t7_68.cmake", + "quality/evidence/T7.68.md" + ], + "source_paths": [ + "src/telemetry/health_helper_runner.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise the blocking operation and concurrent shutdown/contending thread with bounded deadlines; assert no lock is held across unbounded I/O and lock-protected invariants remain intact.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.68 --regex '^test_t7_68$'" + ], + "evidence": "quality/evidence/T7.68.md", + "finding_ids": [ + "CLANGTIDY-8a0289975bb00ddb" + ], + "rule_id": "clang-analyzer-unix.BlockInCriticalSection", + "reproducers": [ + { + "id": "CLANGTIDY-8a0289975bb00ddb", + "path": "src/telemetry/health_helper_runner.c", + "line": 68, + "fingerprint": "clang-tidy:clang-analyzer-unix.BlockInCriticalSection:src/telemetry/health_helper_runner.c:8a0289975bb00ddb", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.69", + "title": "clang-analyzer-unix.BlockInCriticalSection in hls_unified_thread.c", + "depends_on": [ + "T7", + "T13", + "T7.14" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/video/hls/hls_unified_thread.c", + "tests/unit/test_t7_69.c", + "tests/unit/cmake/eng/t7_69.cmake", + "quality/evidence/T7.69.md" + ], + "source_paths": [ + "src/video/hls/hls_unified_thread.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise the blocking operation and concurrent shutdown/contending thread with bounded deadlines; assert no lock is held across unbounded I/O and lock-protected invariants remain intact.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.69 --regex '^test_t7_69$'" + ], + "evidence": "quality/evidence/T7.69.md", + "finding_ids": [ + "CLANGTIDY-1728287dd1cfa5a4" + ], + "rule_id": "clang-analyzer-unix.BlockInCriticalSection", + "reproducers": [ + { + "id": "CLANGTIDY-1728287dd1cfa5a4", + "path": "src/video/hls/hls_unified_thread.c", + "line": 2949, + "fingerprint": "clang-tidy:clang-analyzer-unix.BlockInCriticalSection:src/video/hls/hls_unified_thread.c:1728287dd1cfa5a4", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.70", + "title": "clang-analyzer-unix.Errno in storage_migration.c", + "depends_on": [ + "T7", + "T13", + "T7.26" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/storage/storage_migration.c", + "tests/unit/test_t7_70.c", + "tests/unit/cmake/eng/t7_70.cmake", + "quality/evidence/T7.70.md" + ], + "source_paths": [ + "src/storage/storage_migration.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inject failing and successful calls with stale errno; branch only on actual call failure and preserve the original error before cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.70 --regex '^test_t7_70$'" + ], + "evidence": "quality/evidence/T7.70.md", + "finding_ids": [ + "CLANGTIDY-f15ef4cfb6675401", + "CLANGTIDY-d8903761e409b32d" + ], + "rule_id": "clang-analyzer-unix.Errno", + "reproducers": [ + { + "id": "CLANGTIDY-f15ef4cfb6675401", + "path": "src/storage/storage_migration.c", + "line": 124, + "fingerprint": "clang-tidy:clang-analyzer-unix.Errno:src/storage/storage_migration.c:f15ef4cfb6675401", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-d8903761e409b32d", + "path": "src/storage/storage_migration.c", + "line": 276, + "fingerprint": "clang-tidy:clang-analyzer-unix.Errno:src/storage/storage_migration.c:d8903761e409b32d", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.71", + "title": "clang-analyzer-unix.StdCLibraryFunctions in hls_cache_cleanup.c", + "depends_on": [ + "T7", + "T13", + "T7.61" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/video/hls/hls_cache_cleanup.c", + "tests/unit/test_t7_71.c", + "tests/unit/cmake/eng/t7_71.cmake", + "quality/evidence/T7.71.md" + ], + "source_paths": [ + "src/video/hls/hls_cache_cleanup.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise every reported format/library call with boundary values; argument types/counts, buffer extents and returned errors must match the library contract with no UB.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.71 --regex '^test_t7_71$'" + ], + "evidence": "quality/evidence/T7.71.md", + "finding_ids": [ + "CLANGTIDY-f70e12d3b12447f9", + "CLANGTIDY-81dd4bf2eb1bd4a8" + ], + "rule_id": "clang-analyzer-unix.StdCLibraryFunctions", + "reproducers": [ + { + "id": "CLANGTIDY-f70e12d3b12447f9", + "path": "src/video/hls/hls_cache_cleanup.c", + "line": 35, + "fingerprint": "clang-tidy:clang-analyzer-unix.StdCLibraryFunctions:src/video/hls/hls_cache_cleanup.c:f70e12d3b12447f9", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-81dd4bf2eb1bd4a8", + "path": "src/video/hls/hls_cache_cleanup.c", + "line": 107, + "fingerprint": "clang-tidy:clang-analyzer-unix.StdCLibraryFunctions:src/video/hls/hls_cache_cleanup.c:81dd4bf2eb1bd4a8", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.72", + "title": "clang-analyzer-unix.Stream in linux_network.c", + "depends_on": [ + "T7", + "T13", + "T7.57" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/telemetry/collectors/linux_network.c", + "tests/unit/test_t7_72.c", + "tests/unit/cmake/eng/t7_72.cmake", + "quality/evidence/T7.72.md" + ], + "source_paths": [ + "src/telemetry/collectors/linux_network.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inject each allocation/open and downstream failure at the reported site; assert allocations, FILE handles and descriptors return to baseline on every exit and successful ownership transfers remain valid.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.72 --regex '^test_t7_72$'" + ], + "evidence": "quality/evidence/T7.72.md", + "finding_ids": [ + "CLANGTIDY-b38fd5e59ea07d0e", + "CLANGTIDY-ebeb3bd843bc6421" + ], + "rule_id": "clang-analyzer-unix.Stream", + "reproducers": [ + { + "id": "CLANGTIDY-b38fd5e59ea07d0e", + "path": "src/telemetry/collectors/linux_network.c", + "line": 238, + "fingerprint": "clang-tidy:clang-analyzer-unix.Stream:src/telemetry/collectors/linux_network.c:b38fd5e59ea07d0e", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-ebeb3bd843bc6421", + "path": "src/telemetry/collectors/linux_network.c", + "line": 238, + "fingerprint": "clang-tidy:clang-analyzer-unix.Stream:src/telemetry/collectors/linux_network.c:ebeb3bd843bc6421", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.73", + "title": "integerOverflow in config.c", + "depends_on": [ + "T7", + "T13", + "T7.13" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/core/config.c", + "tests/unit/test_t7_73.c", + "tests/unit/cmake/eng/t7_73.cmake", + "quality/evidence/T7.73.md" + ], + "source_paths": [ + "src/core/config.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.73 --regex '^test_t7_73$'" + ], + "evidence": "quality/evidence/T7.73.md", + "finding_ids": [ + "CPPCHECK-a8a2fee09e04d7a2" + ], + "rule_id": "integerOverflow", + "reproducers": [ + { + "id": "CPPCHECK-a8a2fee09e04d7a2", + "path": "src/core/config.c", + "line": 362, + "fingerprint": "cppcheck:integerOverflow:src/core/config.c:a8a2fee09e04d7a2", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.74", + "title": "memleak in sod_img_writer.h", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_74-upstream.json", + "quality/evidence/T7.74.md" + ], + "source_paths": [ + "include/sod/sod_img_writer.h" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Inject each allocation/open and downstream failure at the reported site; assert allocations, FILE handles and descriptors return to baseline on every exit and successful ownership transfers remain valid.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_74-upstream.json" + ], + "evidence": "quality/evidence/T7.74.md", + "finding_ids": [ + "CPPCHECK-582ed0e8d5a10fc1" + ], + "rule_id": "memleak", + "reproducers": [ + { + "id": "CPPCHECK-582ed0e8d5a10fc1", + "path": "include/sod/sod_img_writer.h", + "line": 866, + "fingerprint": "cppcheck:memleak:include/sod/sod_img_writer.h:582ed0e8d5a10fc1", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.75", + "title": "memleak in sod.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_75-upstream.json", + "quality/evidence/T7.75.md" + ], + "source_paths": [ + "src/sod/sod.c" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Inject each allocation/open and downstream failure at the reported site; assert allocations, FILE handles and descriptors return to baseline on every exit and successful ownership transfers remain valid.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_75-upstream.json" + ], + "evidence": "quality/evidence/T7.75.md", + "finding_ids": [ + "CPPCHECK-d14ab8cc9d321477", + "CPPCHECK-7bc58272fe78e01c", + "CPPCHECK-d1406d76ca075628", + "CPPCHECK-187d49bac01afe0b", + "CPPCHECK-01d35c4f8b07a420", + "CPPCHECK-7ed0f3ac85abfc0f", + "CPPCHECK-afd0bb6171ab9102", + "CPPCHECK-6c275f8832cf9762", + "CPPCHECK-340c5f9dec875049", + "CPPCHECK-94d7d3c523b01523", + "CPPCHECK-65f97e38c1e1c5df", + "CPPCHECK-377feb103d4c3b66" + ], + "rule_id": "memleak", + "reproducers": [ + { + "id": "CPPCHECK-d14ab8cc9d321477", + "path": "src/sod/sod.c", + "line": 8019, + "fingerprint": "cppcheck:memleak:src/sod/sod.c:d14ab8cc9d321477", + "original_count": 1, + "scanner": "cppcheck" + }, + { + "id": "CPPCHECK-7bc58272fe78e01c", + "path": "src/sod/sod.c", + "line": 8019, + "fingerprint": "cppcheck:memleak:src/sod/sod.c:7bc58272fe78e01c", + "original_count": 1, + "scanner": "cppcheck" + }, + { + "id": "CPPCHECK-d1406d76ca075628", + "path": "src/sod/sod.c", + "line": 8019, + "fingerprint": "cppcheck:memleak:src/sod/sod.c:d1406d76ca075628", + "original_count": 1, + "scanner": "cppcheck" + }, + { + "id": "CPPCHECK-187d49bac01afe0b", + "path": "src/sod/sod.c", + "line": 8019, + "fingerprint": "cppcheck:memleak:src/sod/sod.c:187d49bac01afe0b", + "original_count": 1, + "scanner": "cppcheck" + }, + { + "id": "CPPCHECK-01d35c4f8b07a420", + "path": "src/sod/sod.c", + "line": 8133, + "fingerprint": "cppcheck:memleak:src/sod/sod.c:01d35c4f8b07a420", + "original_count": 1, + "scanner": "cppcheck" + }, + { + "id": "CPPCHECK-7ed0f3ac85abfc0f", + "path": "src/sod/sod.c", + "line": 8133, + "fingerprint": "cppcheck:memleak:src/sod/sod.c:7ed0f3ac85abfc0f", + "original_count": 1, + "scanner": "cppcheck" + }, + { + "id": "CPPCHECK-afd0bb6171ab9102", + "path": "src/sod/sod.c", + "line": 8133, + "fingerprint": "cppcheck:memleak:src/sod/sod.c:afd0bb6171ab9102", + "original_count": 1, + "scanner": "cppcheck" + }, + { + "id": "CPPCHECK-6c275f8832cf9762", + "path": "src/sod/sod.c", + "line": 8133, + "fingerprint": "cppcheck:memleak:src/sod/sod.c:6c275f8832cf9762", + "original_count": 1, + "scanner": "cppcheck" + }, + { + "id": "CPPCHECK-340c5f9dec875049", + "path": "src/sod/sod.c", + "line": 8133, + "fingerprint": "cppcheck:memleak:src/sod/sod.c:340c5f9dec875049", + "original_count": 1, + "scanner": "cppcheck" + }, + { + "id": "CPPCHECK-94d7d3c523b01523", + "path": "src/sod/sod.c", + "line": 8133, + "fingerprint": "cppcheck:memleak:src/sod/sod.c:94d7d3c523b01523", + "original_count": 1, + "scanner": "cppcheck" + }, + { + "id": "CPPCHECK-65f97e38c1e1c5df", + "path": "src/sod/sod.c", + "line": 8133, + "fingerprint": "cppcheck:memleak:src/sod/sod.c:65f97e38c1e1c5df", + "original_count": 1, + "scanner": "cppcheck" + }, + { + "id": "CPPCHECK-377feb103d4c3b66", + "path": "src/sod/sod.c", + "line": 8133, + "fingerprint": "cppcheck:memleak:src/sod/sod.c:377feb103d4c3b66", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.76", + "title": "preprocessorErrorDirective in nvme_provider.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/telemetry/providers/nvme_provider.c", + "tests/unit/test_t7_76.c", + "tests/unit/cmake/eng/t7_76.cmake", + "quality/evidence/T7.76.md" + ], + "source_paths": [ + "src/telemetry/providers/nvme_provider.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.76 --regex '^test_t7_76$'" + ], + "evidence": "quality/evidence/T7.76.md", + "finding_ids": [ + "CPPCHECK-1c7b293c20ba8b3d" + ], + "rule_id": "preprocessorErrorDirective", + "reproducers": [ + { + "id": "CPPCHECK-1c7b293c20ba8b3d", + "path": "src/telemetry/providers/nvme_provider.c", + "line": 15, + "fingerprint": "cppcheck:preprocessorErrorDirective:src/telemetry/providers/nvme_provider.c:1c7b293c20ba8b3d", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.77", + "title": "preprocessorErrorDirective in mp4_writer_utils.c", + "depends_on": [ + "T7", + "T13", + "T7.16" + ], + "kind": "native-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/video/mp4_writer_utils.c", + "tests/unit/test_t7_77.c", + "tests/unit/cmake/eng/t7_77.cmake", + "quality/evidence/T7.77.md" + ], + "source_paths": [ + "src/video/mp4_writer_utils.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.77 --regex '^test_t7_77$'" + ], + "evidence": "quality/evidence/T7.77.md", + "finding_ids": [ + "CPPCHECK-1afeb1315d85ff61" + ], + "rule_id": "preprocessorErrorDirective", + "reproducers": [ + { + "id": "CPPCHECK-1afeb1315d85ff61", + "path": "src/video/mp4_writer_utils.c", + "line": 1795, + "fingerprint": "cppcheck:preprocessorErrorDirective:src/video/mp4_writer_utils.c:1afeb1315d85ff61", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.78", + "title": "arrayIndexOutOfBoundsCond in stream_protocol.c", + "depends_on": [ + "T7", + "T13", + "T7.30" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/video/stream_protocol.c", + "tests/unit/test_t7_78.c", + "tests/unit/cmake/eng/t7_78.cmake", + "quality/evidence/T7.78.md" + ], + "source_paths": [ + "src/video/stream_protocol.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.78 --regex '^test_t7_78$'" + ], + "evidence": "quality/evidence/T7.78.md", + "finding_ids": [ + "CPPCHECK-1d3bfb4e5fc184fe" + ], + "rule_id": "arrayIndexOutOfBoundsCond", + "reproducers": [ + { + "id": "CPPCHECK-1d3bfb4e5fc184fe", + "path": "src/video/stream_protocol.c", + "line": 635, + "fingerprint": "cppcheck:arrayIndexOutOfBoundsCond:src/video/stream_protocol.c:1d3bfb4e5fc184fe", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.79", + "title": "bugprone-assignment-in-if-condition in db_system_health_incidents.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/database/db_system_health_incidents.c", + "tests/unit/test_t7_79.c", + "tests/unit/cmake/eng/t7_79.cmake", + "quality/evidence/T7.79.md" + ], + "source_paths": [ + "src/database/db_system_health_incidents.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.79 --regex '^test_t7_79$'" + ], + "evidence": "quality/evidence/T7.79.md", + "finding_ids": [ + "CLANGTIDY-808f26556ac98110", + "CLANGTIDY-7e1ce15fe947a21d" + ], + "rule_id": "bugprone-assignment-in-if-condition", + "reproducers": [ + { + "id": "CLANGTIDY-808f26556ac98110", + "path": "src/database/db_system_health_incidents.c", + "line": 45, + "fingerprint": "clang-tidy:bugprone-assignment-in-if-condition:src/database/db_system_health_incidents.c:808f26556ac98110", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-7e1ce15fe947a21d", + "path": "src/database/db_system_health_incidents.c", + "line": 265, + "fingerprint": "clang-tidy:bugprone-assignment-in-if-condition:src/database/db_system_health_incidents.c:7e1ce15fe947a21d", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.80", + "title": "bugprone-assignment-in-if-condition in api_detection.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/video/api_detection.c", + "tests/unit/test_t7_80.c", + "tests/unit/cmake/eng/t7_80.cmake", + "quality/evidence/T7.80.md" + ], + "source_paths": [ + "src/video/api_detection.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.80 --regex '^test_t7_80$'" + ], + "evidence": "quality/evidence/T7.80.md", + "finding_ids": [ + "CLANGTIDY-c34509f97f5eb3bf", + "CLANGTIDY-6ac00b1420332d40", + "CLANGTIDY-1848d1ca57216f44", + "CLANGTIDY-be52eb80a1a9b4e2" + ], + "rule_id": "bugprone-assignment-in-if-condition", + "reproducers": [ + { + "id": "CLANGTIDY-c34509f97f5eb3bf", + "path": "src/video/api_detection.c", + "line": 656, + "fingerprint": "clang-tidy:bugprone-assignment-in-if-condition:src/video/api_detection.c:c34509f97f5eb3bf", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-6ac00b1420332d40", + "path": "src/video/api_detection.c", + "line": 657, + "fingerprint": "clang-tidy:bugprone-assignment-in-if-condition:src/video/api_detection.c:6ac00b1420332d40", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-1848d1ca57216f44", + "path": "src/video/api_detection.c", + "line": 658, + "fingerprint": "clang-tidy:bugprone-assignment-in-if-condition:src/video/api_detection.c:1848d1ca57216f44", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-be52eb80a1a9b4e2", + "path": "src/video/api_detection.c", + "line": 659, + "fingerprint": "clang-tidy:bugprone-assignment-in-if-condition:src/video/api_detection.c:be52eb80a1a9b4e2", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.81", + "title": "bugprone-assignment-in-if-condition in api_handlers_metrics.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_metrics.c", + "tests/unit/test_t7_81.c", + "tests/unit/cmake/eng/t7_81.cmake", + "quality/evidence/T7.81.md" + ], + "source_paths": [ + "src/web/api_handlers_metrics.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.81 --regex '^test_t7_81$'" + ], + "evidence": "quality/evidence/T7.81.md", + "finding_ids": [ + "CLANGTIDY-02365646d53a2c50", + "CLANGTIDY-a219d74f760de10e", + "CLANGTIDY-96f8eef93ec11127", + "CLANGTIDY-221d97bd8b8ca157", + "CLANGTIDY-b6b7c0de32a0c6b7", + "CLANGTIDY-4edbb01e2c9075ed", + "CLANGTIDY-ec9cd5d6ab7a3d6e", + "CLANGTIDY-2f30db61a3888f56" + ], + "rule_id": "bugprone-assignment-in-if-condition", + "reproducers": [ + { + "id": "CLANGTIDY-02365646d53a2c50", + "path": "src/web/api_handlers_metrics.c", + "line": 1284, + "fingerprint": "clang-tidy:bugprone-assignment-in-if-condition:src/web/api_handlers_metrics.c:02365646d53a2c50", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-a219d74f760de10e", + "path": "src/web/api_handlers_metrics.c", + "line": 1286, + "fingerprint": "clang-tidy:bugprone-assignment-in-if-condition:src/web/api_handlers_metrics.c:a219d74f760de10e", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-96f8eef93ec11127", + "path": "src/web/api_handlers_metrics.c", + "line": 1288, + "fingerprint": "clang-tidy:bugprone-assignment-in-if-condition:src/web/api_handlers_metrics.c:96f8eef93ec11127", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-221d97bd8b8ca157", + "path": "src/web/api_handlers_metrics.c", + "line": 1290, + "fingerprint": "clang-tidy:bugprone-assignment-in-if-condition:src/web/api_handlers_metrics.c:221d97bd8b8ca157", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-b6b7c0de32a0c6b7", + "path": "src/web/api_handlers_metrics.c", + "line": 1292, + "fingerprint": "clang-tidy:bugprone-assignment-in-if-condition:src/web/api_handlers_metrics.c:b6b7c0de32a0c6b7", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-4edbb01e2c9075ed", + "path": "src/web/api_handlers_metrics.c", + "line": 1294, + "fingerprint": "clang-tidy:bugprone-assignment-in-if-condition:src/web/api_handlers_metrics.c:4edbb01e2c9075ed", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-ec9cd5d6ab7a3d6e", + "path": "src/web/api_handlers_metrics.c", + "line": 1296, + "fingerprint": "clang-tidy:bugprone-assignment-in-if-condition:src/web/api_handlers_metrics.c:ec9cd5d6ab7a3d6e", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-2f30db61a3888f56", + "path": "src/web/api_handlers_metrics.c", + "line": 1298, + "fingerprint": "clang-tidy:bugprone-assignment-in-if-condition:src/web/api_handlers_metrics.c:2f30db61a3888f56", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.82", + "title": "bugprone-assignment-in-if-condition in go2rtc_websocket.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/web/go2rtc_websocket.c", + "tests/unit/test_t7_82.c", + "tests/unit/cmake/eng/t7_82.cmake", + "quality/evidence/T7.82.md" + ], + "source_paths": [ + "src/web/go2rtc_websocket.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.82 --regex '^test_t7_82$'" + ], + "evidence": "quality/evidence/T7.82.md", + "finding_ids": [ + "CLANGTIDY-82315a3f137f4aff" + ], + "rule_id": "bugprone-assignment-in-if-condition", + "reproducers": [ + { + "id": "CLANGTIDY-82315a3f137f4aff", + "path": "src/web/go2rtc_websocket.c", + "line": 253, + "fingerprint": "clang-tidy:bugprone-assignment-in-if-condition:src/web/go2rtc_websocket.c:82315a3f137f4aff", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.83", + "title": "bugprone-branch-clone in linux_cgroup.c", + "depends_on": [ + "T7", + "T13", + "T7.22" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/telemetry/collectors/linux_cgroup.c", + "tests/unit/test_t7_83.c", + "tests/unit/cmake/eng/t7_83.cmake", + "quality/evidence/T7.83.md" + ], + "source_paths": [ + "src/telemetry/collectors/linux_cgroup.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.83 --regex '^test_t7_83$'" + ], + "evidence": "quality/evidence/T7.83.md", + "finding_ids": [ + "CLANGTIDY-eac1097bd3780c16" + ], + "rule_id": "bugprone-branch-clone", + "reproducers": [ + { + "id": "CLANGTIDY-eac1097bd3780c16", + "path": "src/telemetry/collectors/linux_cgroup.c", + "line": 448, + "fingerprint": "clang-tidy:bugprone-branch-clone:src/telemetry/collectors/linux_cgroup.c:eac1097bd3780c16", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.84", + "title": "bugprone-branch-clone in api_handlers_authorization.c", + "depends_on": [ + "T7", + "T13", + "T7.42" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_authorization.c", + "tests/unit/test_t7_84.c", + "tests/unit/cmake/eng/t7_84.cmake", + "quality/evidence/T7.84.md" + ], + "source_paths": [ + "src/web/api_handlers_authorization.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.84 --regex '^test_t7_84$'" + ], + "evidence": "quality/evidence/T7.84.md", + "finding_ids": [ + "CLANGTIDY-a03bd79d6040e625" + ], + "rule_id": "bugprone-branch-clone", + "reproducers": [ + { + "id": "CLANGTIDY-a03bd79d6040e625", + "path": "src/web/api_handlers_authorization.c", + "line": 1027, + "fingerprint": "clang-tidy:bugprone-branch-clone:src/web/api_handlers_authorization.c:a03bd79d6040e625", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.85", + "title": "bugprone-branch-clone in api_handlers_timeline.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_timeline.c", + "tests/unit/test_t7_85.c", + "tests/unit/cmake/eng/t7_85.cmake", + "quality/evidence/T7.85.md" + ], + "source_paths": [ + "src/web/api_handlers_timeline.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.85 --regex '^test_t7_85$'" + ], + "evidence": "quality/evidence/T7.85.md", + "finding_ids": [ + "CLANGTIDY-f1f70f55c95dfbaf" + ], + "rule_id": "bugprone-branch-clone", + "reproducers": [ + { + "id": "CLANGTIDY-f1f70f55c95dfbaf", + "path": "src/web/api_handlers_timeline.c", + "line": 1098, + "fingerprint": "clang-tidy:bugprone-branch-clone:src/web/api_handlers_timeline.c:f1f70f55c95dfbaf", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.86", + "title": "bugprone-branch-clone in audit_log.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/web/audit_log.c", + "tests/unit/test_t7_86.c", + "tests/unit/cmake/eng/t7_86.cmake", + "quality/evidence/T7.86.md" + ], + "source_paths": [ + "src/web/audit_log.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.86 --regex '^test_t7_86$'" + ], + "evidence": "quality/evidence/T7.86.md", + "finding_ids": [ + "CLANGTIDY-5bdf00371aedee4a" + ], + "rule_id": "bugprone-branch-clone", + "reproducers": [ + { + "id": "CLANGTIDY-5bdf00371aedee4a", + "path": "src/web/audit_log.c", + "line": 599, + "fingerprint": "clang-tidy:bugprone-branch-clone:src/web/audit_log.c:5bdf00371aedee4a", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.87", + "title": "bugprone-branch-clone in thumbnail_thread.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/web/thumbnail_thread.c", + "tests/unit/test_t7_87.c", + "tests/unit/cmake/eng/t7_87.cmake", + "quality/evidence/T7.87.md" + ], + "source_paths": [ + "src/web/thumbnail_thread.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.87 --regex '^test_t7_87$'" + ], + "evidence": "quality/evidence/T7.87.md", + "finding_ids": [ + "CLANGTIDY-ccff9a5b097b862e" + ], + "rule_id": "bugprone-branch-clone", + "reproducers": [ + { + "id": "CLANGTIDY-ccff9a5b097b862e", + "path": "src/web/thumbnail_thread.c", + "line": 207, + "fingerprint": "clang-tidy:bugprone-branch-clone:src/web/thumbnail_thread.c:ccff9a5b097b862e", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.88", + "title": "bugprone-implicit-widening-of-multiplication-result in event_bus.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/core/event_bus.c", + "tests/unit/test_t7_88.c", + "tests/unit/cmake/eng/t7_88.cmake", + "quality/evidence/T7.88.md" + ], + "source_paths": [ + "src/core/event_bus.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.88 --regex '^test_t7_88$'" + ], + "evidence": "quality/evidence/T7.88.md", + "finding_ids": [ + "CLANGTIDY-73322317a31f8bcc", + "CLANGTIDY-dbe8bf00e4b146ee" + ], + "rule_id": "bugprone-implicit-widening-of-multiplication-result", + "reproducers": [ + { + "id": "CLANGTIDY-73322317a31f8bcc", + "path": "src/core/event_bus.c", + "line": 204, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/core/event_bus.c:73322317a31f8bcc", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-dbe8bf00e4b146ee", + "path": "src/core/event_bus.c", + "line": 205, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/core/event_bus.c:dbe8bf00e4b146ee", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.89", + "title": "bugprone-implicit-widening-of-multiplication-result in event_envelope.c", + "depends_on": [ + "T7", + "T13", + "T7.36" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/core/event_envelope.c", + "tests/unit/test_t7_89.c", + "tests/unit/cmake/eng/t7_89.cmake", + "quality/evidence/T7.89.md" + ], + "source_paths": [ + "src/core/event_envelope.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.89 --regex '^test_t7_89$'" + ], + "evidence": "quality/evidence/T7.89.md", + "finding_ids": [ + "CLANGTIDY-2fcad01867c4b146", + "CLANGTIDY-51ab98673b990b2c", + "CLANGTIDY-a48d8d980b8dbfcc" + ], + "rule_id": "bugprone-implicit-widening-of-multiplication-result", + "reproducers": [ + { + "id": "CLANGTIDY-2fcad01867c4b146", + "path": "src/core/event_envelope.c", + "line": 292, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/core/event_envelope.c:2fcad01867c4b146", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-51ab98673b990b2c", + "path": "src/core/event_envelope.c", + "line": 830, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/core/event_envelope.c:51ab98673b990b2c", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-a48d8d980b8dbfcc", + "path": "src/core/event_envelope.c", + "line": 952, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/core/event_envelope.c:a48d8d980b8dbfcc", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.90", + "title": "bugprone-implicit-widening-of-multiplication-result in event_router.c", + "depends_on": [ + "T7", + "T13", + "T7.28" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/core/event_router.c", + "tests/unit/test_t7_90.c", + "tests/unit/cmake/eng/t7_90.cmake", + "quality/evidence/T7.90.md" + ], + "source_paths": [ + "src/core/event_router.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.90 --regex '^test_t7_90$'" + ], + "evidence": "quality/evidence/T7.90.md", + "finding_ids": [ + "CLANGTIDY-767515747827ef14" + ], + "rule_id": "bugprone-implicit-widening-of-multiplication-result", + "reproducers": [ + { + "id": "CLANGTIDY-767515747827ef14", + "path": "src/core/event_router.c", + "line": 213, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/core/event_router.c:767515747827ef14", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.91", + "title": "bugprone-implicit-widening-of-multiplication-result in mqtt_delivery_worker.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/core/mqtt_delivery_worker.c", + "tests/unit/test_t7_91.c", + "tests/unit/cmake/eng/t7_91.cmake", + "quality/evidence/T7.91.md" + ], + "source_paths": [ + "src/core/mqtt_delivery_worker.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.91 --regex '^test_t7_91$'" + ], + "evidence": "quality/evidence/T7.91.md", + "finding_ids": [ + "CLANGTIDY-ced78137a6871fda" + ], + "rule_id": "bugprone-implicit-widening-of-multiplication-result", + "reproducers": [ + { + "id": "CLANGTIDY-ced78137a6871fda", + "path": "src/core/mqtt_delivery_worker.c", + "line": 468, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/core/mqtt_delivery_worker.c:ced78137a6871fda", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.92", + "title": "bugprone-implicit-widening-of-multiplication-result in db_operator_floor_plans.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/database/db_operator_floor_plans.c", + "tests/unit/test_t7_92.c", + "tests/unit/cmake/eng/t7_92.cmake", + "quality/evidence/T7.92.md" + ], + "source_paths": [ + "src/database/db_operator_floor_plans.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.92 --regex '^test_t7_92$'" + ], + "evidence": "quality/evidence/T7.92.md", + "finding_ids": [ + "CLANGTIDY-4ce72e7a43d0bcce" + ], + "rule_id": "bugprone-implicit-widening-of-multiplication-result", + "reproducers": [ + { + "id": "CLANGTIDY-4ce72e7a43d0bcce", + "path": "src/database/db_operator_floor_plans.c", + "line": 71, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/database/db_operator_floor_plans.c:4ce72e7a43d0bcce", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.93", + "title": "bugprone-implicit-widening-of-multiplication-result in storage_migration.c", + "depends_on": [ + "T7", + "T13", + "T7.70" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/storage/storage_migration.c", + "tests/unit/test_t7_93.c", + "tests/unit/cmake/eng/t7_93.cmake", + "quality/evidence/T7.93.md" + ], + "source_paths": [ + "src/storage/storage_migration.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.93 --regex '^test_t7_93$'" + ], + "evidence": "quality/evidence/T7.93.md", + "finding_ids": [ + "CLANGTIDY-50703d3018f9bed5", + "CLANGTIDY-15fa53ad8b574808", + "CLANGTIDY-e5960a2d15356c27", + "CLANGTIDY-1fac122c6010eb36" + ], + "rule_id": "bugprone-implicit-widening-of-multiplication-result", + "reproducers": [ + { + "id": "CLANGTIDY-50703d3018f9bed5", + "path": "src/storage/storage_migration.c", + "line": 138, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_migration.c:50703d3018f9bed5", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-15fa53ad8b574808", + "path": "src/storage/storage_migration.c", + "line": 149, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_migration.c:15fa53ad8b574808", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-e5960a2d15356c27", + "path": "src/storage/storage_migration.c", + "line": 291, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_migration.c:e5960a2d15356c27", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-1fac122c6010eb36", + "path": "src/storage/storage_migration.c", + "line": 328, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_migration.c:1fac122c6010eb36", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.94", + "title": "bugprone-implicit-widening-of-multiplication-result in storage_s3.c", + "depends_on": [ + "T7", + "T13", + "T7.35" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/storage/storage_s3.c", + "tests/unit/test_t7_94.c", + "tests/unit/cmake/eng/t7_94.cmake", + "quality/evidence/T7.94.md" + ], + "source_paths": [ + "src/storage/storage_s3.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.94 --regex '^test_t7_94$'" + ], + "evidence": "quality/evidence/T7.94.md", + "finding_ids": [ + "CLANGTIDY-612c846365824225", + "CLANGTIDY-1e0ea76108754cd5", + "CLANGTIDY-ab4dc4b3768799ca", + "CLANGTIDY-14f55668eaa243b0", + "CLANGTIDY-fbf040917d8b6cf7", + "CLANGTIDY-52dada64b4a6e625", + "CLANGTIDY-d1d1cf8dcb7070f8", + "CLANGTIDY-bfb7d2825452ce0c", + "CLANGTIDY-842c6bb171a64e75", + "CLANGTIDY-4a2a60d787933d7d", + "CLANGTIDY-a145bd05b0189193", + "CLANGTIDY-f72760acc6c09e16", + "CLANGTIDY-0866b8e57f533141", + "CLANGTIDY-d08422316656b39c", + "CLANGTIDY-d7c0ab1bf29a42a3" + ], + "rule_id": "bugprone-implicit-widening-of-multiplication-result", + "reproducers": [ + { + "id": "CLANGTIDY-612c846365824225", + "path": "src/storage/storage_s3.c", + "line": 211, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:612c846365824225", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-1e0ea76108754cd5", + "path": "src/storage/storage_s3.c", + "line": 351, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:1e0ea76108754cd5", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-ab4dc4b3768799ca", + "path": "src/storage/storage_s3.c", + "line": 368, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:ab4dc4b3768799ca", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-14f55668eaa243b0", + "path": "src/storage/storage_s3.c", + "line": 424, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:14f55668eaa243b0", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-fbf040917d8b6cf7", + "path": "src/storage/storage_s3.c", + "line": 454, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:fbf040917d8b6cf7", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-52dada64b4a6e625", + "path": "src/storage/storage_s3.c", + "line": 485, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:52dada64b4a6e625", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-d1d1cf8dcb7070f8", + "path": "src/storage/storage_s3.c", + "line": 510, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:d1d1cf8dcb7070f8", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-bfb7d2825452ce0c", + "path": "src/storage/storage_s3.c", + "line": 545, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:bfb7d2825452ce0c", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-842c6bb171a64e75", + "path": "src/storage/storage_s3.c", + "line": 595, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:842c6bb171a64e75", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-4a2a60d787933d7d", + "path": "src/storage/storage_s3.c", + "line": 617, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:4a2a60d787933d7d", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-a145bd05b0189193", + "path": "src/storage/storage_s3.c", + "line": 649, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:a145bd05b0189193", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-f72760acc6c09e16", + "path": "src/storage/storage_s3.c", + "line": 729, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:f72760acc6c09e16", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-0866b8e57f533141", + "path": "src/storage/storage_s3.c", + "line": 738, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:0866b8e57f533141", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-d08422316656b39c", + "path": "src/storage/storage_s3.c", + "line": 758, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:d08422316656b39c", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-d7c0ab1bf29a42a3", + "path": "src/storage/storage_s3.c", + "line": 763, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:d7c0ab1bf29a42a3", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.95", + "title": "bugprone-implicit-widening-of-multiplication-result in linux_network.c, linux_process.c, linux_thermal.c", + "depends_on": [ + "T7", + "T13", + "T7.72", + "T7.57" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/telemetry/collectors/linux_network.c", + "src/telemetry/collectors/linux_process.c", + "src/telemetry/collectors/linux_thermal.c", + "tests/unit/test_t7_95.c", + "tests/unit/cmake/eng/t7_95.cmake", + "quality/evidence/T7.95.md" + ], + "source_paths": [ + "src/telemetry/collectors/linux_network.c", + "src/telemetry/collectors/linux_process.c", + "src/telemetry/collectors/linux_thermal.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.95 --regex '^test_t7_95$'" + ], + "evidence": "quality/evidence/T7.95.md", + "finding_ids": [ + "CLANGTIDY-8d33cee7806f5d43", + "CLANGTIDY-02b18b5e0f4e3b93", + "CLANGTIDY-b84c577b6e369ac3", + "CLANGTIDY-8b66085f0250d8e1", + "CLANGTIDY-15838d8765a7623e", + "CLANGTIDY-df8a271dac7dc00c" + ], + "rule_id": "bugprone-implicit-widening-of-multiplication-result", + "reproducers": [ + { + "id": "CLANGTIDY-8d33cee7806f5d43", + "path": "src/telemetry/collectors/linux_network.c", + "line": 361, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/telemetry/collectors/linux_network.c:8d33cee7806f5d43", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-02b18b5e0f4e3b93", + "path": "src/telemetry/collectors/linux_network.c", + "line": 372, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/telemetry/collectors/linux_network.c:02b18b5e0f4e3b93", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-b84c577b6e369ac3", + "path": "src/telemetry/collectors/linux_process.c", + "line": 131, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/telemetry/collectors/linux_process.c:b84c577b6e369ac3", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-8b66085f0250d8e1", + "path": "src/telemetry/collectors/linux_process.c", + "line": 134, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/telemetry/collectors/linux_process.c:8b66085f0250d8e1", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-15838d8765a7623e", + "path": "src/telemetry/collectors/linux_thermal.c", + "line": 474, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/telemetry/collectors/linux_thermal.c:15838d8765a7623e", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-df8a271dac7dc00c", + "path": "src/telemetry/collectors/linux_thermal.c", + "line": 485, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/telemetry/collectors/linux_thermal.c:df8a271dac7dc00c", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.96", + "title": "bugprone-implicit-widening-of-multiplication-result in ffmpeg_rss_guard.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/tools/ffmpeg_rss_guard.c", + "tests/unit/test_t7_96.c", + "tests/unit/cmake/eng/t7_96.cmake", + "quality/evidence/T7.96.md" + ], + "source_paths": [ + "src/tools/ffmpeg_rss_guard.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.96 --regex '^test_t7_96$'" + ], + "evidence": "quality/evidence/T7.96.md", + "finding_ids": [ + "CLANGTIDY-802a0570e39a96a6", + "CLANGTIDY-a072eb98578bd9cf" + ], + "rule_id": "bugprone-implicit-widening-of-multiplication-result", + "reproducers": [ + { + "id": "CLANGTIDY-802a0570e39a96a6", + "path": "src/tools/ffmpeg_rss_guard.c", + "line": 147, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/tools/ffmpeg_rss_guard.c:802a0570e39a96a6", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-a072eb98578bd9cf", + "path": "src/tools/ffmpeg_rss_guard.c", + "line": 148, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/tools/ffmpeg_rss_guard.c:a072eb98578bd9cf", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.97", + "title": "bugprone-implicit-widening-of-multiplication-result in lpr_crypto.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/utils/lpr_crypto.c", + "tests/unit/test_t7_97.c", + "tests/unit/cmake/eng/t7_97.cmake", + "quality/evidence/T7.97.md" + ], + "source_paths": [ + "src/utils/lpr_crypto.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.97 --regex '^test_t7_97$'" + ], + "evidence": "quality/evidence/T7.97.md", + "finding_ids": [ + "CLANGTIDY-576d7acbaee5cef6" + ], + "rule_id": "bugprone-implicit-widening-of-multiplication-result", + "reproducers": [ + { + "id": "CLANGTIDY-576d7acbaee5cef6", + "path": "src/utils/lpr_crypto.c", + "line": 25, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/utils/lpr_crypto.c:576d7acbaee5cef6", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.98", + "title": "bugprone-implicit-widening-of-multiplication-result in go2rtc_api.c, go2rtc_consumer.c, go2rtc_integration.c, go2rtc_snapshot.c, go2rtc_stream.c", + "depends_on": [ + "T7", + "T13", + "T7.40" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/video/go2rtc/go2rtc_api.c", + "src/video/go2rtc/go2rtc_consumer.c", + "src/video/go2rtc/go2rtc_integration.c", + "src/video/go2rtc/go2rtc_snapshot.c", + "src/video/go2rtc/go2rtc_stream.c", + "tests/unit/test_t7_98.c", + "tests/unit/cmake/eng/t7_98.cmake", + "quality/evidence/T7.98.md" + ], + "source_paths": [ + "src/video/go2rtc/go2rtc_api.c", + "src/video/go2rtc/go2rtc_consumer.c", + "src/video/go2rtc/go2rtc_integration.c", + "src/video/go2rtc/go2rtc_snapshot.c", + "src/video/go2rtc/go2rtc_stream.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.98 --regex '^test_t7_98$'" + ], + "evidence": "quality/evidence/T7.98.md", + "finding_ids": [ + "CLANGTIDY-eadc49a35e808a77", + "CLANGTIDY-bdcbae59a275ce50", + "CLANGTIDY-5582e7df3dd25730", + "CLANGTIDY-23826be3117b0a5e", + "CLANGTIDY-cac166160ef5ab94", + "CLANGTIDY-6eced00c619f459a", + "CLANGTIDY-a35257b195053d18", + "CLANGTIDY-9fbcc527095ebbbb", + "CLANGTIDY-c263543788ddaa36", + "CLANGTIDY-d06458b2bdfca56d", + "CLANGTIDY-1592d34d4e3dc54c", + "CLANGTIDY-957e3e8e5e143726", + "CLANGTIDY-76ebb6a603073b54", + "CLANGTIDY-2c1116134a2ee5a3", + "CLANGTIDY-0ce2e7833fc885fd", + "CLANGTIDY-4e94aa9ff957dec6", + "CLANGTIDY-f6ddc3b14e23e020" + ], + "rule_id": "bugprone-implicit-widening-of-multiplication-result", + "reproducers": [ + { + "id": "CLANGTIDY-eadc49a35e808a77", + "path": "src/video/go2rtc/go2rtc_api.c", + "line": 180, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_api.c:eadc49a35e808a77", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-bdcbae59a275ce50", + "path": "src/video/go2rtc/go2rtc_api.c", + "line": 184, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_api.c:bdcbae59a275ce50", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-5582e7df3dd25730", + "path": "src/video/go2rtc/go2rtc_api.c", + "line": 274, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_api.c:5582e7df3dd25730", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-23826be3117b0a5e", + "path": "src/video/go2rtc/go2rtc_api.c", + "line": 288, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_api.c:23826be3117b0a5e", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-cac166160ef5ab94", + "path": "src/video/go2rtc/go2rtc_api.c", + "line": 364, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_api.c:cac166160ef5ab94", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-6eced00c619f459a", + "path": "src/video/go2rtc/go2rtc_api.c", + "line": 491, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_api.c:6eced00c619f459a", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-a35257b195053d18", + "path": "src/video/go2rtc/go2rtc_api.c", + "line": 494, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_api.c:a35257b195053d18", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-9fbcc527095ebbbb", + "path": "src/video/go2rtc/go2rtc_api.c", + "line": 904, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_api.c:9fbcc527095ebbbb", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-c263543788ddaa36", + "path": "src/video/go2rtc/go2rtc_api.c", + "line": 1143, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_api.c:c263543788ddaa36", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-d06458b2bdfca56d", + "path": "src/video/go2rtc/go2rtc_consumer.c", + "line": 150, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_consumer.c:d06458b2bdfca56d", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-1592d34d4e3dc54c", + "path": "src/video/go2rtc/go2rtc_integration.c", + "line": 189, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_integration.c:1592d34d4e3dc54c", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-957e3e8e5e143726", + "path": "src/video/go2rtc/go2rtc_integration.c", + "line": 190, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_integration.c:957e3e8e5e143726", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-76ebb6a603073b54", + "path": "src/video/go2rtc/go2rtc_integration.c", + "line": 361, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_integration.c:76ebb6a603073b54", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-2c1116134a2ee5a3", + "path": "src/video/go2rtc/go2rtc_integration.c", + "line": 503, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_integration.c:2c1116134a2ee5a3", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-0ce2e7833fc885fd", + "path": "src/video/go2rtc/go2rtc_integration.c", + "line": 2167, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_integration.c:0ce2e7833fc885fd", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-4e94aa9ff957dec6", + "path": "src/video/go2rtc/go2rtc_snapshot.c", + "line": 131, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_snapshot.c:4e94aa9ff957dec6", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-f6ddc3b14e23e020", + "path": "src/video/go2rtc/go2rtc_stream.c", + "line": 624, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_stream.c:f6ddc3b14e23e020", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.99", + "title": "bugprone-implicit-widening-of-multiplication-result in mp4_writer_utils.c", + "depends_on": [ + "T7", + "T13", + "T7.77" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/video/mp4_writer_utils.c", + "tests/unit/test_t7_99.c", + "tests/unit/cmake/eng/t7_99.cmake", + "quality/evidence/T7.99.md" + ], + "source_paths": [ + "src/video/mp4_writer_utils.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.99 --regex '^test_t7_99$'" + ], + "evidence": "quality/evidence/T7.99.md", + "finding_ids": [ + "CLANGTIDY-a19387fbb98806ae" + ], + "rule_id": "bugprone-implicit-widening-of-multiplication-result", + "reproducers": [ + { + "id": "CLANGTIDY-a19387fbb98806ae", + "path": "src/video/mp4_writer_utils.c", + "line": 1242, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/mp4_writer_utils.c:a19387fbb98806ae", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.100", + "title": "bugprone-implicit-widening-of-multiplication-result in onvif_detection.c", + "depends_on": [ + "T7", + "T13", + "T7.18" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/video/onvif_detection.c", + "tests/unit/test_t7_100.c", + "tests/unit/cmake/eng/t7_100.cmake", + "quality/evidence/T7.100.md" + ], + "source_paths": [ + "src/video/onvif_detection.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.100 --regex '^test_t7_100$'" + ], + "evidence": "quality/evidence/T7.100.md", + "finding_ids": [ + "CLANGTIDY-18362aef7fade326", + "CLANGTIDY-eade1f2d38582a47", + "CLANGTIDY-8b074e54e83681ff" + ], + "rule_id": "bugprone-implicit-widening-of-multiplication-result", + "reproducers": [ + { + "id": "CLANGTIDY-18362aef7fade326", + "path": "src/video/onvif_detection.c", + "line": 148, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/onvif_detection.c:18362aef7fade326", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-eade1f2d38582a47", + "path": "src/video/onvif_detection.c", + "line": 149, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/onvif_detection.c:eade1f2d38582a47", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-8b074e54e83681ff", + "path": "src/video/onvif_detection.c", + "line": 571, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/onvif_detection.c:8b074e54e83681ff", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.101", + "title": "bugprone-implicit-widening-of-multiplication-result in onvif_event.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/video/onvif_event.c", + "tests/unit/test_t7_101.c", + "tests/unit/cmake/eng/t7_101.cmake", + "quality/evidence/T7.101.md" + ], + "source_paths": [ + "src/video/onvif_event.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.101 --regex '^test_t7_101$'" + ], + "evidence": "quality/evidence/T7.101.md", + "finding_ids": [ + "CLANGTIDY-eb4e649dccdb530f" + ], + "rule_id": "bugprone-implicit-widening-of-multiplication-result", + "reproducers": [ + { + "id": "CLANGTIDY-eb4e649dccdb530f", + "path": "src/video/onvif_event.c", + "line": 309, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/onvif_event.c:eb4e649dccdb530f", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.102", + "title": "bugprone-implicit-widening-of-multiplication-result in api_handlers_investigations.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_investigations.c", + "tests/unit/test_t7_102.c", + "tests/unit/cmake/eng/t7_102.cmake", + "quality/evidence/T7.102.md" + ], + "source_paths": [ + "src/web/api_handlers_investigations.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.102 --regex '^test_t7_102$'" + ], + "evidence": "quality/evidence/T7.102.md", + "finding_ids": [ + "CLANGTIDY-6829e02764d9d278", + "CLANGTIDY-113735d7300e4f01", + "CLANGTIDY-25b00beae5a3f4a8", + "CLANGTIDY-2387b22f15e219d3" + ], + "rule_id": "bugprone-implicit-widening-of-multiplication-result", + "reproducers": [ + { + "id": "CLANGTIDY-6829e02764d9d278", + "path": "src/web/api_handlers_investigations.c", + "line": 259, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/api_handlers_investigations.c:6829e02764d9d278", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-113735d7300e4f01", + "path": "src/web/api_handlers_investigations.c", + "line": 496, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/api_handlers_investigations.c:113735d7300e4f01", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-25b00beae5a3f4a8", + "path": "src/web/api_handlers_investigations.c", + "line": 693, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/api_handlers_investigations.c:25b00beae5a3f4a8", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-2387b22f15e219d3", + "path": "src/web/api_handlers_investigations.c", + "line": 1131, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/api_handlers_investigations.c:2387b22f15e219d3", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.103", + "title": "bugprone-implicit-widening-of-multiplication-result in api_handlers_lpr.c", + "depends_on": [ + "T7", + "T13", + "T7.45" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_lpr.c", + "tests/unit/test_t7_103.c", + "tests/unit/cmake/eng/t7_103.cmake", + "quality/evidence/T7.103.md" + ], + "source_paths": [ + "src/web/api_handlers_lpr.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.103 --regex '^test_t7_103$'" + ], + "evidence": "quality/evidence/T7.103.md", + "finding_ids": [ + "CLANGTIDY-0818b8d62b6628c5" + ], + "rule_id": "bugprone-implicit-widening-of-multiplication-result", + "reproducers": [ + { + "id": "CLANGTIDY-0818b8d62b6628c5", + "path": "src/web/api_handlers_lpr.c", + "line": 62, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/api_handlers_lpr.c:0818b8d62b6628c5", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.104", + "title": "bugprone-implicit-widening-of-multiplication-result in api_handlers_operator_floor_plans.c", + "depends_on": [ + "T7", + "T13", + "T7.27" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_operator_floor_plans.c", + "tests/unit/test_t7_104.c", + "tests/unit/cmake/eng/t7_104.cmake", + "quality/evidence/T7.104.md" + ], + "source_paths": [ + "src/web/api_handlers_operator_floor_plans.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.104 --regex '^test_t7_104$'" + ], + "evidence": "quality/evidence/T7.104.md", + "finding_ids": [ + "CLANGTIDY-53e88d8983baf290", + "CLANGTIDY-dbd6a5de3a7e191c" + ], + "rule_id": "bugprone-implicit-widening-of-multiplication-result", + "reproducers": [ + { + "id": "CLANGTIDY-53e88d8983baf290", + "path": "src/web/api_handlers_operator_floor_plans.c", + "line": 395, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/api_handlers_operator_floor_plans.c:53e88d8983baf290", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-dbd6a5de3a7e191c", + "path": "src/web/api_handlers_operator_floor_plans.c", + "line": 995, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/api_handlers_operator_floor_plans.c:dbd6a5de3a7e191c", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.105", + "title": "bugprone-implicit-widening-of-multiplication-result in api_handlers_storage.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_storage.c", + "tests/unit/test_t7_105.c", + "tests/unit/cmake/eng/t7_105.cmake", + "quality/evidence/T7.105.md" + ], + "source_paths": [ + "src/web/api_handlers_storage.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.105 --regex '^test_t7_105$'" + ], + "evidence": "quality/evidence/T7.105.md", + "finding_ids": [ + "CLANGTIDY-88f84938e1b8feb0" + ], + "rule_id": "bugprone-implicit-widening-of-multiplication-result", + "reproducers": [ + { + "id": "CLANGTIDY-88f84938e1b8feb0", + "path": "src/web/api_handlers_storage.c", + "line": 72, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/api_handlers_storage.c:88f84938e1b8feb0", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.106", + "title": "bugprone-implicit-widening-of-multiplication-result in api_handlers_system_go2rtc.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_system_go2rtc.c", + "tests/unit/test_t7_106.c", + "tests/unit/cmake/eng/t7_106.cmake", + "quality/evidence/T7.106.md" + ], + "source_paths": [ + "src/web/api_handlers_system_go2rtc.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.106 --regex '^test_t7_106$'" + ], + "evidence": "quality/evidence/T7.106.md", + "finding_ids": [ + "CLANGTIDY-101a7d6e0cfda715", + "CLANGTIDY-c586f58fa85c527e" + ], + "rule_id": "bugprone-implicit-widening-of-multiplication-result", + "reproducers": [ + { + "id": "CLANGTIDY-101a7d6e0cfda715", + "path": "src/web/api_handlers_system_go2rtc.c", + "line": 120, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/api_handlers_system_go2rtc.c:101a7d6e0cfda715", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-c586f58fa85c527e", + "path": "src/web/api_handlers_system_go2rtc.c", + "line": 340, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/api_handlers_system_go2rtc.c:c586f58fa85c527e", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.107", + "title": "bugprone-implicit-widening-of-multiplication-result in api_handlers_timeline.c", + "depends_on": [ + "T7", + "T13", + "T7.85" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_timeline.c", + "tests/unit/test_t7_107.c", + "tests/unit/cmake/eng/t7_107.cmake", + "quality/evidence/T7.107.md" + ], + "source_paths": [ + "src/web/api_handlers_timeline.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.107 --regex '^test_t7_107$'" + ], + "evidence": "quality/evidence/T7.107.md", + "finding_ids": [ + "CLANGTIDY-18895086ef6f0ed9" + ], + "rule_id": "bugprone-implicit-widening-of-multiplication-result", + "reproducers": [ + { + "id": "CLANGTIDY-18895086ef6f0ed9", + "path": "src/web/api_handlers_timeline.c", + "line": 983, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/api_handlers_timeline.c:18895086ef6f0ed9", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.108", + "title": "bugprone-implicit-widening-of-multiplication-result in go2rtc_websocket.c", + "depends_on": [ + "T7", + "T13", + "T7.82" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/web/go2rtc_websocket.c", + "tests/unit/test_t7_108.c", + "tests/unit/cmake/eng/t7_108.cmake", + "quality/evidence/T7.108.md" + ], + "source_paths": [ + "src/web/go2rtc_websocket.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.108 --regex '^test_t7_108$'" + ], + "evidence": "quality/evidence/T7.108.md", + "finding_ids": [ + "CLANGTIDY-6e45cad03ed5a9f3" + ], + "rule_id": "bugprone-implicit-widening-of-multiplication-result", + "reproducers": [ + { + "id": "CLANGTIDY-6e45cad03ed5a9f3", + "path": "src/web/go2rtc_websocket.c", + "line": 142, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/go2rtc_websocket.c:6e45cad03ed5a9f3", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.109", + "title": "bugprone-implicit-widening-of-multiplication-result in recording_archive.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/web/recording_archive.c", + "tests/unit/test_t7_109.c", + "tests/unit/cmake/eng/t7_109.cmake", + "quality/evidence/T7.109.md" + ], + "source_paths": [ + "src/web/recording_archive.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.109 --regex '^test_t7_109$'" + ], + "evidence": "quality/evidence/T7.109.md", + "finding_ids": [ + "CLANGTIDY-5bcac8af8164c1b0", + "CLANGTIDY-e2b358165654b79e" + ], + "rule_id": "bugprone-implicit-widening-of-multiplication-result", + "reproducers": [ + { + "id": "CLANGTIDY-5bcac8af8164c1b0", + "path": "src/web/recording_archive.c", + "line": 147, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/recording_archive.c:5bcac8af8164c1b0", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-e2b358165654b79e", + "path": "src/web/recording_archive.c", + "line": 147, + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/recording_archive.c:e2b358165654b79e", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.110", + "title": "bugprone-inc-dec-in-conditions in storage_source.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/storage/storage_source.c", + "tests/unit/test_t7_110.c", + "tests/unit/cmake/eng/t7_110.cmake", + "quality/evidence/T7.110.md" + ], + "source_paths": [ + "src/storage/storage_source.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.110 --regex '^test_t7_110$'" + ], + "evidence": "quality/evidence/T7.110.md", + "finding_ids": [ + "CLANGTIDY-9613b39c2e0a1e4c" + ], + "rule_id": "bugprone-inc-dec-in-conditions", + "reproducers": [ + { + "id": "CLANGTIDY-9613b39c2e0a1e4c", + "path": "src/storage/storage_source.c", + "line": 186, + "fingerprint": "clang-tidy:bugprone-inc-dec-in-conditions:src/storage/storage_source.c:9613b39c2e0a1e4c", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.111", + "title": "bugprone-macro-parentheses in cJSON.h", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_111-upstream.json", + "quality/evidence/T7.111.md" + ], + "source_paths": [ + "/usr/include/cjson/cJSON.h" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Compile/evaluate precedence-sensitive macro arguments and side effects; results must match the intended fully parenthesized expression without double evaluation.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_111-upstream.json" + ], + "evidence": "quality/evidence/T7.111.md", + "finding_ids": [ + "CLANGTIDY-5f6ae30cde3aaf3d", + "CLANGTIDY-bc48f96894493869", + "CLANGTIDY-01e4c541adfa23e3", + "CLANGTIDY-3abdad2ed8a71fe5", + "CLANGTIDY-09829500c354c2b5", + "CLANGTIDY-661c1d9d010f4873", + "CLANGTIDY-f69ef126d8e55b2b", + "CLANGTIDY-6d1385324d08479d" + ], + "rule_id": "bugprone-macro-parentheses", + "reproducers": [ + { + "id": "CLANGTIDY-5f6ae30cde3aaf3d", + "path": "/usr/include/cjson/cJSON.h", + "line": 284, + "fingerprint": "clang-tidy:bugprone-macro-parentheses:/usr/include/cjson/cJSON.h:5f6ae30cde3aaf3d", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-bc48f96894493869", + "path": "/usr/include/cjson/cJSON.h", + "line": 284, + "fingerprint": "clang-tidy:bugprone-macro-parentheses:/usr/include/cjson/cJSON.h:bc48f96894493869", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-01e4c541adfa23e3", + "path": "/usr/include/cjson/cJSON.h", + "line": 290, + "fingerprint": "clang-tidy:bugprone-macro-parentheses:/usr/include/cjson/cJSON.h:01e4c541adfa23e3", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-3abdad2ed8a71fe5", + "path": "/usr/include/cjson/cJSON.h", + "line": 296, + "fingerprint": "clang-tidy:bugprone-macro-parentheses:/usr/include/cjson/cJSON.h:3abdad2ed8a71fe5", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-09829500c354c2b5", + "path": "/usr/include/cjson/cJSON.h", + "line": 296, + "fingerprint": "clang-tidy:bugprone-macro-parentheses:/usr/include/cjson/cJSON.h:09829500c354c2b5", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-661c1d9d010f4873", + "path": "/usr/include/cjson/cJSON.h", + "line": 296, + "fingerprint": "clang-tidy:bugprone-macro-parentheses:/usr/include/cjson/cJSON.h:661c1d9d010f4873", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-f69ef126d8e55b2b", + "path": "/usr/include/cjson/cJSON.h", + "line": 296, + "fingerprint": "clang-tidy:bugprone-macro-parentheses:/usr/include/cjson/cJSON.h:f69ef126d8e55b2b", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-6d1385324d08479d", + "path": "/usr/include/cjson/cJSON.h", + "line": 296, + "fingerprint": "clang-tidy:bugprone-macro-parentheses:/usr/include/cjson/cJSON.h:6d1385324d08479d", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.112", + "title": "bugprone-macro-parentheses in api_detection.c", + "depends_on": [ + "T7", + "T13", + "T7.80" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/video/api_detection.c", + "tests/unit/test_t7_112.c", + "tests/unit/cmake/eng/t7_112.cmake", + "quality/evidence/T7.112.md" + ], + "source_paths": [ + "src/video/api_detection.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Compile/evaluate precedence-sensitive macro arguments and side effects; results must match the intended fully parenthesized expression without double evaluation.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.112 --regex '^test_t7_112$'" + ], + "evidence": "quality/evidence/T7.112.md", + "finding_ids": [ + "CLANGTIDY-ae25a6959341dd10" + ], + "rule_id": "bugprone-macro-parentheses", + "reproducers": [ + { + "id": "CLANGTIDY-ae25a6959341dd10", + "path": "src/video/api_detection.c", + "line": 59, + "fingerprint": "clang-tidy:bugprone-macro-parentheses:src/video/api_detection.c:ae25a6959341dd10", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.113", + "title": "bugprone-misplaced-widening-cast in db_fleet_query.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/database/db_fleet_query.c", + "tests/unit/test_t7_113.c", + "tests/unit/cmake/eng/t7_113.cmake", + "quality/evidence/T7.113.md" + ], + "source_paths": [ + "src/database/db_fleet_query.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.113 --regex '^test_t7_113$'" + ], + "evidence": "quality/evidence/T7.113.md", + "finding_ids": [ + "CLANGTIDY-7bff304a77769e6c" + ], + "rule_id": "bugprone-misplaced-widening-cast", + "reproducers": [ + { + "id": "CLANGTIDY-7bff304a77769e6c", + "path": "src/database/db_fleet_query.c", + "line": 297, + "fingerprint": "clang-tidy:bugprone-misplaced-widening-cast:src/database/db_fleet_query.c:7bff304a77769e6c", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.114", + "title": "bugprone-multi-level-implicit-pointer-conversion in authorization.c", + "depends_on": [ + "T7", + "T13", + "T7.53" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/core/authorization.c", + "tests/unit/test_t7_114.c", + "tests/unit/cmake/eng/t7_114.cmake", + "quality/evidence/T7.114.md" + ], + "source_paths": [ + "src/core/authorization.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.114 --regex '^test_t7_114$'" + ], + "evidence": "quality/evidence/T7.114.md", + "finding_ids": [ + "CLANGTIDY-4505cfde8bb2e42a", + "CLANGTIDY-ff0e443bb0b29339" + ], + "rule_id": "bugprone-multi-level-implicit-pointer-conversion", + "reproducers": [ + { + "id": "CLANGTIDY-4505cfde8bb2e42a", + "path": "src/core/authorization.c", + "line": 170, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/core/authorization.c:4505cfde8bb2e42a", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-ff0e443bb0b29339", + "path": "src/core/authorization.c", + "line": 265, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/core/authorization.c:ff0e443bb0b29339", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.115", + "title": "bugprone-multi-level-implicit-pointer-conversion in camera_collection_filter.c", + "depends_on": [ + "T7", + "T13", + "T7.33" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/core/camera_collection_filter.c", + "tests/unit/test_t7_115.c", + "tests/unit/cmake/eng/t7_115.cmake", + "quality/evidence/T7.115.md" + ], + "source_paths": [ + "src/core/camera_collection_filter.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.115 --regex '^test_t7_115$'" + ], + "evidence": "quality/evidence/T7.115.md", + "finding_ids": [ + "CLANGTIDY-3a7569f24a5603a4", + "CLANGTIDY-54a9eba3b05f0872", + "CLANGTIDY-a221992baafec96f" + ], + "rule_id": "bugprone-multi-level-implicit-pointer-conversion", + "reproducers": [ + { + "id": "CLANGTIDY-3a7569f24a5603a4", + "path": "src/core/camera_collection_filter.c", + "line": 132, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/core/camera_collection_filter.c:3a7569f24a5603a4", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-54a9eba3b05f0872", + "path": "src/core/camera_collection_filter.c", + "line": 145, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/core/camera_collection_filter.c:54a9eba3b05f0872", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-a221992baafec96f", + "path": "src/core/camera_collection_filter.c", + "line": 195, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/core/camera_collection_filter.c:a221992baafec96f", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.116", + "title": "bugprone-multi-level-implicit-pointer-conversion in camera_selector.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/core/camera_selector.c", + "tests/unit/test_t7_116.c", + "tests/unit/cmake/eng/t7_116.cmake", + "quality/evidence/T7.116.md" + ], + "source_paths": [ + "src/core/camera_selector.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.116 --regex '^test_t7_116$'" + ], + "evidence": "quality/evidence/T7.116.md", + "finding_ids": [ + "CLANGTIDY-8e1debc0e42f328a", + "CLANGTIDY-1fb6fbd990b73e55", + "CLANGTIDY-52e7ee5b7b20725e", + "CLANGTIDY-a816d3388754e9a3", + "CLANGTIDY-bdf2049affa5a3fd", + "CLANGTIDY-946781b07a8a19f6" + ], + "rule_id": "bugprone-multi-level-implicit-pointer-conversion", + "reproducers": [ + { + "id": "CLANGTIDY-8e1debc0e42f328a", + "path": "src/core/camera_selector.c", + "line": 99, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/core/camera_selector.c:8e1debc0e42f328a", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-1fb6fbd990b73e55", + "path": "src/core/camera_selector.c", + "line": 100, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/core/camera_selector.c:1fb6fbd990b73e55", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-52e7ee5b7b20725e", + "path": "src/core/camera_selector.c", + "line": 114, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/core/camera_selector.c:52e7ee5b7b20725e", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-a816d3388754e9a3", + "path": "src/core/camera_selector.c", + "line": 182, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/core/camera_selector.c:a816d3388754e9a3", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-bdf2049affa5a3fd", + "path": "src/core/camera_selector.c", + "line": 203, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/core/camera_selector.c:bdf2049affa5a3fd", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-946781b07a8a19f6", + "path": "src/core/camera_selector.c", + "line": 229, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/core/camera_selector.c:946781b07a8a19f6", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.117", + "title": "bugprone-multi-level-implicit-pointer-conversion in db_storage_lifecycle.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/database/db_storage_lifecycle.c", + "tests/unit/test_t7_117.c", + "tests/unit/cmake/eng/t7_117.cmake", + "quality/evidence/T7.117.md" + ], + "source_paths": [ + "src/database/db_storage_lifecycle.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.117 --regex '^test_t7_117$'" + ], + "evidence": "quality/evidence/T7.117.md", + "finding_ids": [ + "CLANGTIDY-39f0ad6017069f02", + "CLANGTIDY-c666354bdbc1df4b", + "CLANGTIDY-c8b906651c5b2c7f", + "CLANGTIDY-8a2d068dc3e8b0c0", + "CLANGTIDY-ad7afdbd70ca0a46" + ], + "rule_id": "bugprone-multi-level-implicit-pointer-conversion", + "reproducers": [ + { + "id": "CLANGTIDY-39f0ad6017069f02", + "path": "src/database/db_storage_lifecycle.c", + "line": 312, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/database/db_storage_lifecycle.c:39f0ad6017069f02", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-c666354bdbc1df4b", + "path": "src/database/db_storage_lifecycle.c", + "line": 316, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/database/db_storage_lifecycle.c:c666354bdbc1df4b", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-c8b906651c5b2c7f", + "path": "src/database/db_storage_lifecycle.c", + "line": 329, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/database/db_storage_lifecycle.c:c8b906651c5b2c7f", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-8a2d068dc3e8b0c0", + "path": "src/database/db_storage_lifecycle.c", + "line": 329, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/database/db_storage_lifecycle.c:8a2d068dc3e8b0c0", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-ad7afdbd70ca0a46", + "path": "src/database/db_storage_lifecycle.c", + "line": 338, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/database/db_storage_lifecycle.c:ad7afdbd70ca0a46", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.118", + "title": "bugprone-multi-level-implicit-pointer-conversion in hls_cache_cleanup.c", + "depends_on": [ + "T7", + "T13", + "T7.71" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/video/hls/hls_cache_cleanup.c", + "tests/unit/test_t7_118.c", + "tests/unit/cmake/eng/t7_118.cmake", + "quality/evidence/T7.118.md" + ], + "source_paths": [ + "src/video/hls/hls_cache_cleanup.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.118 --regex '^test_t7_118$'" + ], + "evidence": "quality/evidence/T7.118.md", + "finding_ids": [ + "CLANGTIDY-48d30c8fb35cc9cd", + "CLANGTIDY-1634947d8289644f", + "CLANGTIDY-cb9a5afe872113f7", + "CLANGTIDY-098d117140abdf3a", + "CLANGTIDY-a89af13dd80ae187" + ], + "rule_id": "bugprone-multi-level-implicit-pointer-conversion", + "reproducers": [ + { + "id": "CLANGTIDY-48d30c8fb35cc9cd", + "path": "src/video/hls/hls_cache_cleanup.c", + "line": 83, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/video/hls/hls_cache_cleanup.c:48d30c8fb35cc9cd", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-1634947d8289644f", + "path": "src/video/hls/hls_cache_cleanup.c", + "line": 100, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/video/hls/hls_cache_cleanup.c:1634947d8289644f", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-cb9a5afe872113f7", + "path": "src/video/hls/hls_cache_cleanup.c", + "line": 105, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/video/hls/hls_cache_cleanup.c:cb9a5afe872113f7", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-098d117140abdf3a", + "path": "src/video/hls/hls_cache_cleanup.c", + "line": 105, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/video/hls/hls_cache_cleanup.c:098d117140abdf3a", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-a89af13dd80ae187", + "path": "src/video/hls/hls_cache_cleanup.c", + "line": 122, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/video/hls/hls_cache_cleanup.c:a89af13dd80ae187", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.119", + "title": "bugprone-multi-level-implicit-pointer-conversion in mp4_segment_recorder.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/video/mp4_segment_recorder.c", + "tests/unit/test_t7_119.c", + "tests/unit/cmake/eng/t7_119.cmake", + "quality/evidence/T7.119.md" + ], + "source_paths": [ + "src/video/mp4_segment_recorder.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.119 --regex '^test_t7_119$'" + ], + "evidence": "quality/evidence/T7.119.md", + "finding_ids": [ + "CLANGTIDY-30c3f7edea8fbd8d" + ], + "rule_id": "bugprone-multi-level-implicit-pointer-conversion", + "reproducers": [ + { + "id": "CLANGTIDY-30c3f7edea8fbd8d", + "path": "src/video/mp4_segment_recorder.c", + "line": 1860, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/video/mp4_segment_recorder.c:30c3f7edea8fbd8d", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.120", + "title": "bugprone-multi-level-implicit-pointer-conversion in mp4_writer_core.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/video/mp4_writer_core.c", + "tests/unit/test_t7_120.c", + "tests/unit/cmake/eng/t7_120.cmake", + "quality/evidence/T7.120.md" + ], + "source_paths": [ + "src/video/mp4_writer_core.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.120 --regex '^test_t7_120$'" + ], + "evidence": "quality/evidence/T7.120.md", + "finding_ids": [ + "CLANGTIDY-d421e791a6b63cc9" + ], + "rule_id": "bugprone-multi-level-implicit-pointer-conversion", + "reproducers": [ + { + "id": "CLANGTIDY-d421e791a6b63cc9", + "path": "src/video/mp4_writer_core.c", + "line": 64, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/video/mp4_writer_core.c:d421e791a6b63cc9", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.121", + "title": "bugprone-multi-level-implicit-pointer-conversion in mp4_writer_utils.c", + "depends_on": [ + "T7", + "T13", + "T7.99" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/video/mp4_writer_utils.c", + "tests/unit/test_t7_121.c", + "tests/unit/cmake/eng/t7_121.cmake", + "quality/evidence/T7.121.md" + ], + "source_paths": [ + "src/video/mp4_writer_utils.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.121 --regex '^test_t7_121$'" + ], + "evidence": "quality/evidence/T7.121.md", + "finding_ids": [ + "CLANGTIDY-c536433a0089e4b9", + "CLANGTIDY-4e34d6b524364f03" + ], + "rule_id": "bugprone-multi-level-implicit-pointer-conversion", + "reproducers": [ + { + "id": "CLANGTIDY-c536433a0089e4b9", + "path": "src/video/mp4_writer_utils.c", + "line": 805, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/video/mp4_writer_utils.c:c536433a0089e4b9", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-4e34d6b524364f03", + "path": "src/video/mp4_writer_utils.c", + "line": 805, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/video/mp4_writer_utils.c:4e34d6b524364f03", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.122", + "title": "bugprone-multi-level-implicit-pointer-conversion in unified_detection_thread.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/video/unified_detection_thread.c", + "tests/unit/test_t7_122.c", + "tests/unit/cmake/eng/t7_122.cmake", + "quality/evidence/T7.122.md" + ], + "source_paths": [ + "src/video/unified_detection_thread.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.122 --regex '^test_t7_122$'" + ], + "evidence": "quality/evidence/T7.122.md", + "finding_ids": [ + "CLANGTIDY-5dc4623d12ccf5b2" + ], + "rule_id": "bugprone-multi-level-implicit-pointer-conversion", + "reproducers": [ + { + "id": "CLANGTIDY-5dc4623d12ccf5b2", + "path": "src/video/unified_detection_thread.c", + "line": 477, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/video/unified_detection_thread.c:5dc4623d12ccf5b2", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.123", + "title": "bugprone-multi-level-implicit-pointer-conversion in api_handlers_camera_collections.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_camera_collections.c", + "tests/unit/test_t7_123.c", + "tests/unit/cmake/eng/t7_123.cmake", + "quality/evidence/T7.123.md" + ], + "source_paths": [ + "src/web/api_handlers_camera_collections.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.123 --regex '^test_t7_123$'" + ], + "evidence": "quality/evidence/T7.123.md", + "finding_ids": [ + "CLANGTIDY-1f9c86e17ca383f9", + "CLANGTIDY-316e32d23b15b780", + "CLANGTIDY-7464eb7864628fd1", + "CLANGTIDY-5e2b3b364d163173", + "CLANGTIDY-81fbfb962103b645", + "CLANGTIDY-c41e983019497e88", + "CLANGTIDY-308b0349ef001b56", + "CLANGTIDY-7a3f68ca1e19c9db", + "CLANGTIDY-475d0f82a4e9b764", + "CLANGTIDY-2276a7bff678cf41", + "CLANGTIDY-63c736995704d2d6", + "CLANGTIDY-f5ac788b77f1417a", + "CLANGTIDY-ae6a96ea4d41087d", + "CLANGTIDY-f617ccfb4cfc3cc2", + "CLANGTIDY-169001b0559c7bcb", + "CLANGTIDY-6bce10f282924906" + ], + "rule_id": "bugprone-multi-level-implicit-pointer-conversion", + "reproducers": [ + { + "id": "CLANGTIDY-1f9c86e17ca383f9", + "path": "src/web/api_handlers_camera_collections.c", + "line": 142, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:1f9c86e17ca383f9", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-316e32d23b15b780", + "path": "src/web/api_handlers_camera_collections.c", + "line": 152, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:316e32d23b15b780", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-7464eb7864628fd1", + "path": "src/web/api_handlers_camera_collections.c", + "line": 160, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:7464eb7864628fd1", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-5e2b3b364d163173", + "path": "src/web/api_handlers_camera_collections.c", + "line": 176, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:5e2b3b364d163173", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-81fbfb962103b645", + "path": "src/web/api_handlers_camera_collections.c", + "line": 332, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:81fbfb962103b645", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-c41e983019497e88", + "path": "src/web/api_handlers_camera_collections.c", + "line": 405, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:c41e983019497e88", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-308b0349ef001b56", + "path": "src/web/api_handlers_camera_collections.c", + "line": 567, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:308b0349ef001b56", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-7a3f68ca1e19c9db", + "path": "src/web/api_handlers_camera_collections.c", + "line": 577, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:7a3f68ca1e19c9db", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-475d0f82a4e9b764", + "path": "src/web/api_handlers_camera_collections.c", + "line": 589, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:475d0f82a4e9b764", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-2276a7bff678cf41", + "path": "src/web/api_handlers_camera_collections.c", + "line": 623, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:2276a7bff678cf41", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-63c736995704d2d6", + "path": "src/web/api_handlers_camera_collections.c", + "line": 627, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:63c736995704d2d6", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-f5ac788b77f1417a", + "path": "src/web/api_handlers_camera_collections.c", + "line": 636, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:f5ac788b77f1417a", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-ae6a96ea4d41087d", + "path": "src/web/api_handlers_camera_collections.c", + "line": 650, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:ae6a96ea4d41087d", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-f617ccfb4cfc3cc2", + "path": "src/web/api_handlers_camera_collections.c", + "line": 693, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:f617ccfb4cfc3cc2", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-169001b0559c7bcb", + "path": "src/web/api_handlers_camera_collections.c", + "line": 703, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:169001b0559c7bcb", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-6bce10f282924906", + "path": "src/web/api_handlers_camera_collections.c", + "line": 721, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:6bce10f282924906", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.124", + "title": "bugprone-multi-level-implicit-pointer-conversion in api_handlers_fleet.c", + "depends_on": [ + "T7", + "T13", + "T7.63" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_fleet.c", + "tests/unit/test_t7_124.c", + "tests/unit/cmake/eng/t7_124.cmake", + "quality/evidence/T7.124.md" + ], + "source_paths": [ + "src/web/api_handlers_fleet.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.124 --regex '^test_t7_124$'" + ], + "evidence": "quality/evidence/T7.124.md", + "finding_ids": [ + "CLANGTIDY-0b0bcefaf7a0b24f", + "CLANGTIDY-d8c6998c9398adf1", + "CLANGTIDY-79ebe40a23b7323a", + "CLANGTIDY-6da59a8629d16699", + "CLANGTIDY-773e04e041de5410", + "CLANGTIDY-f12d6e4a615966e9", + "CLANGTIDY-ede4da279d79ec69", + "CLANGTIDY-36c8164a04c2420c", + "CLANGTIDY-4053884d5188ab2f" + ], + "rule_id": "bugprone-multi-level-implicit-pointer-conversion", + "reproducers": [ + { + "id": "CLANGTIDY-0b0bcefaf7a0b24f", + "path": "src/web/api_handlers_fleet.c", + "line": 698, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_fleet.c:0b0bcefaf7a0b24f", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-d8c6998c9398adf1", + "path": "src/web/api_handlers_fleet.c", + "line": 733, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_fleet.c:d8c6998c9398adf1", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-79ebe40a23b7323a", + "path": "src/web/api_handlers_fleet.c", + "line": 742, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_fleet.c:79ebe40a23b7323a", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-6da59a8629d16699", + "path": "src/web/api_handlers_fleet.c", + "line": 771, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_fleet.c:6da59a8629d16699", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-773e04e041de5410", + "path": "src/web/api_handlers_fleet.c", + "line": 786, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_fleet.c:773e04e041de5410", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-f12d6e4a615966e9", + "path": "src/web/api_handlers_fleet.c", + "line": 805, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_fleet.c:f12d6e4a615966e9", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-ede4da279d79ec69", + "path": "src/web/api_handlers_fleet.c", + "line": 820, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_fleet.c:ede4da279d79ec69", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-36c8164a04c2420c", + "path": "src/web/api_handlers_fleet.c", + "line": 835, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_fleet.c:36c8164a04c2420c", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-4053884d5188ab2f", + "path": "src/web/api_handlers_fleet.c", + "line": 850, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_fleet.c:4053884d5188ab2f", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.125", + "title": "bugprone-multi-level-implicit-pointer-conversion in api_handlers_retention.c", + "depends_on": [ + "T7", + "T13", + "T7.47" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_retention.c", + "tests/unit/test_t7_125.c", + "tests/unit/cmake/eng/t7_125.cmake", + "quality/evidence/T7.125.md" + ], + "source_paths": [ + "src/web/api_handlers_retention.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.125 --regex '^test_t7_125$'" + ], + "evidence": "quality/evidence/T7.125.md", + "finding_ids": [ + "CLANGTIDY-0cc9a9ea64babfdc", + "CLANGTIDY-234cb88ea5651731" + ], + "rule_id": "bugprone-multi-level-implicit-pointer-conversion", + "reproducers": [ + { + "id": "CLANGTIDY-0cc9a9ea64babfdc", + "path": "src/web/api_handlers_retention.c", + "line": 418, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_retention.c:0cc9a9ea64babfdc", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-234cb88ea5651731", + "path": "src/web/api_handlers_retention.c", + "line": 427, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_retention.c:234cb88ea5651731", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.126", + "title": "bugprone-multi-level-implicit-pointer-conversion in api_handlers_storage_policies.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_storage_policies.c", + "tests/unit/test_t7_126.c", + "tests/unit/cmake/eng/t7_126.cmake", + "quality/evidence/T7.126.md" + ], + "source_paths": [ + "src/web/api_handlers_storage_policies.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.126 --regex '^test_t7_126$'" + ], + "evidence": "quality/evidence/T7.126.md", + "finding_ids": [ + "CLANGTIDY-312e6eafc5ebdca6", + "CLANGTIDY-1985156ff8e5c87d", + "CLANGTIDY-ca7e963b9f3e3214", + "CLANGTIDY-aede9d1024b66426", + "CLANGTIDY-07c63776b48ad48f", + "CLANGTIDY-ea16598ca26b9108" + ], + "rule_id": "bugprone-multi-level-implicit-pointer-conversion", + "reproducers": [ + { + "id": "CLANGTIDY-312e6eafc5ebdca6", + "path": "src/web/api_handlers_storage_policies.c", + "line": 479, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_storage_policies.c:312e6eafc5ebdca6", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-1985156ff8e5c87d", + "path": "src/web/api_handlers_storage_policies.c", + "line": 487, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_storage_policies.c:1985156ff8e5c87d", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-ca7e963b9f3e3214", + "path": "src/web/api_handlers_storage_policies.c", + "line": 498, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_storage_policies.c:ca7e963b9f3e3214", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-aede9d1024b66426", + "path": "src/web/api_handlers_storage_policies.c", + "line": 516, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_storage_policies.c:aede9d1024b66426", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-07c63776b48ad48f", + "path": "src/web/api_handlers_storage_policies.c", + "line": 532, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_storage_policies.c:07c63776b48ad48f", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-ea16598ca26b9108", + "path": "src/web/api_handlers_storage_policies.c", + "line": 643, + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_storage_policies.c:ea16598ca26b9108", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.127", + "title": "bugprone-narrowing-conversions in api_timing.h", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "include/web/api_timing.h", + "tests/unit/test_t7_127.c", + "tests/unit/cmake/eng/t7_127.cmake", + "quality/evidence/T7.127.md" + ], + "source_paths": [ + "include/web/api_timing.h" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.127 --regex '^test_t7_127$'" + ], + "evidence": "quality/evidence/T7.127.md", + "finding_ids": [ + "CLANGTIDY-ca2f4806dea5f177", + "CLANGTIDY-054f4f2a2583f814" + ], + "rule_id": "bugprone-narrowing-conversions", + "reproducers": [ + { + "id": "CLANGTIDY-ca2f4806dea5f177", + "path": "include/web/api_timing.h", + "line": 30, + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:include/web/api_timing.h:ca2f4806dea5f177", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-054f4f2a2583f814", + "path": "include/web/api_timing.h", + "line": 31, + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:include/web/api_timing.h:054f4f2a2583f814", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.128", + "title": "bugprone-narrowing-conversions in path_utils.c", + "depends_on": [ + "T7", + "T13", + "T7.52" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/core/path_utils.c", + "tests/unit/test_t7_128.c", + "tests/unit/cmake/eng/t7_128.cmake", + "quality/evidence/T7.128.md" + ], + "source_paths": [ + "src/core/path_utils.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.128 --regex '^test_t7_128$'" + ], + "evidence": "quality/evidence/T7.128.md", + "finding_ids": [ + "CLANGTIDY-dda225859c807d72" + ], + "rule_id": "bugprone-narrowing-conversions", + "reproducers": [ + { + "id": "CLANGTIDY-dda225859c807d72", + "path": "src/core/path_utils.c", + "line": 23, + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/core/path_utils.c:dda225859c807d72", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.129", + "title": "bugprone-narrowing-conversions in db_storage_lifecycle.c", + "depends_on": [ + "T7", + "T13", + "T7.117" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/database/db_storage_lifecycle.c", + "tests/unit/test_t7_129.c", + "tests/unit/cmake/eng/t7_129.cmake", + "quality/evidence/T7.129.md" + ], + "source_paths": [ + "src/database/db_storage_lifecycle.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.129 --regex '^test_t7_129$'" + ], + "evidence": "quality/evidence/T7.129.md", + "finding_ids": [ + "CLANGTIDY-76e54a4e3ac5efb3", + "CLANGTIDY-84fbbd387f95947a" + ], + "rule_id": "bugprone-narrowing-conversions", + "reproducers": [ + { + "id": "CLANGTIDY-76e54a4e3ac5efb3", + "path": "src/database/db_storage_lifecycle.c", + "line": 579, + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/database/db_storage_lifecycle.c:76e54a4e3ac5efb3", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-84fbbd387f95947a", + "path": "src/database/db_storage_lifecycle.c", + "line": 580, + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/database/db_storage_lifecycle.c:84fbbd387f95947a", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.130", + "title": "bugprone-narrowing-conversions in mp4_writer_utils.c", + "depends_on": [ + "T7", + "T13", + "T7.121" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/video/mp4_writer_utils.c", + "tests/unit/test_t7_130.c", + "tests/unit/cmake/eng/t7_130.cmake", + "quality/evidence/T7.130.md" + ], + "source_paths": [ + "src/video/mp4_writer_utils.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.130 --regex '^test_t7_130$'" + ], + "evidence": "quality/evidence/T7.130.md", + "finding_ids": [ + "CLANGTIDY-c74d7d04edeb4ee2", + "CLANGTIDY-cb47dbd2bd0937a1", + "CLANGTIDY-6f7bee0a60d5152f" + ], + "rule_id": "bugprone-narrowing-conversions", + "reproducers": [ + { + "id": "CLANGTIDY-c74d7d04edeb4ee2", + "path": "src/video/mp4_writer_utils.c", + "line": 92, + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/video/mp4_writer_utils.c:c74d7d04edeb4ee2", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-cb47dbd2bd0937a1", + "path": "src/video/mp4_writer_utils.c", + "line": 1244, + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/video/mp4_writer_utils.c:cb47dbd2bd0937a1", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-6f7bee0a60d5152f", + "path": "src/video/mp4_writer_utils.c", + "line": 1245, + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/video/mp4_writer_utils.c:6f7bee0a60d5152f", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.131", + "title": "bugprone-narrowing-conversions in stream_frame_rate.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/video/stream_frame_rate.c", + "tests/unit/test_t7_131.c", + "tests/unit/cmake/eng/t7_131.cmake", + "quality/evidence/T7.131.md" + ], + "source_paths": [ + "src/video/stream_frame_rate.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.131 --regex '^test_t7_131$'" + ], + "evidence": "quality/evidence/T7.131.md", + "finding_ids": [ + "CLANGTIDY-e1b115ce18cb0926", + "CLANGTIDY-9bb912a1e3d2bf88" + ], + "rule_id": "bugprone-narrowing-conversions", + "reproducers": [ + { + "id": "CLANGTIDY-e1b115ce18cb0926", + "path": "src/video/stream_frame_rate.c", + "line": 41, + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/video/stream_frame_rate.c:e1b115ce18cb0926", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-9bb912a1e3d2bf88", + "path": "src/video/stream_frame_rate.c", + "line": 41, + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/video/stream_frame_rate.c:9bb912a1e3d2bf88", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.132", + "title": "bugprone-narrowing-conversions in api_handlers_storage_compliance.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_storage_compliance.c", + "tests/unit/test_t7_132.c", + "tests/unit/cmake/eng/t7_132.cmake", + "quality/evidence/T7.132.md" + ], + "source_paths": [ + "src/web/api_handlers_storage_compliance.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.132 --regex '^test_t7_132$'" + ], + "evidence": "quality/evidence/T7.132.md", + "finding_ids": [ + "CLANGTIDY-6a756d858b2a4590", + "CLANGTIDY-0f6724ca27b42ed9", + "CLANGTIDY-ec3e72154d735330", + "CLANGTIDY-e85c88c08460d2ef", + "CLANGTIDY-9c90ce2f531301e0", + "CLANGTIDY-3e6ff569aac7699e", + "CLANGTIDY-ca4b8a2f2a2f60bf", + "CLANGTIDY-c990523bb862f2b6", + "CLANGTIDY-7a5a584e25342a04", + "CLANGTIDY-8d9dd908cb4d8452" + ], + "rule_id": "bugprone-narrowing-conversions", + "reproducers": [ + { + "id": "CLANGTIDY-6a756d858b2a4590", + "path": "src/web/api_handlers_storage_compliance.c", + "line": 80, + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/web/api_handlers_storage_compliance.c:6a756d858b2a4590", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-0f6724ca27b42ed9", + "path": "src/web/api_handlers_storage_compliance.c", + "line": 82, + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/web/api_handlers_storage_compliance.c:0f6724ca27b42ed9", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-ec3e72154d735330", + "path": "src/web/api_handlers_storage_compliance.c", + "line": 84, + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/web/api_handlers_storage_compliance.c:ec3e72154d735330", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-e85c88c08460d2ef", + "path": "src/web/api_handlers_storage_compliance.c", + "line": 85, + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/web/api_handlers_storage_compliance.c:e85c88c08460d2ef", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-9c90ce2f531301e0", + "path": "src/web/api_handlers_storage_compliance.c", + "line": 182, + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/web/api_handlers_storage_compliance.c:9c90ce2f531301e0", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-3e6ff569aac7699e", + "path": "src/web/api_handlers_storage_compliance.c", + "line": 183, + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/web/api_handlers_storage_compliance.c:3e6ff569aac7699e", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-ca4b8a2f2a2f60bf", + "path": "src/web/api_handlers_storage_compliance.c", + "line": 183, + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/web/api_handlers_storage_compliance.c:ca4b8a2f2a2f60bf", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-c990523bb862f2b6", + "path": "src/web/api_handlers_storage_compliance.c", + "line": 190, + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/web/api_handlers_storage_compliance.c:c990523bb862f2b6", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-7a5a584e25342a04", + "path": "src/web/api_handlers_storage_compliance.c", + "line": 191, + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/web/api_handlers_storage_compliance.c:7a5a584e25342a04", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-8d9dd908cb4d8452", + "path": "src/web/api_handlers_storage_compliance.c", + "line": 191, + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/web/api_handlers_storage_compliance.c:8d9dd908cb4d8452", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.133", + "title": "bugprone-narrowing-conversions in httpd_utils.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/web/httpd_utils.c", + "tests/unit/test_t7_133.c", + "tests/unit/cmake/eng/t7_133.cmake", + "quality/evidence/T7.133.md" + ], + "source_paths": [ + "src/web/httpd_utils.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.133 --regex '^test_t7_133$'" + ], + "evidence": "quality/evidence/T7.133.md", + "finding_ids": [ + "CLANGTIDY-cb7511d8b0a3b651" + ], + "rule_id": "bugprone-narrowing-conversions", + "reproducers": [ + { + "id": "CLANGTIDY-cb7511d8b0a3b651", + "path": "src/web/httpd_utils.c", + "line": 871, + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/web/httpd_utils.c:cb7511d8b0a3b651", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.134", + "title": "bugprone-not-null-terminated-result in mqtt_destination_client.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/core/mqtt_destination_client.c", + "tests/unit/test_t7_134.c", + "tests/unit/cmake/eng/t7_134.cmake", + "quality/evidence/T7.134.md" + ], + "source_paths": [ + "src/core/mqtt_destination_client.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.134 --regex '^test_t7_134$'" + ], + "evidence": "quality/evidence/T7.134.md", + "finding_ids": [ + "CLANGTIDY-d7edea27d80824ed" + ], + "rule_id": "bugprone-not-null-terminated-result", + "reproducers": [ + { + "id": "CLANGTIDY-d7edea27d80824ed", + "path": "src/core/mqtt_destination_client.c", + "line": 163, + "fingerprint": "clang-tidy:bugprone-not-null-terminated-result:src/core/mqtt_destination_client.c:d7edea27d80824ed", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.135", + "title": "bugprone-not-null-terminated-result in linux_hardware.c", + "depends_on": [ + "T7", + "T13", + "T7.58" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/telemetry/providers/linux_hardware.c", + "tests/unit/test_t7_135.c", + "tests/unit/cmake/eng/t7_135.cmake", + "quality/evidence/T7.135.md" + ], + "source_paths": [ + "src/telemetry/providers/linux_hardware.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.135 --regex '^test_t7_135$'" + ], + "evidence": "quality/evidence/T7.135.md", + "finding_ids": [ + "CLANGTIDY-65ab86fae5fd2213" + ], + "rule_id": "bugprone-not-null-terminated-result", + "reproducers": [ + { + "id": "CLANGTIDY-65ab86fae5fd2213", + "path": "src/telemetry/providers/linux_hardware.c", + "line": 72, + "fingerprint": "clang-tidy:bugprone-not-null-terminated-result:src/telemetry/providers/linux_hardware.c:65ab86fae5fd2213", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.136", + "title": "bugprone-suspicious-string-compare in db_storage_targets.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/database/db_storage_targets.c", + "tests/unit/test_t7_136.c", + "tests/unit/cmake/eng/t7_136.cmake", + "quality/evidence/T7.136.md" + ], + "source_paths": [ + "src/database/db_storage_targets.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Use equal, unequal, prefix-only and empty strings to prove the branch implements the intended comparison rather than pointer/boolean equality.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.136 --regex '^test_t7_136$'" + ], + "evidence": "quality/evidence/T7.136.md", + "finding_ids": [ + "CLANGTIDY-709dbb22240f409f", + "CLANGTIDY-d68060f1555ca324", + "CLANGTIDY-b922ced0e34aacea", + "CLANGTIDY-295d32efbfee9145" + ], + "rule_id": "bugprone-suspicious-string-compare", + "reproducers": [ + { + "id": "CLANGTIDY-709dbb22240f409f", + "path": "src/database/db_storage_targets.c", + "line": 865, + "fingerprint": "clang-tidy:bugprone-suspicious-string-compare:src/database/db_storage_targets.c:709dbb22240f409f", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-d68060f1555ca324", + "path": "src/database/db_storage_targets.c", + "line": 867, + "fingerprint": "clang-tidy:bugprone-suspicious-string-compare:src/database/db_storage_targets.c:d68060f1555ca324", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-b922ced0e34aacea", + "path": "src/database/db_storage_targets.c", + "line": 868, + "fingerprint": "clang-tidy:bugprone-suspicious-string-compare:src/database/db_storage_targets.c:b922ced0e34aacea", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-295d32efbfee9145", + "path": "src/database/db_storage_targets.c", + "line": 870, + "fingerprint": "clang-tidy:bugprone-suspicious-string-compare:src/database/db_storage_targets.c:295d32efbfee9145", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.137", + "title": "bugprone-suspicious-string-compare in storage_deletion.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/storage/storage_deletion.c", + "tests/unit/test_t7_137.c", + "tests/unit/cmake/eng/t7_137.cmake", + "quality/evidence/T7.137.md" + ], + "source_paths": [ + "src/storage/storage_deletion.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Use equal, unequal, prefix-only and empty strings to prove the branch implements the intended comparison rather than pointer/boolean equality.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.137 --regex '^test_t7_137$'" + ], + "evidence": "quality/evidence/T7.137.md", + "finding_ids": [ + "CLANGTIDY-56955e0bf792f087" + ], + "rule_id": "bugprone-suspicious-string-compare", + "reproducers": [ + { + "id": "CLANGTIDY-56955e0bf792f087", + "path": "src/storage/storage_deletion.c", + "line": 341, + "fingerprint": "clang-tidy:bugprone-suspicious-string-compare:src/storage/storage_deletion.c:56955e0bf792f087", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.138", + "title": "bugprone-suspicious-string-compare in storage_migration.c", + "depends_on": [ + "T7", + "T13", + "T7.93" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/storage/storage_migration.c", + "tests/unit/test_t7_138.c", + "tests/unit/cmake/eng/t7_138.cmake", + "quality/evidence/T7.138.md" + ], + "source_paths": [ + "src/storage/storage_migration.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Use equal, unequal, prefix-only and empty strings to prove the branch implements the intended comparison rather than pointer/boolean equality.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.138 --regex '^test_t7_138$'" + ], + "evidence": "quality/evidence/T7.138.md", + "finding_ids": [ + "CLANGTIDY-d6379e87cfa699fa" + ], + "rule_id": "bugprone-suspicious-string-compare", + "reproducers": [ + { + "id": "CLANGTIDY-d6379e87cfa699fa", + "path": "src/storage/storage_migration.c", + "line": 575, + "fingerprint": "clang-tidy:bugprone-suspicious-string-compare:src/storage/storage_migration.c:d6379e87cfa699fa", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.139", + "title": "bugprone-suspicious-string-compare in storage_s3.c", + "depends_on": [ + "T7", + "T13", + "T7.94" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/storage/storage_s3.c", + "tests/unit/test_t7_139.c", + "tests/unit/cmake/eng/t7_139.cmake", + "quality/evidence/T7.139.md" + ], + "source_paths": [ + "src/storage/storage_s3.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Use equal, unequal, prefix-only and empty strings to prove the branch implements the intended comparison rather than pointer/boolean equality.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.139 --regex '^test_t7_139$'" + ], + "evidence": "quality/evidence/T7.139.md", + "finding_ids": [ + "CLANGTIDY-789d9f9254afa1b1", + "CLANGTIDY-2f98dec54b741594", + "CLANGTIDY-852f97f8aacc5432", + "CLANGTIDY-ba57287cdb3eb096", + "CLANGTIDY-bfbbf95e2bedfe38", + "CLANGTIDY-65cc9415acf1be4d", + "CLANGTIDY-5561b78de6be772b", + "CLANGTIDY-6b719694dd2640c7" + ], + "rule_id": "bugprone-suspicious-string-compare", + "reproducers": [ + { + "id": "CLANGTIDY-789d9f9254afa1b1", + "path": "src/storage/storage_s3.c", + "line": 113, + "fingerprint": "clang-tidy:bugprone-suspicious-string-compare:src/storage/storage_s3.c:789d9f9254afa1b1", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-2f98dec54b741594", + "path": "src/storage/storage_s3.c", + "line": 359, + "fingerprint": "clang-tidy:bugprone-suspicious-string-compare:src/storage/storage_s3.c:2f98dec54b741594", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-852f97f8aacc5432", + "path": "src/storage/storage_s3.c", + "line": 436, + "fingerprint": "clang-tidy:bugprone-suspicious-string-compare:src/storage/storage_s3.c:852f97f8aacc5432", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-ba57287cdb3eb096", + "path": "src/storage/storage_s3.c", + "line": 618, + "fingerprint": "clang-tidy:bugprone-suspicious-string-compare:src/storage/storage_s3.c:ba57287cdb3eb096", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-bfbbf95e2bedfe38", + "path": "src/storage/storage_s3.c", + "line": 686, + "fingerprint": "clang-tidy:bugprone-suspicious-string-compare:src/storage/storage_s3.c:bfbbf95e2bedfe38", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-65cc9415acf1be4d", + "path": "src/storage/storage_s3.c", + "line": 697, + "fingerprint": "clang-tidy:bugprone-suspicious-string-compare:src/storage/storage_s3.c:65cc9415acf1be4d", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-5561b78de6be772b", + "path": "src/storage/storage_s3.c", + "line": 697, + "fingerprint": "clang-tidy:bugprone-suspicious-string-compare:src/storage/storage_s3.c:5561b78de6be772b", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-6b719694dd2640c7", + "path": "src/storage/storage_s3.c", + "line": 697, + "fingerprint": "clang-tidy:bugprone-suspicious-string-compare:src/storage/storage_s3.c:6b719694dd2640c7", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.140", + "title": "bugprone-suspicious-string-compare in storage_source.c", + "depends_on": [ + "T7", + "T13", + "T7.110" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/storage/storage_source.c", + "tests/unit/test_t7_140.c", + "tests/unit/cmake/eng/t7_140.cmake", + "quality/evidence/T7.140.md" + ], + "source_paths": [ + "src/storage/storage_source.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Use equal, unequal, prefix-only and empty strings to prove the branch implements the intended comparison rather than pointer/boolean equality.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.140 --regex '^test_t7_140$'" + ], + "evidence": "quality/evidence/T7.140.md", + "finding_ids": [ + "CLANGTIDY-6a07b625f331b20e" + ], + "rule_id": "bugprone-suspicious-string-compare", + "reproducers": [ + { + "id": "CLANGTIDY-6a07b625f331b20e", + "path": "src/storage/storage_source.c", + "line": 187, + "fingerprint": "clang-tidy:bugprone-suspicious-string-compare:src/storage/storage_source.c:6a07b625f331b20e", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.141", + "title": "bugprone-suspicious-string-compare in recording_archive.c", + "depends_on": [ + "T7", + "T13", + "T7.109" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/web/recording_archive.c", + "tests/unit/test_t7_141.c", + "tests/unit/cmake/eng/t7_141.cmake", + "quality/evidence/T7.141.md" + ], + "source_paths": [ + "src/web/recording_archive.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Use equal, unequal, prefix-only and empty strings to prove the branch implements the intended comparison rather than pointer/boolean equality.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.141 --regex '^test_t7_141$'" + ], + "evidence": "quality/evidence/T7.141.md", + "finding_ids": [ + "CLANGTIDY-adf6edf7670e9010" + ], + "rule_id": "bugprone-suspicious-string-compare", + "reproducers": [ + { + "id": "CLANGTIDY-adf6edf7670e9010", + "path": "src/web/recording_archive.c", + "line": 201, + "fingerprint": "clang-tidy:bugprone-suspicious-string-compare:src/web/recording_archive.c:adf6edf7670e9010", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.142", + "title": "bugprone-unsafe-functions,cert-msc24-c,cert-msc33-c in storage_s3.c", + "depends_on": [ + "T7", + "T13", + "T7.139" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/storage/storage_s3.c", + "tests/unit/test_t7_142.c", + "tests/unit/cmake/eng/t7_142.cmake", + "quality/evidence/T7.142.md" + ], + "source_paths": [ + "src/storage/storage_s3.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.142 --regex '^test_t7_142$'" + ], + "evidence": "quality/evidence/T7.142.md", + "finding_ids": [ + "CLANGTIDY-3a081de1dd30ebb2" + ], + "rule_id": "bugprone-unsafe-functions,cert-msc24-c,cert-msc33-c", + "reproducers": [ + { + "id": "CLANGTIDY-3a081de1dd30ebb2", + "path": "src/storage/storage_s3.c", + "line": 757, + "fingerprint": "clang-tidy:bugprone-unsafe-functions,cert-msc24-c,cert-msc33-c:src/storage/storage_s3.c:3a081de1dd30ebb2", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.143", + "title": "cert-err34-c in linux_device_map.c, linux_hardware.c", + "depends_on": [ + "T7", + "T13", + "T7.135" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/telemetry/providers/linux_device_map.c", + "src/telemetry/providers/linux_hardware.c", + "tests/unit/test_t7_143.c", + "tests/unit/cmake/eng/t7_143.cmake", + "quality/evidence/T7.143.md" + ], + "source_paths": [ + "src/telemetry/providers/linux_device_map.c", + "src/telemetry/providers/linux_hardware.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise empty, trailing-junk, negative, out-of-range and valid numeric strings; conversion must check end pointer and range before applying configuration.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.143 --regex '^test_t7_143$'" + ], + "evidence": "quality/evidence/T7.143.md", + "finding_ids": [ + "CLANGTIDY-c52ffccc8c0fb590", + "CLANGTIDY-811ab08155776051" + ], + "rule_id": "cert-err34-c", + "reproducers": [ + { + "id": "CLANGTIDY-c52ffccc8c0fb590", + "path": "src/telemetry/providers/linux_device_map.c", + "line": 72, + "fingerprint": "clang-tidy:cert-err34-c:src/telemetry/providers/linux_device_map.c:c52ffccc8c0fb590", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-811ab08155776051", + "path": "src/telemetry/providers/linux_hardware.c", + "line": 309, + "fingerprint": "clang-tidy:cert-err34-c:src/telemetry/providers/linux_hardware.c:811ab08155776051", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.144", + "title": "cert-err34-c in ffmpeg_rss_guard.c", + "depends_on": [ + "T7", + "T13", + "T7.96" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/tools/ffmpeg_rss_guard.c", + "tests/unit/test_t7_144.c", + "tests/unit/cmake/eng/t7_144.cmake", + "quality/evidence/T7.144.md" + ], + "source_paths": [ + "src/tools/ffmpeg_rss_guard.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise empty, trailing-junk, negative, out-of-range and valid numeric strings; conversion must check end pointer and range before applying configuration.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.144 --regex '^test_t7_144$'" + ], + "evidence": "quality/evidence/T7.144.md", + "finding_ids": [ + "CLANGTIDY-11d1a497d98b8490" + ], + "rule_id": "cert-err34-c", + "reproducers": [ + { + "id": "CLANGTIDY-11d1a497d98b8490", + "path": "src/tools/ffmpeg_rss_guard.c", + "line": 73, + "fingerprint": "clang-tidy:cert-err34-c:src/tools/ffmpeg_rss_guard.c:11d1a497d98b8490", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.145", + "title": "cert-err34-c in go2rtc_integration.c, go2rtc_process.c", + "depends_on": [ + "T7", + "T13", + "T7.98", + "T7.60" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/video/go2rtc/go2rtc_integration.c", + "src/video/go2rtc/go2rtc_process.c", + "tests/unit/test_t7_145.c", + "tests/unit/cmake/eng/t7_145.cmake", + "quality/evidence/T7.145.md" + ], + "source_paths": [ + "src/video/go2rtc/go2rtc_integration.c", + "src/video/go2rtc/go2rtc_process.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise empty, trailing-junk, negative, out-of-range and valid numeric strings; conversion must check end pointer and range before applying configuration.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.145 --regex '^test_t7_145$'" + ], + "evidence": "quality/evidence/T7.145.md", + "finding_ids": [ + "CLANGTIDY-a7a71d348e2c49f5", + "CLANGTIDY-41876b44c3442c4b", + "CLANGTIDY-3a3cc8c9282e0fb5", + "CLANGTIDY-43d0d5170d6a8434" + ], + "rule_id": "cert-err34-c", + "reproducers": [ + { + "id": "CLANGTIDY-a7a71d348e2c49f5", + "path": "src/video/go2rtc/go2rtc_integration.c", + "line": 325, + "fingerprint": "clang-tidy:cert-err34-c:src/video/go2rtc/go2rtc_integration.c:a7a71d348e2c49f5", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-41876b44c3442c4b", + "path": "src/video/go2rtc/go2rtc_process.c", + "line": 248, + "fingerprint": "clang-tidy:cert-err34-c:src/video/go2rtc/go2rtc_process.c:41876b44c3442c4b", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-3a3cc8c9282e0fb5", + "path": "src/video/go2rtc/go2rtc_process.c", + "line": 291, + "fingerprint": "clang-tidy:cert-err34-c:src/video/go2rtc/go2rtc_process.c:3a3cc8c9282e0fb5", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-43d0d5170d6a8434", + "path": "src/video/go2rtc/go2rtc_process.c", + "line": 2094, + "fingerprint": "clang-tidy:cert-err34-c:src/video/go2rtc/go2rtc_process.c:43d0d5170d6a8434", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.146", + "title": "cert-err34-c in onvif_detection.c", + "depends_on": [ + "T7", + "T13", + "T7.100" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/video/onvif_detection.c", + "tests/unit/test_t7_146.c", + "tests/unit/cmake/eng/t7_146.cmake", + "quality/evidence/T7.146.md" + ], + "source_paths": [ + "src/video/onvif_detection.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise empty, trailing-junk, negative, out-of-range and valid numeric strings; conversion must check end pointer and range before applying configuration.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.146 --regex '^test_t7_146$'" + ], + "evidence": "quality/evidence/T7.146.md", + "finding_ids": [ + "CLANGTIDY-a6e1105b549e0cf0" + ], + "rule_id": "cert-err34-c", + "reproducers": [ + { + "id": "CLANGTIDY-a6e1105b549e0cf0", + "path": "src/video/onvif_detection.c", + "line": 525, + "fingerprint": "clang-tidy:cert-err34-c:src/video/onvif_detection.c:a6e1105b549e0cf0", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.147", + "title": "cert-err34-c in api_handlers_go2rtc_proxy.c", + "depends_on": [ + "T7", + "T13", + "T7.67" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_go2rtc_proxy.c", + "tests/unit/test_t7_147.c", + "tests/unit/cmake/eng/t7_147.cmake", + "quality/evidence/T7.147.md" + ], + "source_paths": [ + "src/web/api_handlers_go2rtc_proxy.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise empty, trailing-junk, negative, out-of-range and valid numeric strings; conversion must check end pointer and range before applying configuration.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.147 --regex '^test_t7_147$'" + ], + "evidence": "quality/evidence/T7.147.md", + "finding_ids": [ + "CLANGTIDY-ab5e571ba64af645" + ], + "rule_id": "cert-err34-c", + "reproducers": [ + { + "id": "CLANGTIDY-ab5e571ba64af645", + "path": "src/web/api_handlers_go2rtc_proxy.c", + "line": 203, + "fingerprint": "clang-tidy:cert-err34-c:src/web/api_handlers_go2rtc_proxy.c:ab5e571ba64af645", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.148", + "title": "cert-err34-c in api_handlers_investigations.c", + "depends_on": [ + "T7", + "T13", + "T7.102" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_investigations.c", + "tests/unit/test_t7_148.c", + "tests/unit/cmake/eng/t7_148.cmake", + "quality/evidence/T7.148.md" + ], + "source_paths": [ + "src/web/api_handlers_investigations.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise empty, trailing-junk, negative, out-of-range and valid numeric strings; conversion must check end pointer and range before applying configuration.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.148 --regex '^test_t7_148$'" + ], + "evidence": "quality/evidence/T7.148.md", + "finding_ids": [ + "CLANGTIDY-e5ec24184e5b758c" + ], + "rule_id": "cert-err34-c", + "reproducers": [ + { + "id": "CLANGTIDY-e5ec24184e5b758c", + "path": "src/web/api_handlers_investigations.c", + "line": 1019, + "fingerprint": "clang-tidy:cert-err34-c:src/web/api_handlers_investigations.c:e5ec24184e5b758c", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.149", + "title": "cert-err34-c in api_handlers_system_logs.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_system_logs.c", + "tests/unit/test_t7_149.c", + "tests/unit/cmake/eng/t7_149.cmake", + "quality/evidence/T7.149.md" + ], + "source_paths": [ + "src/web/api_handlers_system_logs.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise empty, trailing-junk, negative, out-of-range and valid numeric strings; conversion must check end pointer and range before applying configuration.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.149 --regex '^test_t7_149$'" + ], + "evidence": "quality/evidence/T7.149.md", + "finding_ids": [ + "CLANGTIDY-0fda904c59353043" + ], + "rule_id": "cert-err34-c", + "reproducers": [ + { + "id": "CLANGTIDY-0fda904c59353043", + "path": "src/web/api_handlers_system_logs.c", + "line": 111, + "fingerprint": "clang-tidy:cert-err34-c:src/web/api_handlers_system_logs.c:0fda904c59353043", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.150", + "title": "cert-err34-c in go2rtc_websocket.c", + "depends_on": [ + "T7", + "T13", + "T7.108" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/web/go2rtc_websocket.c", + "tests/unit/test_t7_150.c", + "tests/unit/cmake/eng/t7_150.cmake", + "quality/evidence/T7.150.md" + ], + "source_paths": [ + "src/web/go2rtc_websocket.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise empty, trailing-junk, negative, out-of-range and valid numeric strings; conversion must check end pointer and range before applying configuration.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.150 --regex '^test_t7_150$'" + ], + "evidence": "quality/evidence/T7.150.md", + "finding_ids": [ + "CLANGTIDY-5c42b38e8a9c25ff" + ], + "rule_id": "cert-err34-c", + "reproducers": [ + { + "id": "CLANGTIDY-5c42b38e8a9c25ff", + "path": "src/web/go2rtc_websocket.c", + "line": 261, + "fingerprint": "clang-tidy:cert-err34-c:src/web/go2rtc_websocket.c:5c42b38e8a9c25ff", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.151", + "title": "cert-int09-c in authorization.h", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "include/core/authorization.h", + "tests/unit/test_t7_151.c", + "tests/unit/cmake/eng/t7_151.cmake", + "quality/evidence/T7.151.md" + ], + "source_paths": [ + "include/core/authorization.h" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Verify enum constants remain representable and unique on the supported ABI without changing public numeric values.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.151 --regex '^test_t7_151$'" + ], + "evidence": "quality/evidence/T7.151.md", + "finding_ids": [ + "CLANGTIDY-1539a5c009afd0df" + ], + "rule_id": "cert-int09-c", + "reproducers": [ + { + "id": "CLANGTIDY-1539a5c009afd0df", + "path": "include/core/authorization.h", + "line": 15, + "fingerprint": "clang-tidy:cert-int09-c:include/core/authorization.h:1539a5c009afd0df", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.152", + "title": "cert-int09-c in faac.h", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_152-upstream.json", + "quality/evidence/T7.152.md" + ], + "source_paths": [ + "third_party/faac/include/faac.h" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Verify enum constants remain representable and unique on the supported ABI without changing public numeric values.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_152-upstream.json" + ], + "evidence": "quality/evidence/T7.152.md", + "finding_ids": [ + "CLANGTIDY-b6947bb24c18c8ac", + "CLANGTIDY-ddf685d0be472b86", + "CLANGTIDY-296d5f7499179bc0", + "CLANGTIDY-4c6957160cb5ae0c" + ], + "rule_id": "cert-int09-c", + "reproducers": [ + { + "id": "CLANGTIDY-b6947bb24c18c8ac", + "path": "third_party/faac/include/faac.h", + "line": 118, + "fingerprint": "clang-tidy:cert-int09-c:third_party/faac/include/faac.h:b6947bb24c18c8ac", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-ddf685d0be472b86", + "path": "third_party/faac/include/faac.h", + "line": 126, + "fingerprint": "clang-tidy:cert-int09-c:third_party/faac/include/faac.h:ddf685d0be472b86", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-296d5f7499179bc0", + "path": "third_party/faac/include/faac.h", + "line": 142, + "fingerprint": "clang-tidy:cert-int09-c:third_party/faac/include/faac.h:296d5f7499179bc0", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-4c6957160cb5ae0c", + "path": "third_party/faac/include/faac.h", + "line": 151, + "fingerprint": "clang-tidy:cert-int09-c:third_party/faac/include/faac.h:4c6957160cb5ae0c", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.153", + "title": "clang-analyzer-deadcode.DeadStores in db_system_health_incidents.c", + "depends_on": [ + "T7", + "T13", + "T7.79" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/database/db_system_health_incidents.c", + "tests/unit/test_t7_153.c", + "tests/unit/cmake/eng/t7_153.cmake", + "quality/evidence/T7.153.md" + ], + "source_paths": [ + "src/database/db_system_health_incidents.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.153 --regex '^test_t7_153$'" + ], + "evidence": "quality/evidence/T7.153.md", + "finding_ids": [ + "CLANGTIDY-fe8af642c27ce051" + ], + "rule_id": "clang-analyzer-deadcode.DeadStores", + "reproducers": [ + { + "id": "CLANGTIDY-fe8af642c27ce051", + "path": "src/database/db_system_health_incidents.c", + "line": 531, + "fingerprint": "clang-tidy:clang-analyzer-deadcode.DeadStores:src/database/db_system_health_incidents.c:fe8af642c27ce051", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.154", + "title": "clang-analyzer-deadcode.DeadStores in go2rtc_integration.c", + "depends_on": [ + "T7", + "T13", + "T7.145" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/video/go2rtc/go2rtc_integration.c", + "tests/unit/test_t7_154.c", + "tests/unit/cmake/eng/t7_154.cmake", + "quality/evidence/T7.154.md" + ], + "source_paths": [ + "src/video/go2rtc/go2rtc_integration.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.154 --regex '^test_t7_154$'" + ], + "evidence": "quality/evidence/T7.154.md", + "finding_ids": [ + "CLANGTIDY-88fbdf8930f67549" + ], + "rule_id": "clang-analyzer-deadcode.DeadStores", + "reproducers": [ + { + "id": "CLANGTIDY-88fbdf8930f67549", + "path": "src/video/go2rtc/go2rtc_integration.c", + "line": 1334, + "fingerprint": "clang-tidy:clang-analyzer-deadcode.DeadStores:src/video/go2rtc/go2rtc_integration.c:88fbdf8930f67549", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.155", + "title": "clang-analyzer-deadcode.DeadStores in mp4_segment_recorder.c", + "depends_on": [ + "T7", + "T13", + "T7.119" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/video/mp4_segment_recorder.c", + "tests/unit/test_t7_155.c", + "tests/unit/cmake/eng/t7_155.cmake", + "quality/evidence/T7.155.md" + ], + "source_paths": [ + "src/video/mp4_segment_recorder.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.155 --regex '^test_t7_155$'" + ], + "evidence": "quality/evidence/T7.155.md", + "finding_ids": [ + "CLANGTIDY-27ac318897664d8a" + ], + "rule_id": "clang-analyzer-deadcode.DeadStores", + "reproducers": [ + { + "id": "CLANGTIDY-27ac318897664d8a", + "path": "src/video/mp4_segment_recorder.c", + "line": 1772, + "fingerprint": "clang-tidy:clang-analyzer-deadcode.DeadStores:src/video/mp4_segment_recorder.c:27ac318897664d8a", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.156", + "title": "clang-analyzer-deadcode.DeadStores in onvif_ptz.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/video/onvif_ptz.c", + "tests/unit/test_t7_156.c", + "tests/unit/cmake/eng/t7_156.cmake", + "quality/evidence/T7.156.md" + ], + "source_paths": [ + "src/video/onvif_ptz.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.156 --regex '^test_t7_156$'" + ], + "evidence": "quality/evidence/T7.156.md", + "finding_ids": [ + "CLANGTIDY-7d7d3a3c4f1824bd" + ], + "rule_id": "clang-analyzer-deadcode.DeadStores", + "reproducers": [ + { + "id": "CLANGTIDY-7d7d3a3c4f1824bd", + "path": "src/video/onvif_ptz.c", + "line": 509, + "fingerprint": "clang-tidy:clang-analyzer-deadcode.DeadStores:src/video/onvif_ptz.c:7d7d3a3c4f1824bd", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.157", + "title": "clang-analyzer-deadcode.DeadStores in recording_path.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/video/recording_path.c", + "tests/unit/test_t7_157.c", + "tests/unit/cmake/eng/t7_157.cmake", + "quality/evidence/T7.157.md" + ], + "source_paths": [ + "src/video/recording_path.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.157 --regex '^test_t7_157$'" + ], + "evidence": "quality/evidence/T7.157.md", + "finding_ids": [ + "CLANGTIDY-44c350a8b7e2fd4a", + "CLANGTIDY-a7fa9aad275f9425" + ], + "rule_id": "clang-analyzer-deadcode.DeadStores", + "reproducers": [ + { + "id": "CLANGTIDY-44c350a8b7e2fd4a", + "path": "src/video/recording_path.c", + "line": 28, + "fingerprint": "clang-tidy:clang-analyzer-deadcode.DeadStores:src/video/recording_path.c:44c350a8b7e2fd4a", + "original_count": 1, + "scanner": "clang-tidy" + }, + { + "id": "CLANGTIDY-a7fa9aad275f9425", + "path": "src/video/recording_path.c", + "line": 147, + "fingerprint": "clang-tidy:clang-analyzer-deadcode.DeadStores:src/video/recording_path.c:a7fa9aad275f9425", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.158", + "title": "clang-analyzer-deadcode.DeadStores in api_handlers_health.c", + "depends_on": [ + "T7", + "T13", + "T7.44" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_health.c", + "tests/unit/test_t7_158.c", + "tests/unit/cmake/eng/t7_158.cmake", + "quality/evidence/T7.158.md" + ], + "source_paths": [ + "src/web/api_handlers_health.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.158 --regex '^test_t7_158$'" + ], + "evidence": "quality/evidence/T7.158.md", + "finding_ids": [ + "CLANGTIDY-cf5f09b5a02a9bca" + ], + "rule_id": "clang-analyzer-deadcode.DeadStores", + "reproducers": [ + { + "id": "CLANGTIDY-cf5f09b5a02a9bca", + "path": "src/web/api_handlers_health.c", + "line": 407, + "fingerprint": "clang-tidy:clang-analyzer-deadcode.DeadStores:src/web/api_handlers_health.c:cf5f09b5a02a9bca", + "original_count": 1, + "scanner": "clang-tidy" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.159", + "title": "invalidPointerCast in sod.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_159-upstream.json", + "quality/evidence/T7.159.md" + ], + "source_paths": [ + "src/sod/sod.c" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_159-upstream.json" + ], + "evidence": "quality/evidence/T7.159.md", + "finding_ids": [ + "CPPCHECK-7975c2d572bc32c0", + "CPPCHECK-291bebc3b95eca4e" + ], + "rule_id": "invalidPointerCast", + "reproducers": [ + { + "id": "CPPCHECK-7975c2d572bc32c0", + "path": "src/sod/sod.c", + "line": 13588, + "fingerprint": "cppcheck:invalidPointerCast:src/sod/sod.c:7975c2d572bc32c0", + "original_count": 1, + "scanner": "cppcheck" + }, + { + "id": "CPPCHECK-291bebc3b95eca4e", + "path": "src/sod/sod.c", + "line": 13591, + "fingerprint": "cppcheck:invalidPointerCast:src/sod/sod.c:291bebc3b95eca4e", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.160", + "title": "jsx-a11y/anchor-is-valid in Header.jsx", + "depends_on": [ + "T7", + "T10" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/Header.jsx", + "web/tests/remediation/t7_160.spec.jsx", + "quality/evidence/T7.160.md" + ], + "source_paths": [ + "web/js/components/preact/Header.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Use valid navigable hrefs for links and buttons for actions; verify keyboard behavior and no unexpected page navigation.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_160", + "mkdir -p build/eng-artifacts/T7.160", + "web/node_modules/.bin/eslint web/js/components/preact/Header.jsx --format json --output-file build/eng-artifacts/T7.160/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.160/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/anchor-is-valid'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.160.md", + "finding_ids": [ + "ESLINT-BUCKET-366138c5d194685c" + ], + "rule_id": "jsx-a11y/anchor-is-valid", + "reproducers": [ + { + "id": "ESLINT-BUCKET-366138c5d194685c", + "path": "web/js/components/preact/Header.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/anchor-is-valid:web/js/components/preact/Header.jsx", + "original_count": 1, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.161", + "title": "jsx-a11y/click-events-have-key-events in GridPicker.jsx, HLSVideoCell.jsx, HealthView.jsx, MSEVideoCell.jsx, StreamCard.jsx, StreamsView.jsx", + "depends_on": [ + "T7", + "T10" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/GridPicker.jsx", + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/HealthView.jsx", + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/StreamCard.jsx", + "web/js/components/preact/StreamsView.jsx", + "web/tests/remediation/t7_161.spec.jsx", + "quality/evidence/T7.161.md" + ], + "source_paths": [ + "web/js/components/preact/GridPicker.jsx", + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/HealthView.jsx", + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/StreamCard.jsx", + "web/js/components/preact/StreamsView.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Assert Enter and Space activation where the control semantics require it, focus visibility, no double dispatch, and unchanged pointer interaction.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_161", + "mkdir -p build/eng-artifacts/T7.161", + "web/node_modules/.bin/eslint web/js/components/preact/GridPicker.jsx web/js/components/preact/HLSVideoCell.jsx web/js/components/preact/HealthView.jsx web/js/components/preact/MSEVideoCell.jsx web/js/components/preact/StreamCard.jsx web/js/components/preact/StreamsView.jsx --format json --output-file build/eng-artifacts/T7.161/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.161/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/click-events-have-key-events'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.161.md", + "finding_ids": [ + "ESLINT-BUCKET-ed278d9594c2abdb", + "ESLINT-BUCKET-67fcff31d1a4cf75", + "ESLINT-BUCKET-a642f51dfd2a124a", + "ESLINT-BUCKET-404de092ea97cc43", + "ESLINT-BUCKET-6243e36ec0fdb5cd", + "ESLINT-BUCKET-5c63d53fbef3ba6d" + ], + "rule_id": "jsx-a11y/click-events-have-key-events", + "reproducers": [ + { + "id": "ESLINT-BUCKET-ed278d9594c2abdb", + "path": "web/js/components/preact/GridPicker.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/GridPicker.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-67fcff31d1a4cf75", + "path": "web/js/components/preact/HLSVideoCell.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/HLSVideoCell.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-a642f51dfd2a124a", + "path": "web/js/components/preact/HealthView.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/HealthView.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-404de092ea97cc43", + "path": "web/js/components/preact/MSEVideoCell.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/MSEVideoCell.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-6243e36ec0fdb5cd", + "path": "web/js/components/preact/StreamCard.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/StreamCard.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-5c63d53fbef3ba6d", + "path": "web/js/components/preact/StreamsView.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/StreamsView.jsx", + "original_count": 2, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.162", + "title": "jsx-a11y/click-events-have-key-events in ToastContainer.jsx, UI.jsx, WebRTCVideoCell.jsx, ZoneEditor.jsx, LanguageSelector.jsx, ModalDialog.jsx", + "depends_on": [ + "T7", + "T10" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/UI.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx", + "web/js/components/preact/ZoneEditor.jsx", + "web/js/components/preact/common/LanguageSelector.jsx", + "web/js/components/preact/common/ModalDialog.jsx", + "web/tests/remediation/t7_162.spec.jsx", + "quality/evidence/T7.162.md" + ], + "source_paths": [ + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/UI.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx", + "web/js/components/preact/ZoneEditor.jsx", + "web/js/components/preact/common/LanguageSelector.jsx", + "web/js/components/preact/common/ModalDialog.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Assert Enter and Space activation where the control semantics require it, focus visibility, no double dispatch, and unchanged pointer interaction.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_162", + "mkdir -p build/eng-artifacts/T7.162", + "web/node_modules/.bin/eslint web/js/components/preact/ToastContainer.jsx web/js/components/preact/UI.jsx web/js/components/preact/WebRTCVideoCell.jsx web/js/components/preact/ZoneEditor.jsx web/js/components/preact/common/LanguageSelector.jsx web/js/components/preact/common/ModalDialog.jsx --format json --output-file build/eng-artifacts/T7.162/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.162/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/click-events-have-key-events'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.162.md", + "finding_ids": [ + "ESLINT-BUCKET-ab2c863c82952346", + "ESLINT-BUCKET-f53a71c368c33ab9", + "ESLINT-BUCKET-45887456841ead8b", + "ESLINT-BUCKET-cb235968867c79e3", + "ESLINT-BUCKET-02418efc105b6ab9", + "ESLINT-BUCKET-4e8530c09d5fd082" + ], + "rule_id": "jsx-a11y/click-events-have-key-events", + "reproducers": [ + { + "id": "ESLINT-BUCKET-ab2c863c82952346", + "path": "web/js/components/preact/ToastContainer.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/ToastContainer.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-f53a71c368c33ab9", + "path": "web/js/components/preact/UI.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/UI.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-45887456841ead8b", + "path": "web/js/components/preact/WebRTCVideoCell.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/WebRTCVideoCell.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-cb235968867c79e3", + "path": "web/js/components/preact/ZoneEditor.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/ZoneEditor.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-02418efc105b6ab9", + "path": "web/js/components/preact/common/LanguageSelector.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/common/LanguageSelector.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-4e8530c09d5fd082", + "path": "web/js/components/preact/common/ModalDialog.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/common/ModalDialog.jsx", + "original_count": 1, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.163", + "title": "jsx-a11y/click-events-have-key-events in LiveOperatorNavigator.jsx, RecordingsGrid.jsx, Go2rtcTab.jsx, ClearLogsModal.jsx, RestartModal.jsx, TimelinePlayer.jsx", + "depends_on": [ + "T7", + "T10" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/live/LiveOperatorNavigator.jsx", + "web/js/components/preact/recordings/RecordingsGrid.jsx", + "web/js/components/preact/settings/Go2rtcTab.jsx", + "web/js/components/preact/system/ClearLogsModal.jsx", + "web/js/components/preact/system/RestartModal.jsx", + "web/js/components/preact/timeline/TimelinePlayer.jsx", + "web/tests/remediation/t7_163.spec.jsx", + "quality/evidence/T7.163.md" + ], + "source_paths": [ + "web/js/components/preact/live/LiveOperatorNavigator.jsx", + "web/js/components/preact/recordings/RecordingsGrid.jsx", + "web/js/components/preact/settings/Go2rtcTab.jsx", + "web/js/components/preact/system/ClearLogsModal.jsx", + "web/js/components/preact/system/RestartModal.jsx", + "web/js/components/preact/timeline/TimelinePlayer.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Assert Enter and Space activation where the control semantics require it, focus visibility, no double dispatch, and unchanged pointer interaction.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_163", + "mkdir -p build/eng-artifacts/T7.163", + "web/node_modules/.bin/eslint web/js/components/preact/live/LiveOperatorNavigator.jsx web/js/components/preact/recordings/RecordingsGrid.jsx web/js/components/preact/settings/Go2rtcTab.jsx web/js/components/preact/system/ClearLogsModal.jsx web/js/components/preact/system/RestartModal.jsx web/js/components/preact/timeline/TimelinePlayer.jsx --format json --output-file build/eng-artifacts/T7.163/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.163/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/click-events-have-key-events'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.163.md", + "finding_ids": [ + "ESLINT-BUCKET-f16c5e93d86bc6f9", + "ESLINT-BUCKET-41381cd9bd64279e", + "ESLINT-BUCKET-422485a76dc61a9b", + "ESLINT-BUCKET-44ea0e63c82a7151", + "ESLINT-BUCKET-155480cbfd270011", + "ESLINT-BUCKET-79b6e7adf4959fbc" + ], + "rule_id": "jsx-a11y/click-events-have-key-events", + "reproducers": [ + { + "id": "ESLINT-BUCKET-f16c5e93d86bc6f9", + "path": "web/js/components/preact/live/LiveOperatorNavigator.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/live/LiveOperatorNavigator.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-41381cd9bd64279e", + "path": "web/js/components/preact/recordings/RecordingsGrid.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/recordings/RecordingsGrid.jsx", + "original_count": 3, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-422485a76dc61a9b", + "path": "web/js/components/preact/settings/Go2rtcTab.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/settings/Go2rtcTab.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-44ea0e63c82a7151", + "path": "web/js/components/preact/system/ClearLogsModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/system/ClearLogsModal.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-155480cbfd270011", + "path": "web/js/components/preact/system/RestartModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/system/RestartModal.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-79b6e7adf4959fbc", + "path": "web/js/components/preact/timeline/TimelinePlayer.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/timeline/TimelinePlayer.jsx", + "original_count": 1, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.164", + "title": "jsx-a11y/click-events-have-key-events in AccessPolicyModal.jsx, AddUserModal.jsx, ApiKeyModal.jsx, AuditHistoryModal.jsx, DeleteUserModal.jsx, EditUserModal.jsx", + "depends_on": [ + "T7", + "T10" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/users/AccessPolicyModal.jsx", + "web/js/components/preact/users/AddUserModal.jsx", + "web/js/components/preact/users/ApiKeyModal.jsx", + "web/js/components/preact/users/AuditHistoryModal.jsx", + "web/js/components/preact/users/DeleteUserModal.jsx", + "web/js/components/preact/users/EditUserModal.jsx", + "web/tests/remediation/t7_164.spec.jsx", + "quality/evidence/T7.164.md" + ], + "source_paths": [ + "web/js/components/preact/users/AccessPolicyModal.jsx", + "web/js/components/preact/users/AddUserModal.jsx", + "web/js/components/preact/users/ApiKeyModal.jsx", + "web/js/components/preact/users/AuditHistoryModal.jsx", + "web/js/components/preact/users/DeleteUserModal.jsx", + "web/js/components/preact/users/EditUserModal.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Assert Enter and Space activation where the control semantics require it, focus visibility, no double dispatch, and unchanged pointer interaction.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_164", + "mkdir -p build/eng-artifacts/T7.164", + "web/node_modules/.bin/eslint web/js/components/preact/users/AccessPolicyModal.jsx web/js/components/preact/users/AddUserModal.jsx web/js/components/preact/users/ApiKeyModal.jsx web/js/components/preact/users/AuditHistoryModal.jsx web/js/components/preact/users/DeleteUserModal.jsx web/js/components/preact/users/EditUserModal.jsx --format json --output-file build/eng-artifacts/T7.164/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.164/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/click-events-have-key-events'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.164.md", + "finding_ids": [ + "ESLINT-BUCKET-0a786d21e1ee7bd2", + "ESLINT-BUCKET-c2dc58af6543d1f5", + "ESLINT-BUCKET-3b71a4c47dfd1075", + "ESLINT-BUCKET-ea11ae604e62541e", + "ESLINT-BUCKET-8d573ae471211e73", + "ESLINT-BUCKET-22666b8c08cd887e" + ], + "rule_id": "jsx-a11y/click-events-have-key-events", + "reproducers": [ + { + "id": "ESLINT-BUCKET-0a786d21e1ee7bd2", + "path": "web/js/components/preact/users/AccessPolicyModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/users/AccessPolicyModal.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-c2dc58af6543d1f5", + "path": "web/js/components/preact/users/AddUserModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/users/AddUserModal.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-3b71a4c47dfd1075", + "path": "web/js/components/preact/users/ApiKeyModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/users/ApiKeyModal.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-ea11ae604e62541e", + "path": "web/js/components/preact/users/AuditHistoryModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/users/AuditHistoryModal.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-8d573ae471211e73", + "path": "web/js/components/preact/users/DeleteUserModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/users/DeleteUserModal.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-22666b8c08cd887e", + "path": "web/js/components/preact/users/EditUserModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/users/EditUserModal.jsx", + "original_count": 1, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.165", + "title": "jsx-a11y/click-events-have-key-events in RoleManagerModal.jsx, TotpSetupModal.jsx", + "depends_on": [ + "T7", + "T10" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/users/RoleManagerModal.jsx", + "web/js/components/preact/users/TotpSetupModal.jsx", + "web/tests/remediation/t7_165.spec.jsx", + "quality/evidence/T7.165.md" + ], + "source_paths": [ + "web/js/components/preact/users/RoleManagerModal.jsx", + "web/js/components/preact/users/TotpSetupModal.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Assert Enter and Space activation where the control semantics require it, focus visibility, no double dispatch, and unchanged pointer interaction.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_165", + "mkdir -p build/eng-artifacts/T7.165", + "web/node_modules/.bin/eslint web/js/components/preact/users/RoleManagerModal.jsx web/js/components/preact/users/TotpSetupModal.jsx --format json --output-file build/eng-artifacts/T7.165/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.165/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/click-events-have-key-events'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.165.md", + "finding_ids": [ + "ESLINT-BUCKET-9190884804c0c65d", + "ESLINT-BUCKET-e8ce699e42be07b3" + ], + "rule_id": "jsx-a11y/click-events-have-key-events", + "reproducers": [ + { + "id": "ESLINT-BUCKET-9190884804c0c65d", + "path": "web/js/components/preact/users/RoleManagerModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/users/RoleManagerModal.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-e8ce699e42be07b3", + "path": "web/js/components/preact/users/TotpSetupModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/users/TotpSetupModal.jsx", + "original_count": 2, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.166", + "title": "jsx-a11y/control-has-associated-label in AuthGate.jsx, BatchDownloadModal.jsx, DetectionOverlay.jsx, FleetView.jsx, FullscreenManager.jsx, HLSVideoCell.jsx", + "depends_on": [ + "T7", + "T10", + "T7.161" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/AuthGate.jsx", + "web/js/components/preact/BatchDownloadModal.jsx", + "web/js/components/preact/DetectionOverlay.jsx", + "web/js/components/preact/FleetView.jsx", + "web/js/components/preact/FullscreenManager.jsx", + "web/js/components/preact/HLSVideoCell.jsx", + "web/tests/remediation/t7_166.spec.jsx", + "quality/evidence/T7.166.md" + ], + "source_paths": [ + "web/js/components/preact/AuthGate.jsx", + "web/js/components/preact/BatchDownloadModal.jsx", + "web/js/components/preact/DetectionOverlay.jsx", + "web/js/components/preact/FleetView.jsx", + "web/js/components/preact/FullscreenManager.jsx", + "web/js/components/preact/HLSVideoCell.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Render each reported control and assert a stable accessible name, including icon-only actions, without relying on title alone; retain localized labels and original action callbacks.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_166", + "mkdir -p build/eng-artifacts/T7.166", + "web/node_modules/.bin/eslint web/js/components/preact/AuthGate.jsx web/js/components/preact/BatchDownloadModal.jsx web/js/components/preact/DetectionOverlay.jsx web/js/components/preact/FleetView.jsx web/js/components/preact/FullscreenManager.jsx web/js/components/preact/HLSVideoCell.jsx --format json --output-file build/eng-artifacts/T7.166/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.166/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/control-has-associated-label'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.166.md", + "finding_ids": [ + "ESLINT-BUCKET-0f4bbeb4ab715fee", + "ESLINT-BUCKET-ef00a494fd69875c", + "ESLINT-BUCKET-e93ca9cb727a0aee", + "ESLINT-BUCKET-20e1a03b32e40002", + "ESLINT-BUCKET-e7e0cc4f8fd4c513", + "ESLINT-BUCKET-aa839344c6e5b30d" + ], + "rule_id": "jsx-a11y/control-has-associated-label", + "reproducers": [ + { + "id": "ESLINT-BUCKET-0f4bbeb4ab715fee", + "path": "web/js/components/preact/AuthGate.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/AuthGate.jsx", + "original_count": 3, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-ef00a494fd69875c", + "path": "web/js/components/preact/BatchDownloadModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/BatchDownloadModal.jsx", + "original_count": 3, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-e93ca9cb727a0aee", + "path": "web/js/components/preact/DetectionOverlay.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/DetectionOverlay.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-20e1a03b32e40002", + "path": "web/js/components/preact/FleetView.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/FleetView.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-e7e0cc4f8fd4c513", + "path": "web/js/components/preact/FullscreenManager.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/FullscreenManager.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-aa839344c6e5b30d", + "path": "web/js/components/preact/HLSVideoCell.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/HLSVideoCell.jsx", + "original_count": 3, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.167", + "title": "jsx-a11y/control-has-associated-label in LiveView.jsx, LoginView.jsx, MSEVideoCell.jsx, SetupWizard.jsx, SnapshotManager.jsx, StreamConfigModal.jsx", + "depends_on": [ + "T7", + "T10", + "T7.161" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/LiveView.jsx", + "web/js/components/preact/LoginView.jsx", + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/SetupWizard.jsx", + "web/js/components/preact/SnapshotManager.jsx", + "web/js/components/preact/StreamConfigModal.jsx", + "web/tests/remediation/t7_167.spec.jsx", + "quality/evidence/T7.167.md" + ], + "source_paths": [ + "web/js/components/preact/LiveView.jsx", + "web/js/components/preact/LoginView.jsx", + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/SetupWizard.jsx", + "web/js/components/preact/SnapshotManager.jsx", + "web/js/components/preact/StreamConfigModal.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Render each reported control and assert a stable accessible name, including icon-only actions, without relying on title alone; retain localized labels and original action callbacks.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_167", + "mkdir -p build/eng-artifacts/T7.167", + "web/node_modules/.bin/eslint web/js/components/preact/LiveView.jsx web/js/components/preact/LoginView.jsx web/js/components/preact/MSEVideoCell.jsx web/js/components/preact/SetupWizard.jsx web/js/components/preact/SnapshotManager.jsx web/js/components/preact/StreamConfigModal.jsx --format json --output-file build/eng-artifacts/T7.167/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.167/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/control-has-associated-label'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.167.md", + "finding_ids": [ + "ESLINT-BUCKET-ae74d74f4f8f96b4", + "ESLINT-BUCKET-33c31857a85153c5", + "ESLINT-BUCKET-2b401ef7608cff74", + "ESLINT-BUCKET-6b623e0db3f455c7", + "ESLINT-BUCKET-63e9c68b97a2b704", + "ESLINT-BUCKET-3d882f111ea61422" + ], + "rule_id": "jsx-a11y/control-has-associated-label", + "reproducers": [ + { + "id": "ESLINT-BUCKET-ae74d74f4f8f96b4", + "path": "web/js/components/preact/LiveView.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/LiveView.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-33c31857a85153c5", + "path": "web/js/components/preact/LoginView.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/LoginView.jsx", + "original_count": 6, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-2b401ef7608cff74", + "path": "web/js/components/preact/MSEVideoCell.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/MSEVideoCell.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-6b623e0db3f455c7", + "path": "web/js/components/preact/SetupWizard.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/SetupWizard.jsx", + "original_count": 5, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-63e9c68b97a2b704", + "path": "web/js/components/preact/SnapshotManager.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/SnapshotManager.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-3d882f111ea61422", + "path": "web/js/components/preact/StreamConfigModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/StreamConfigModal.jsx", + "original_count": 53, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.168", + "title": "jsx-a11y/control-has-associated-label in StreamsView.jsx, ThemeCustomizer.jsx, UI.jsx, WebRTCVideoCell.jsx, ZoneEditor.jsx, ModalDialog.jsx", + "depends_on": [ + "T7", + "T10", + "T7.161", + "T7.162" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/StreamsView.jsx", + "web/js/components/preact/ThemeCustomizer.jsx", + "web/js/components/preact/UI.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx", + "web/js/components/preact/ZoneEditor.jsx", + "web/js/components/preact/common/ModalDialog.jsx", + "web/tests/remediation/t7_168.spec.jsx", + "quality/evidence/T7.168.md" + ], + "source_paths": [ + "web/js/components/preact/StreamsView.jsx", + "web/js/components/preact/ThemeCustomizer.jsx", + "web/js/components/preact/UI.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx", + "web/js/components/preact/ZoneEditor.jsx", + "web/js/components/preact/common/ModalDialog.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Render each reported control and assert a stable accessible name, including icon-only actions, without relying on title alone; retain localized labels and original action callbacks.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_168", + "mkdir -p build/eng-artifacts/T7.168", + "web/node_modules/.bin/eslint web/js/components/preact/StreamsView.jsx web/js/components/preact/ThemeCustomizer.jsx web/js/components/preact/UI.jsx web/js/components/preact/WebRTCVideoCell.jsx web/js/components/preact/ZoneEditor.jsx web/js/components/preact/common/ModalDialog.jsx --format json --output-file build/eng-artifacts/T7.168/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.168/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/control-has-associated-label'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.168.md", + "finding_ids": [ + "ESLINT-BUCKET-ba71da8483425ebf", + "ESLINT-BUCKET-6ffa955639ab6418", + "ESLINT-BUCKET-6faae6bddf434aab", + "ESLINT-BUCKET-9bd9a8994dceced4", + "ESLINT-BUCKET-e845a2e465702318", + "ESLINT-BUCKET-1f35f119bab13f92" + ], + "rule_id": "jsx-a11y/control-has-associated-label", + "reproducers": [ + { + "id": "ESLINT-BUCKET-ba71da8483425ebf", + "path": "web/js/components/preact/StreamsView.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/StreamsView.jsx", + "original_count": 6, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-6ffa955639ab6418", + "path": "web/js/components/preact/ThemeCustomizer.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/ThemeCustomizer.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-6faae6bddf434aab", + "path": "web/js/components/preact/UI.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/UI.jsx", + "original_count": 4, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-9bd9a8994dceced4", + "path": "web/js/components/preact/WebRTCVideoCell.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/WebRTCVideoCell.jsx", + "original_count": 3, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-e845a2e465702318", + "path": "web/js/components/preact/ZoneEditor.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/ZoneEditor.jsx", + "original_count": 4, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-1f35f119bab13f92", + "path": "web/js/components/preact/common/ModalDialog.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/common/ModalDialog.jsx", + "original_count": 2, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.169", + "title": "jsx-a11y/control-has-associated-label in EventDestinationEditor.jsx, EventRouteEditor.jsx, BulkOrganizeModal.jsx, CollectionManager.jsx, CollectionSelectorBuilder.jsx, FleetFilters.jsx", + "depends_on": [ + "T7", + "T10" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/events/EventDestinationEditor.jsx", + "web/js/components/preact/events/EventRouteEditor.jsx", + "web/js/components/preact/fleet/BulkOrganizeModal.jsx", + "web/js/components/preact/fleet/CollectionManager.jsx", + "web/js/components/preact/fleet/CollectionSelectorBuilder.jsx", + "web/js/components/preact/fleet/FleetFilters.jsx", + "web/tests/remediation/t7_169.spec.jsx", + "quality/evidence/T7.169.md" + ], + "source_paths": [ + "web/js/components/preact/events/EventDestinationEditor.jsx", + "web/js/components/preact/events/EventRouteEditor.jsx", + "web/js/components/preact/fleet/BulkOrganizeModal.jsx", + "web/js/components/preact/fleet/CollectionManager.jsx", + "web/js/components/preact/fleet/CollectionSelectorBuilder.jsx", + "web/js/components/preact/fleet/FleetFilters.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Render each reported control and assert a stable accessible name, including icon-only actions, without relying on title alone; retain localized labels and original action callbacks.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_169", + "mkdir -p build/eng-artifacts/T7.169", + "web/node_modules/.bin/eslint web/js/components/preact/events/EventDestinationEditor.jsx web/js/components/preact/events/EventRouteEditor.jsx web/js/components/preact/fleet/BulkOrganizeModal.jsx web/js/components/preact/fleet/CollectionManager.jsx web/js/components/preact/fleet/CollectionSelectorBuilder.jsx web/js/components/preact/fleet/FleetFilters.jsx --format json --output-file build/eng-artifacts/T7.169/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.169/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/control-has-associated-label'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.169.md", + "finding_ids": [ + "ESLINT-BUCKET-5088d976b993e707", + "ESLINT-BUCKET-fea403cece7fffa3", + "ESLINT-BUCKET-20d0442e85244a5d", + "ESLINT-BUCKET-03b8b95f3bd44235", + "ESLINT-BUCKET-993ef9a219cc29a2", + "ESLINT-BUCKET-eaa9041228587f50" + ], + "rule_id": "jsx-a11y/control-has-associated-label", + "reproducers": [ + { + "id": "ESLINT-BUCKET-5088d976b993e707", + "path": "web/js/components/preact/events/EventDestinationEditor.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/events/EventDestinationEditor.jsx", + "original_count": 15, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-fea403cece7fffa3", + "path": "web/js/components/preact/events/EventRouteEditor.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/events/EventRouteEditor.jsx", + "original_count": 20, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-20d0442e85244a5d", + "path": "web/js/components/preact/fleet/BulkOrganizeModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/fleet/BulkOrganizeModal.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-03b8b95f3bd44235", + "path": "web/js/components/preact/fleet/CollectionManager.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/fleet/CollectionManager.jsx", + "original_count": 3, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-993ef9a219cc29a2", + "path": "web/js/components/preact/fleet/CollectionSelectorBuilder.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/fleet/CollectionSelectorBuilder.jsx", + "original_count": 4, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-eaa9041228587f50", + "path": "web/js/components/preact/fleet/FleetFilters.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/fleet/FleetFilters.jsx", + "original_count": 1, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.170", + "title": "jsx-a11y/control-has-associated-label in OrganizationManager.jsx, SavedViewsBar.jsx, StaticCollectionMembers.jsx, InvestigationActions.jsx, InvestigationBookmarks.jsx, InvestigationView.jsx", + "depends_on": [ + "T7", + "T10" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/fleet/OrganizationManager.jsx", + "web/js/components/preact/fleet/SavedViewsBar.jsx", + "web/js/components/preact/fleet/StaticCollectionMembers.jsx", + "web/js/components/preact/investigation/InvestigationActions.jsx", + "web/js/components/preact/investigation/InvestigationBookmarks.jsx", + "web/js/components/preact/investigation/InvestigationView.jsx", + "web/tests/remediation/t7_170.spec.jsx", + "quality/evidence/T7.170.md" + ], + "source_paths": [ + "web/js/components/preact/fleet/OrganizationManager.jsx", + "web/js/components/preact/fleet/SavedViewsBar.jsx", + "web/js/components/preact/fleet/StaticCollectionMembers.jsx", + "web/js/components/preact/investigation/InvestigationActions.jsx", + "web/js/components/preact/investigation/InvestigationBookmarks.jsx", + "web/js/components/preact/investigation/InvestigationView.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Render each reported control and assert a stable accessible name, including icon-only actions, without relying on title alone; retain localized labels and original action callbacks.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_170", + "mkdir -p build/eng-artifacts/T7.170", + "web/node_modules/.bin/eslint web/js/components/preact/fleet/OrganizationManager.jsx web/js/components/preact/fleet/SavedViewsBar.jsx web/js/components/preact/fleet/StaticCollectionMembers.jsx web/js/components/preact/investigation/InvestigationActions.jsx web/js/components/preact/investigation/InvestigationBookmarks.jsx web/js/components/preact/investigation/InvestigationView.jsx --format json --output-file build/eng-artifacts/T7.170/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.170/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/control-has-associated-label'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.170.md", + "finding_ids": [ + "ESLINT-BUCKET-19d5fc636e3f15e6", + "ESLINT-BUCKET-2cdd7ef73529551e", + "ESLINT-BUCKET-5a25b9ace393f230", + "ESLINT-BUCKET-12c7bb31966e53aa", + "ESLINT-BUCKET-274240d1fc0300f7", + "ESLINT-BUCKET-2a20bf23c61a102e" + ], + "rule_id": "jsx-a11y/control-has-associated-label", + "reproducers": [ + { + "id": "ESLINT-BUCKET-19d5fc636e3f15e6", + "path": "web/js/components/preact/fleet/OrganizationManager.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/fleet/OrganizationManager.jsx", + "original_count": 5, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-2cdd7ef73529551e", + "path": "web/js/components/preact/fleet/SavedViewsBar.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/fleet/SavedViewsBar.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-5a25b9ace393f230", + "path": "web/js/components/preact/fleet/StaticCollectionMembers.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/fleet/StaticCollectionMembers.jsx", + "original_count": 3, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-12c7bb31966e53aa", + "path": "web/js/components/preact/investigation/InvestigationActions.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/investigation/InvestigationActions.jsx", + "original_count": 4, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-274240d1fc0300f7", + "path": "web/js/components/preact/investigation/InvestigationBookmarks.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/investigation/InvestigationBookmarks.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-2a20bf23c61a102e", + "path": "web/js/components/preact/investigation/InvestigationView.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/investigation/InvestigationView.jsx", + "original_count": 8, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.171", + "title": "jsx-a11y/control-has-associated-label in LiveBuildingPlan.jsx, LiveOperatorNavigator.jsx, PlanSketchControls.jsx, FiltersSidebar.jsx, RecordingsGrid.jsx, RecordingsTable.jsx", + "depends_on": [ + "T7", + "T10", + "T7.163" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/live/LiveBuildingPlan.jsx", + "web/js/components/preact/live/LiveOperatorNavigator.jsx", + "web/js/components/preact/live/PlanSketchControls.jsx", + "web/js/components/preact/recordings/FiltersSidebar.jsx", + "web/js/components/preact/recordings/RecordingsGrid.jsx", + "web/js/components/preact/recordings/RecordingsTable.jsx", + "web/tests/remediation/t7_171.spec.jsx", + "quality/evidence/T7.171.md" + ], + "source_paths": [ + "web/js/components/preact/live/LiveBuildingPlan.jsx", + "web/js/components/preact/live/LiveOperatorNavigator.jsx", + "web/js/components/preact/live/PlanSketchControls.jsx", + "web/js/components/preact/recordings/FiltersSidebar.jsx", + "web/js/components/preact/recordings/RecordingsGrid.jsx", + "web/js/components/preact/recordings/RecordingsTable.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Render each reported control and assert a stable accessible name, including icon-only actions, without relying on title alone; retain localized labels and original action callbacks.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_171", + "mkdir -p build/eng-artifacts/T7.171", + "web/node_modules/.bin/eslint web/js/components/preact/live/LiveBuildingPlan.jsx web/js/components/preact/live/LiveOperatorNavigator.jsx web/js/components/preact/live/PlanSketchControls.jsx web/js/components/preact/recordings/FiltersSidebar.jsx web/js/components/preact/recordings/RecordingsGrid.jsx web/js/components/preact/recordings/RecordingsTable.jsx --format json --output-file build/eng-artifacts/T7.171/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.171/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/control-has-associated-label'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.171.md", + "finding_ids": [ + "ESLINT-BUCKET-bb1a968a245405ec", + "ESLINT-BUCKET-3a6fb0a94ef6ffdf", + "ESLINT-BUCKET-e0e4b387af698b40", + "ESLINT-BUCKET-389226ea0147ea5d", + "ESLINT-BUCKET-aab67d5bbb7b5489", + "ESLINT-BUCKET-f492731b13ec277c" + ], + "rule_id": "jsx-a11y/control-has-associated-label", + "reproducers": [ + { + "id": "ESLINT-BUCKET-bb1a968a245405ec", + "path": "web/js/components/preact/live/LiveBuildingPlan.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/live/LiveBuildingPlan.jsx", + "original_count": 3, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-3a6fb0a94ef6ffdf", + "path": "web/js/components/preact/live/LiveOperatorNavigator.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/live/LiveOperatorNavigator.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-e0e4b387af698b40", + "path": "web/js/components/preact/live/PlanSketchControls.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/live/PlanSketchControls.jsx", + "original_count": 5, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-389226ea0147ea5d", + "path": "web/js/components/preact/recordings/FiltersSidebar.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/recordings/FiltersSidebar.jsx", + "original_count": 5, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-aab67d5bbb7b5489", + "path": "web/js/components/preact/recordings/RecordingsGrid.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/recordings/RecordingsGrid.jsx", + "original_count": 8, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-f492731b13ec277c", + "path": "web/js/components/preact/recordings/RecordingsTable.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/recordings/RecordingsTable.jsx", + "original_count": 6, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.172", + "title": "jsx-a11y/control-has-associated-label in TagsOverlay.jsx, AdvancedTab.jsx, AuthTab.jsx, DetectionTab.jsx, GeneralTab.jsx, Go2rtcTab.jsx", + "depends_on": [ + "T7", + "T10", + "T7.163" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/recordings/TagsOverlay.jsx", + "web/js/components/preact/settings/AdvancedTab.jsx", + "web/js/components/preact/settings/AuthTab.jsx", + "web/js/components/preact/settings/DetectionTab.jsx", + "web/js/components/preact/settings/GeneralTab.jsx", + "web/js/components/preact/settings/Go2rtcTab.jsx", + "web/tests/remediation/t7_172.spec.jsx", + "quality/evidence/T7.172.md" + ], + "source_paths": [ + "web/js/components/preact/recordings/TagsOverlay.jsx", + "web/js/components/preact/settings/AdvancedTab.jsx", + "web/js/components/preact/settings/AuthTab.jsx", + "web/js/components/preact/settings/DetectionTab.jsx", + "web/js/components/preact/settings/GeneralTab.jsx", + "web/js/components/preact/settings/Go2rtcTab.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Render each reported control and assert a stable accessible name, including icon-only actions, without relying on title alone; retain localized labels and original action callbacks.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_172", + "mkdir -p build/eng-artifacts/T7.172", + "web/node_modules/.bin/eslint web/js/components/preact/recordings/TagsOverlay.jsx web/js/components/preact/settings/AdvancedTab.jsx web/js/components/preact/settings/AuthTab.jsx web/js/components/preact/settings/DetectionTab.jsx web/js/components/preact/settings/GeneralTab.jsx web/js/components/preact/settings/Go2rtcTab.jsx --format json --output-file build/eng-artifacts/T7.172/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.172/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/control-has-associated-label'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.172.md", + "finding_ids": [ + "ESLINT-BUCKET-d03afa69ead3203e", + "ESLINT-BUCKET-8ce22b0413a485e1", + "ESLINT-BUCKET-40ef7b2f328bb9ef", + "ESLINT-BUCKET-93d2b8db97a42555", + "ESLINT-BUCKET-ea86635ccd79513e", + "ESLINT-BUCKET-5ec0649750441f81" + ], + "rule_id": "jsx-a11y/control-has-associated-label", + "reproducers": [ + { + "id": "ESLINT-BUCKET-d03afa69ead3203e", + "path": "web/js/components/preact/recordings/TagsOverlay.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/recordings/TagsOverlay.jsx", + "original_count": 3, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-8ce22b0413a485e1", + "path": "web/js/components/preact/settings/AdvancedTab.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/settings/AdvancedTab.jsx", + "original_count": 10, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-40ef7b2f328bb9ef", + "path": "web/js/components/preact/settings/AuthTab.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/settings/AuthTab.jsx", + "original_count": 11, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-93d2b8db97a42555", + "path": "web/js/components/preact/settings/DetectionTab.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/settings/DetectionTab.jsx", + "original_count": 7, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-ea86635ccd79513e", + "path": "web/js/components/preact/settings/GeneralTab.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/settings/GeneralTab.jsx", + "original_count": 6, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-5ec0649750441f81", + "path": "web/js/components/preact/settings/Go2rtcTab.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/settings/Go2rtcTab.jsx", + "original_count": 13, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.173", + "title": "jsx-a11y/control-has-associated-label in HealthTab.jsx, MqttTab.jsx, StorageTab.jsx, StreamsDefaultsTab.jsx, StreamStorage.jsx, CalendarPicker.jsx", + "depends_on": [ + "T7", + "T10" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/settings/HealthTab.jsx", + "web/js/components/preact/settings/MqttTab.jsx", + "web/js/components/preact/settings/StorageTab.jsx", + "web/js/components/preact/settings/StreamsDefaultsTab.jsx", + "web/js/components/preact/system/StreamStorage.jsx", + "web/js/components/preact/timeline/CalendarPicker.jsx", + "web/tests/remediation/t7_173.spec.jsx", + "quality/evidence/T7.173.md" + ], + "source_paths": [ + "web/js/components/preact/settings/HealthTab.jsx", + "web/js/components/preact/settings/MqttTab.jsx", + "web/js/components/preact/settings/StorageTab.jsx", + "web/js/components/preact/settings/StreamsDefaultsTab.jsx", + "web/js/components/preact/system/StreamStorage.jsx", + "web/js/components/preact/timeline/CalendarPicker.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Render each reported control and assert a stable accessible name, including icon-only actions, without relying on title alone; retain localized labels and original action callbacks.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_173", + "mkdir -p build/eng-artifacts/T7.173", + "web/node_modules/.bin/eslint web/js/components/preact/settings/HealthTab.jsx web/js/components/preact/settings/MqttTab.jsx web/js/components/preact/settings/StorageTab.jsx web/js/components/preact/settings/StreamsDefaultsTab.jsx web/js/components/preact/system/StreamStorage.jsx web/js/components/preact/timeline/CalendarPicker.jsx --format json --output-file build/eng-artifacts/T7.173/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.173/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/control-has-associated-label'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.173.md", + "finding_ids": [ + "ESLINT-BUCKET-fe8c1e237393fb23", + "ESLINT-BUCKET-59e343114dc251b1", + "ESLINT-BUCKET-5a1cbbfddf8f3fcc", + "ESLINT-BUCKET-350da16b1c3b2274", + "ESLINT-BUCKET-44b516dc2eeb97bf", + "ESLINT-BUCKET-5da42ce096a9fa82" + ], + "rule_id": "jsx-a11y/control-has-associated-label", + "reproducers": [ + { + "id": "ESLINT-BUCKET-fe8c1e237393fb23", + "path": "web/js/components/preact/settings/HealthTab.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/settings/HealthTab.jsx", + "original_count": 6, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-59e343114dc251b1", + "path": "web/js/components/preact/settings/MqttTab.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/settings/MqttTab.jsx", + "original_count": 13, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-5a1cbbfddf8f3fcc", + "path": "web/js/components/preact/settings/StorageTab.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/settings/StorageTab.jsx", + "original_count": 40, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-350da16b1c3b2274", + "path": "web/js/components/preact/settings/StreamsDefaultsTab.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/settings/StreamsDefaultsTab.jsx", + "original_count": 3, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-44b516dc2eeb97bf", + "path": "web/js/components/preact/system/StreamStorage.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/system/StreamStorage.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-5da42ce096a9fa82", + "path": "web/js/components/preact/timeline/CalendarPicker.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/timeline/CalendarPicker.jsx", + "original_count": 4, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.174", + "title": "jsx-a11y/control-has-associated-label in TimelineControls.jsx, TimelinePlayer.jsx, AddUserModal.jsx, ApiKeyModal.jsx, AuditHistoryModal.jsx, EditUserModal.jsx", + "depends_on": [ + "T7", + "T10", + "T7.163", + "T7.164" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/timeline/TimelineControls.jsx", + "web/js/components/preact/timeline/TimelinePlayer.jsx", + "web/js/components/preact/users/AddUserModal.jsx", + "web/js/components/preact/users/ApiKeyModal.jsx", + "web/js/components/preact/users/AuditHistoryModal.jsx", + "web/js/components/preact/users/EditUserModal.jsx", + "web/tests/remediation/t7_174.spec.jsx", + "quality/evidence/T7.174.md" + ], + "source_paths": [ + "web/js/components/preact/timeline/TimelineControls.jsx", + "web/js/components/preact/timeline/TimelinePlayer.jsx", + "web/js/components/preact/users/AddUserModal.jsx", + "web/js/components/preact/users/ApiKeyModal.jsx", + "web/js/components/preact/users/AuditHistoryModal.jsx", + "web/js/components/preact/users/EditUserModal.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Render each reported control and assert a stable accessible name, including icon-only actions, without relying on title alone; retain localized labels and original action callbacks.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_174", + "mkdir -p build/eng-artifacts/T7.174", + "web/node_modules/.bin/eslint web/js/components/preact/timeline/TimelineControls.jsx web/js/components/preact/timeline/TimelinePlayer.jsx web/js/components/preact/users/AddUserModal.jsx web/js/components/preact/users/ApiKeyModal.jsx web/js/components/preact/users/AuditHistoryModal.jsx web/js/components/preact/users/EditUserModal.jsx --format json --output-file build/eng-artifacts/T7.174/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.174/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/control-has-associated-label'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.174.md", + "finding_ids": [ + "ESLINT-BUCKET-7b00d558899dd292", + "ESLINT-BUCKET-4e38c49052b49016", + "ESLINT-BUCKET-6af902622576c683", + "ESLINT-BUCKET-098293b0fb5320bb", + "ESLINT-BUCKET-f25f197e02c782fc", + "ESLINT-BUCKET-ccf3e6e7959d2bd7" + ], + "rule_id": "jsx-a11y/control-has-associated-label", + "reproducers": [ + { + "id": "ESLINT-BUCKET-7b00d558899dd292", + "path": "web/js/components/preact/timeline/TimelineControls.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/timeline/TimelineControls.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-4e38c49052b49016", + "path": "web/js/components/preact/timeline/TimelinePlayer.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/timeline/TimelinePlayer.jsx", + "original_count": 3, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-6af902622576c683", + "path": "web/js/components/preact/users/AddUserModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/users/AddUserModal.jsx", + "original_count": 6, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-098293b0fb5320bb", + "path": "web/js/components/preact/users/ApiKeyModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/users/ApiKeyModal.jsx", + "original_count": 4, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-f25f197e02c782fc", + "path": "web/js/components/preact/users/AuditHistoryModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/users/AuditHistoryModal.jsx", + "original_count": 6, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-ccf3e6e7959d2bd7", + "path": "web/js/components/preact/users/EditUserModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/users/EditUserModal.jsx", + "original_count": 6, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.175", + "title": "jsx-a11y/control-has-associated-label in RoleManagerModal.jsx, TotpSetupModal.jsx, UsersTable.jsx", + "depends_on": [ + "T7", + "T10", + "T7.165" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/users/RoleManagerModal.jsx", + "web/js/components/preact/users/TotpSetupModal.jsx", + "web/js/components/preact/users/UsersTable.jsx", + "web/tests/remediation/t7_175.spec.jsx", + "quality/evidence/T7.175.md" + ], + "source_paths": [ + "web/js/components/preact/users/RoleManagerModal.jsx", + "web/js/components/preact/users/TotpSetupModal.jsx", + "web/js/components/preact/users/UsersTable.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Render each reported control and assert a stable accessible name, including icon-only actions, without relying on title alone; retain localized labels and original action callbacks.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_175", + "mkdir -p build/eng-artifacts/T7.175", + "web/node_modules/.bin/eslint web/js/components/preact/users/RoleManagerModal.jsx web/js/components/preact/users/TotpSetupModal.jsx web/js/components/preact/users/UsersTable.jsx --format json --output-file build/eng-artifacts/T7.175/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.175/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/control-has-associated-label'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.175.md", + "finding_ids": [ + "ESLINT-BUCKET-400e44e71536be4e", + "ESLINT-BUCKET-d3aede71a08c3a5f", + "ESLINT-BUCKET-fcf1de019f6b4533" + ], + "rule_id": "jsx-a11y/control-has-associated-label", + "reproducers": [ + { + "id": "ESLINT-BUCKET-400e44e71536be4e", + "path": "web/js/components/preact/users/RoleManagerModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/users/RoleManagerModal.jsx", + "original_count": 3, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-d3aede71a08c3a5f", + "path": "web/js/components/preact/users/TotpSetupModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/users/TotpSetupModal.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-fcf1de019f6b4533", + "path": "web/js/components/preact/users/UsersTable.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/users/UsersTable.jsx", + "original_count": 6, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.176", + "title": "jsx-a11y/interactive-supports-focus in MobileTileGestures.jsx", + "depends_on": [ + "T7", + "T10" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/MobileTileGestures.jsx", + "web/tests/remediation/t7_176.spec.jsx", + "quality/evidence/T7.176.md" + ], + "source_paths": [ + "web/js/components/preact/MobileTileGestures.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Assert each interactive control is keyboard focusable and acts once for its expected activation keys.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_176", + "mkdir -p build/eng-artifacts/T7.176", + "web/node_modules/.bin/eslint web/js/components/preact/MobileTileGestures.jsx --format json --output-file build/eng-artifacts/T7.176/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.176/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/interactive-supports-focus'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.176.md", + "finding_ids": [ + "ESLINT-BUCKET-3469a0a703cdbc12" + ], + "rule_id": "jsx-a11y/interactive-supports-focus", + "reproducers": [ + { + "id": "ESLINT-BUCKET-3469a0a703cdbc12", + "path": "web/js/components/preact/MobileTileGestures.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/interactive-supports-focus:web/js/components/preact/MobileTileGestures.jsx", + "original_count": 1, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.177", + "title": "jsx-a11y/label-has-associated-control in BatchDownloadModal.jsx, StreamConfigModal.jsx, EventDestinationEditor.jsx, EventRouteEditor.jsx, CollectionManager.jsx, StaticCollectionMembers.jsx", + "depends_on": [ + "T7", + "T10", + "T7.166", + "T7.167", + "T7.169", + "T7.170" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/BatchDownloadModal.jsx", + "web/js/components/preact/StreamConfigModal.jsx", + "web/js/components/preact/events/EventDestinationEditor.jsx", + "web/js/components/preact/events/EventRouteEditor.jsx", + "web/js/components/preact/fleet/CollectionManager.jsx", + "web/js/components/preact/fleet/StaticCollectionMembers.jsx", + "web/tests/remediation/t7_177.spec.jsx", + "quality/evidence/T7.177.md" + ], + "source_paths": [ + "web/js/components/preact/BatchDownloadModal.jsx", + "web/js/components/preact/StreamConfigModal.jsx", + "web/js/components/preact/events/EventDestinationEditor.jsx", + "web/js/components/preact/events/EventRouteEditor.jsx", + "web/js/components/preact/fleet/CollectionManager.jsx", + "web/js/components/preact/fleet/StaticCollectionMembers.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Assert label/input association is programmatic, unique in repeated forms, localized and preserved during conditional rendering.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_177", + "mkdir -p build/eng-artifacts/T7.177", + "web/node_modules/.bin/eslint web/js/components/preact/BatchDownloadModal.jsx web/js/components/preact/StreamConfigModal.jsx web/js/components/preact/events/EventDestinationEditor.jsx web/js/components/preact/events/EventRouteEditor.jsx web/js/components/preact/fleet/CollectionManager.jsx web/js/components/preact/fleet/StaticCollectionMembers.jsx --format json --output-file build/eng-artifacts/T7.177/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.177/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/label-has-associated-control'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.177.md", + "finding_ids": [ + "ESLINT-BUCKET-199d3d91208953b4", + "ESLINT-BUCKET-81a756fe7228ad5b", + "ESLINT-BUCKET-ddc6803a9b16e391", + "ESLINT-BUCKET-7cde28afaa9ffb65", + "ESLINT-BUCKET-7dcecd444f491721", + "ESLINT-BUCKET-9308fe6583bcdce7" + ], + "rule_id": "jsx-a11y/label-has-associated-control", + "reproducers": [ + { + "id": "ESLINT-BUCKET-199d3d91208953b4", + "path": "web/js/components/preact/BatchDownloadModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-associated-control:web/js/components/preact/BatchDownloadModal.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-81a756fe7228ad5b", + "path": "web/js/components/preact/StreamConfigModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-associated-control:web/js/components/preact/StreamConfigModal.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-ddc6803a9b16e391", + "path": "web/js/components/preact/events/EventDestinationEditor.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-associated-control:web/js/components/preact/events/EventDestinationEditor.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-7cde28afaa9ffb65", + "path": "web/js/components/preact/events/EventRouteEditor.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-associated-control:web/js/components/preact/events/EventRouteEditor.jsx", + "original_count": 5, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-7dcecd444f491721", + "path": "web/js/components/preact/fleet/CollectionManager.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-associated-control:web/js/components/preact/fleet/CollectionManager.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-9308fe6583bcdce7", + "path": "web/js/components/preact/fleet/StaticCollectionMembers.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-associated-control:web/js/components/preact/fleet/StaticCollectionMembers.jsx", + "original_count": 1, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.178", + "title": "jsx-a11y/label-has-associated-control in HealthTab.jsx, StorageTab.jsx, ApiKeyModal.jsx", + "depends_on": [ + "T7", + "T10", + "T7.173", + "T7.174" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/settings/HealthTab.jsx", + "web/js/components/preact/settings/StorageTab.jsx", + "web/js/components/preact/users/ApiKeyModal.jsx", + "web/tests/remediation/t7_178.spec.jsx", + "quality/evidence/T7.178.md" + ], + "source_paths": [ + "web/js/components/preact/settings/HealthTab.jsx", + "web/js/components/preact/settings/StorageTab.jsx", + "web/js/components/preact/users/ApiKeyModal.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Assert label/input association is programmatic, unique in repeated forms, localized and preserved during conditional rendering.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_178", + "mkdir -p build/eng-artifacts/T7.178", + "web/node_modules/.bin/eslint web/js/components/preact/settings/HealthTab.jsx web/js/components/preact/settings/StorageTab.jsx web/js/components/preact/users/ApiKeyModal.jsx --format json --output-file build/eng-artifacts/T7.178/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.178/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/label-has-associated-control'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.178.md", + "finding_ids": [ + "ESLINT-BUCKET-5e7cfcb56208eaa9", + "ESLINT-BUCKET-e84d458d8fcd3eef", + "ESLINT-BUCKET-cf4b93673820960b" + ], + "rule_id": "jsx-a11y/label-has-associated-control", + "reproducers": [ + { + "id": "ESLINT-BUCKET-5e7cfcb56208eaa9", + "path": "web/js/components/preact/settings/HealthTab.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-associated-control:web/js/components/preact/settings/HealthTab.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-e84d458d8fcd3eef", + "path": "web/js/components/preact/settings/StorageTab.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-associated-control:web/js/components/preact/settings/StorageTab.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-cf4b93673820960b", + "path": "web/js/components/preact/users/ApiKeyModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-associated-control:web/js/components/preact/users/ApiKeyModal.jsx", + "original_count": 1, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.179", + "title": "jsx-a11y/label-has-for in AuthGate.jsx, BatchDownloadModal.jsx, FleetView.jsx, LiveView.jsx, LoginView.jsx, SetupWizard.jsx", + "depends_on": [ + "T7", + "T10", + "T7.166", + "T7.177", + "T7.167" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/AuthGate.jsx", + "web/js/components/preact/BatchDownloadModal.jsx", + "web/js/components/preact/FleetView.jsx", + "web/js/components/preact/LiveView.jsx", + "web/js/components/preact/LoginView.jsx", + "web/js/components/preact/SetupWizard.jsx", + "web/tests/remediation/t7_179.spec.jsx", + "quality/evidence/T7.179.md" + ], + "source_paths": [ + "web/js/components/preact/AuthGate.jsx", + "web/js/components/preact/BatchDownloadModal.jsx", + "web/js/components/preact/FleetView.jsx", + "web/js/components/preact/LiveView.jsx", + "web/js/components/preact/LoginView.jsx", + "web/js/components/preact/SetupWizard.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Assert each label resolves to its intended input by id/for with unique IDs across repeated components and that clicking it focuses the input.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_179", + "mkdir -p build/eng-artifacts/T7.179", + "web/node_modules/.bin/eslint web/js/components/preact/AuthGate.jsx web/js/components/preact/BatchDownloadModal.jsx web/js/components/preact/FleetView.jsx web/js/components/preact/LiveView.jsx web/js/components/preact/LoginView.jsx web/js/components/preact/SetupWizard.jsx --format json --output-file build/eng-artifacts/T7.179/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.179/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/label-has-for'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.179.md", + "finding_ids": [ + "ESLINT-BUCKET-00c9eb79387b90d1", + "ESLINT-BUCKET-c603f4c09210c0bd", + "ESLINT-BUCKET-07e48ad6ea9ce45e", + "ESLINT-BUCKET-dfeaa6c4a9abf5fa", + "ESLINT-BUCKET-98f2a6813a7ad225", + "ESLINT-BUCKET-e73c0530b2243573" + ], + "rule_id": "jsx-a11y/label-has-for", + "reproducers": [ + { + "id": "ESLINT-BUCKET-00c9eb79387b90d1", + "path": "web/js/components/preact/AuthGate.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/AuthGate.jsx", + "original_count": 3, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-c603f4c09210c0bd", + "path": "web/js/components/preact/BatchDownloadModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/BatchDownloadModal.jsx", + "original_count": 3, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-07e48ad6ea9ce45e", + "path": "web/js/components/preact/FleetView.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/FleetView.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-dfeaa6c4a9abf5fa", + "path": "web/js/components/preact/LiveView.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/LiveView.jsx", + "original_count": 4, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-98f2a6813a7ad225", + "path": "web/js/components/preact/LoginView.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/LoginView.jsx", + "original_count": 6, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-e73c0530b2243573", + "path": "web/js/components/preact/SetupWizard.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/SetupWizard.jsx", + "original_count": 1, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.180", + "title": "jsx-a11y/label-has-for in StreamCard.jsx, StreamConfigModal.jsx, StreamsView.jsx, UI.jsx, ZoneEditor.jsx, ModalDialog.jsx", + "depends_on": [ + "T7", + "T10", + "T7.161", + "T7.177", + "T7.168" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/StreamCard.jsx", + "web/js/components/preact/StreamConfigModal.jsx", + "web/js/components/preact/StreamsView.jsx", + "web/js/components/preact/UI.jsx", + "web/js/components/preact/ZoneEditor.jsx", + "web/js/components/preact/common/ModalDialog.jsx", + "web/tests/remediation/t7_180.spec.jsx", + "quality/evidence/T7.180.md" + ], + "source_paths": [ + "web/js/components/preact/StreamCard.jsx", + "web/js/components/preact/StreamConfigModal.jsx", + "web/js/components/preact/StreamsView.jsx", + "web/js/components/preact/UI.jsx", + "web/js/components/preact/ZoneEditor.jsx", + "web/js/components/preact/common/ModalDialog.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Assert each label resolves to its intended input by id/for with unique IDs across repeated components and that clicking it focuses the input.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_180", + "mkdir -p build/eng-artifacts/T7.180", + "web/node_modules/.bin/eslint web/js/components/preact/StreamCard.jsx web/js/components/preact/StreamConfigModal.jsx web/js/components/preact/StreamsView.jsx web/js/components/preact/UI.jsx web/js/components/preact/ZoneEditor.jsx web/js/components/preact/common/ModalDialog.jsx --format json --output-file build/eng-artifacts/T7.180/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.180/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/label-has-for'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.180.md", + "finding_ids": [ + "ESLINT-BUCKET-c4c40aa44f4e62e4", + "ESLINT-BUCKET-d900a116e1f06cf4", + "ESLINT-BUCKET-de63541e57266afb", + "ESLINT-BUCKET-e810ef87137eb5d8", + "ESLINT-BUCKET-38ac9714530327f7", + "ESLINT-BUCKET-b1a74f710eb47a22" + ], + "rule_id": "jsx-a11y/label-has-for", + "reproducers": [ + { + "id": "ESLINT-BUCKET-c4c40aa44f4e62e4", + "path": "web/js/components/preact/StreamCard.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/StreamCard.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-d900a116e1f06cf4", + "path": "web/js/components/preact/StreamConfigModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/StreamConfigModal.jsx", + "original_count": 59, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-de63541e57266afb", + "path": "web/js/components/preact/StreamsView.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/StreamsView.jsx", + "original_count": 8, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-e810ef87137eb5d8", + "path": "web/js/components/preact/UI.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/UI.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-38ac9714530327f7", + "path": "web/js/components/preact/ZoneEditor.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/ZoneEditor.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-b1a74f710eb47a22", + "path": "web/js/components/preact/common/ModalDialog.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/common/ModalDialog.jsx", + "original_count": 2, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.181", + "title": "jsx-a11y/label-has-for in EventDestinationEditor.jsx, EventRouteEditor.jsx, BulkOrganizeModal.jsx, CollectionManager.jsx, CollectionSelectorBuilder.jsx, FleetTable.jsx", + "depends_on": [ + "T7", + "T10", + "T7.177", + "T7.169" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/events/EventDestinationEditor.jsx", + "web/js/components/preact/events/EventRouteEditor.jsx", + "web/js/components/preact/fleet/BulkOrganizeModal.jsx", + "web/js/components/preact/fleet/CollectionManager.jsx", + "web/js/components/preact/fleet/CollectionSelectorBuilder.jsx", + "web/js/components/preact/fleet/FleetTable.jsx", + "web/tests/remediation/t7_181.spec.jsx", + "quality/evidence/T7.181.md" + ], + "source_paths": [ + "web/js/components/preact/events/EventDestinationEditor.jsx", + "web/js/components/preact/events/EventRouteEditor.jsx", + "web/js/components/preact/fleet/BulkOrganizeModal.jsx", + "web/js/components/preact/fleet/CollectionManager.jsx", + "web/js/components/preact/fleet/CollectionSelectorBuilder.jsx", + "web/js/components/preact/fleet/FleetTable.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Assert each label resolves to its intended input by id/for with unique IDs across repeated components and that clicking it focuses the input.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_181", + "mkdir -p build/eng-artifacts/T7.181", + "web/node_modules/.bin/eslint web/js/components/preact/events/EventDestinationEditor.jsx web/js/components/preact/events/EventRouteEditor.jsx web/js/components/preact/fleet/BulkOrganizeModal.jsx web/js/components/preact/fleet/CollectionManager.jsx web/js/components/preact/fleet/CollectionSelectorBuilder.jsx web/js/components/preact/fleet/FleetTable.jsx --format json --output-file build/eng-artifacts/T7.181/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.181/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/label-has-for'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.181.md", + "finding_ids": [ + "ESLINT-BUCKET-2d6e882afea8fed1", + "ESLINT-BUCKET-f3bd5129ab03f352", + "ESLINT-BUCKET-7ba2e66a4eb3914f", + "ESLINT-BUCKET-05ad31a80cc2b3a2", + "ESLINT-BUCKET-30a2e484727d4a5a", + "ESLINT-BUCKET-b32370126e568d01" + ], + "rule_id": "jsx-a11y/label-has-for", + "reproducers": [ + { + "id": "ESLINT-BUCKET-2d6e882afea8fed1", + "path": "web/js/components/preact/events/EventDestinationEditor.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/events/EventDestinationEditor.jsx", + "original_count": 3, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-f3bd5129ab03f352", + "path": "web/js/components/preact/events/EventRouteEditor.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/events/EventRouteEditor.jsx", + "original_count": 9, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-7ba2e66a4eb3914f", + "path": "web/js/components/preact/fleet/BulkOrganizeModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/fleet/BulkOrganizeModal.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-05ad31a80cc2b3a2", + "path": "web/js/components/preact/fleet/CollectionManager.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/fleet/CollectionManager.jsx", + "original_count": 4, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-30a2e484727d4a5a", + "path": "web/js/components/preact/fleet/CollectionSelectorBuilder.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/fleet/CollectionSelectorBuilder.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-b32370126e568d01", + "path": "web/js/components/preact/fleet/FleetTable.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/fleet/FleetTable.jsx", + "original_count": 3, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.182", + "title": "jsx-a11y/label-has-for in OrganizationManager.jsx, SavedViewsBar.jsx, StaticCollectionMembers.jsx, InvestigationActions.jsx, InvestigationBookmarks.jsx, InvestigationView.jsx", + "depends_on": [ + "T7", + "T10", + "T7.170", + "T7.177" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/fleet/OrganizationManager.jsx", + "web/js/components/preact/fleet/SavedViewsBar.jsx", + "web/js/components/preact/fleet/StaticCollectionMembers.jsx", + "web/js/components/preact/investigation/InvestigationActions.jsx", + "web/js/components/preact/investigation/InvestigationBookmarks.jsx", + "web/js/components/preact/investigation/InvestigationView.jsx", + "web/tests/remediation/t7_182.spec.jsx", + "quality/evidence/T7.182.md" + ], + "source_paths": [ + "web/js/components/preact/fleet/OrganizationManager.jsx", + "web/js/components/preact/fleet/SavedViewsBar.jsx", + "web/js/components/preact/fleet/StaticCollectionMembers.jsx", + "web/js/components/preact/investigation/InvestigationActions.jsx", + "web/js/components/preact/investigation/InvestigationBookmarks.jsx", + "web/js/components/preact/investigation/InvestigationView.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Assert each label resolves to its intended input by id/for with unique IDs across repeated components and that clicking it focuses the input.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_182", + "mkdir -p build/eng-artifacts/T7.182", + "web/node_modules/.bin/eslint web/js/components/preact/fleet/OrganizationManager.jsx web/js/components/preact/fleet/SavedViewsBar.jsx web/js/components/preact/fleet/StaticCollectionMembers.jsx web/js/components/preact/investigation/InvestigationActions.jsx web/js/components/preact/investigation/InvestigationBookmarks.jsx web/js/components/preact/investigation/InvestigationView.jsx --format json --output-file build/eng-artifacts/T7.182/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.182/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/label-has-for'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.182.md", + "finding_ids": [ + "ESLINT-BUCKET-f77074e66ed65721", + "ESLINT-BUCKET-e26c8068ece9c0e0", + "ESLINT-BUCKET-4246d4277a0b8f04", + "ESLINT-BUCKET-642b5326a1034302", + "ESLINT-BUCKET-c0802f3ddbb20b2e", + "ESLINT-BUCKET-137cbeae12c87193" + ], + "rule_id": "jsx-a11y/label-has-for", + "reproducers": [ + { + "id": "ESLINT-BUCKET-f77074e66ed65721", + "path": "web/js/components/preact/fleet/OrganizationManager.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/fleet/OrganizationManager.jsx", + "original_count": 8, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-e26c8068ece9c0e0", + "path": "web/js/components/preact/fleet/SavedViewsBar.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/fleet/SavedViewsBar.jsx", + "original_count": 3, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-4246d4277a0b8f04", + "path": "web/js/components/preact/fleet/StaticCollectionMembers.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/fleet/StaticCollectionMembers.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-642b5326a1034302", + "path": "web/js/components/preact/investigation/InvestigationActions.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/investigation/InvestigationActions.jsx", + "original_count": 4, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-c0802f3ddbb20b2e", + "path": "web/js/components/preact/investigation/InvestigationBookmarks.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/investigation/InvestigationBookmarks.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-137cbeae12c87193", + "path": "web/js/components/preact/investigation/InvestigationView.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/investigation/InvestigationView.jsx", + "original_count": 18, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.183", + "title": "jsx-a11y/label-has-for in LiveBuildingPlan.jsx, LiveOperatorNavigator.jsx, FiltersSidebar.jsx, RecordingsGrid.jsx, RecordingsTable.jsx, TagsOverlay.jsx", + "depends_on": [ + "T7", + "T10", + "T7.171", + "T7.172" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/live/LiveBuildingPlan.jsx", + "web/js/components/preact/live/LiveOperatorNavigator.jsx", + "web/js/components/preact/recordings/FiltersSidebar.jsx", + "web/js/components/preact/recordings/RecordingsGrid.jsx", + "web/js/components/preact/recordings/RecordingsTable.jsx", + "web/js/components/preact/recordings/TagsOverlay.jsx", + "web/tests/remediation/t7_183.spec.jsx", + "quality/evidence/T7.183.md" + ], + "source_paths": [ + "web/js/components/preact/live/LiveBuildingPlan.jsx", + "web/js/components/preact/live/LiveOperatorNavigator.jsx", + "web/js/components/preact/recordings/FiltersSidebar.jsx", + "web/js/components/preact/recordings/RecordingsGrid.jsx", + "web/js/components/preact/recordings/RecordingsTable.jsx", + "web/js/components/preact/recordings/TagsOverlay.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Assert each label resolves to its intended input by id/for with unique IDs across repeated components and that clicking it focuses the input.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_183", + "mkdir -p build/eng-artifacts/T7.183", + "web/node_modules/.bin/eslint web/js/components/preact/live/LiveBuildingPlan.jsx web/js/components/preact/live/LiveOperatorNavigator.jsx web/js/components/preact/recordings/FiltersSidebar.jsx web/js/components/preact/recordings/RecordingsGrid.jsx web/js/components/preact/recordings/RecordingsTable.jsx web/js/components/preact/recordings/TagsOverlay.jsx --format json --output-file build/eng-artifacts/T7.183/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.183/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/label-has-for'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.183.md", + "finding_ids": [ + "ESLINT-BUCKET-a167dfb879b1b9cf", + "ESLINT-BUCKET-b0e1dbc8e8cc536e", + "ESLINT-BUCKET-50994f387baeaa69", + "ESLINT-BUCKET-dcde47440ba091e3", + "ESLINT-BUCKET-114c375fcc3b4802", + "ESLINT-BUCKET-8b431e9fa35d81ba" + ], + "rule_id": "jsx-a11y/label-has-for", + "reproducers": [ + { + "id": "ESLINT-BUCKET-a167dfb879b1b9cf", + "path": "web/js/components/preact/live/LiveBuildingPlan.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/live/LiveBuildingPlan.jsx", + "original_count": 3, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-b0e1dbc8e8cc536e", + "path": "web/js/components/preact/live/LiveOperatorNavigator.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/live/LiveOperatorNavigator.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-50994f387baeaa69", + "path": "web/js/components/preact/recordings/FiltersSidebar.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/recordings/FiltersSidebar.jsx", + "original_count": 3, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-dcde47440ba091e3", + "path": "web/js/components/preact/recordings/RecordingsGrid.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/recordings/RecordingsGrid.jsx", + "original_count": 3, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-114c375fcc3b4802", + "path": "web/js/components/preact/recordings/RecordingsTable.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/recordings/RecordingsTable.jsx", + "original_count": 3, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-8b431e9fa35d81ba", + "path": "web/js/components/preact/recordings/TagsOverlay.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/recordings/TagsOverlay.jsx", + "original_count": 1, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.184", + "title": "jsx-a11y/label-has-for in AdvancedTab.jsx, AuthTab.jsx, DetectionTab.jsx, GeneralTab.jsx, Go2rtcTab.jsx, HealthTab.jsx", + "depends_on": [ + "T7", + "T10", + "T7.172", + "T7.178" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/settings/AdvancedTab.jsx", + "web/js/components/preact/settings/AuthTab.jsx", + "web/js/components/preact/settings/DetectionTab.jsx", + "web/js/components/preact/settings/GeneralTab.jsx", + "web/js/components/preact/settings/Go2rtcTab.jsx", + "web/js/components/preact/settings/HealthTab.jsx", + "web/tests/remediation/t7_184.spec.jsx", + "quality/evidence/T7.184.md" + ], + "source_paths": [ + "web/js/components/preact/settings/AdvancedTab.jsx", + "web/js/components/preact/settings/AuthTab.jsx", + "web/js/components/preact/settings/DetectionTab.jsx", + "web/js/components/preact/settings/GeneralTab.jsx", + "web/js/components/preact/settings/Go2rtcTab.jsx", + "web/js/components/preact/settings/HealthTab.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Assert each label resolves to its intended input by id/for with unique IDs across repeated components and that clicking it focuses the input.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_184", + "mkdir -p build/eng-artifacts/T7.184", + "web/node_modules/.bin/eslint web/js/components/preact/settings/AdvancedTab.jsx web/js/components/preact/settings/AuthTab.jsx web/js/components/preact/settings/DetectionTab.jsx web/js/components/preact/settings/GeneralTab.jsx web/js/components/preact/settings/Go2rtcTab.jsx web/js/components/preact/settings/HealthTab.jsx --format json --output-file build/eng-artifacts/T7.184/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.184/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/label-has-for'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.184.md", + "finding_ids": [ + "ESLINT-BUCKET-a4e1217d107c230c", + "ESLINT-BUCKET-4a0d0e1ea3635a24", + "ESLINT-BUCKET-d6ed69efe339ce37", + "ESLINT-BUCKET-61d1473d84fbeea6", + "ESLINT-BUCKET-dd680edebf6809ff", + "ESLINT-BUCKET-e267f8f47c3806d3" + ], + "rule_id": "jsx-a11y/label-has-for", + "reproducers": [ + { + "id": "ESLINT-BUCKET-a4e1217d107c230c", + "path": "web/js/components/preact/settings/AdvancedTab.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/settings/AdvancedTab.jsx", + "original_count": 10, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-4a0d0e1ea3635a24", + "path": "web/js/components/preact/settings/AuthTab.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/settings/AuthTab.jsx", + "original_count": 12, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-d6ed69efe339ce37", + "path": "web/js/components/preact/settings/DetectionTab.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/settings/DetectionTab.jsx", + "original_count": 10, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-61d1473d84fbeea6", + "path": "web/js/components/preact/settings/GeneralTab.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/settings/GeneralTab.jsx", + "original_count": 9, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-dd680edebf6809ff", + "path": "web/js/components/preact/settings/Go2rtcTab.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/settings/Go2rtcTab.jsx", + "original_count": 13, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-e267f8f47c3806d3", + "path": "web/js/components/preact/settings/HealthTab.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/settings/HealthTab.jsx", + "original_count": 3, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.185", + "title": "jsx-a11y/label-has-for in MqttTab.jsx, StorageTab.jsx, StreamsDefaultsTab.jsx, WorkspacesTab.jsx, TimelinePage.jsx, TimelinePlayer.jsx", + "depends_on": [ + "T7", + "T10", + "T7.173", + "T7.178", + "T7.174" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/settings/MqttTab.jsx", + "web/js/components/preact/settings/StorageTab.jsx", + "web/js/components/preact/settings/StreamsDefaultsTab.jsx", + "web/js/components/preact/settings/WorkspacesTab.jsx", + "web/js/components/preact/timeline/TimelinePage.jsx", + "web/js/components/preact/timeline/TimelinePlayer.jsx", + "web/tests/remediation/t7_185.spec.jsx", + "quality/evidence/T7.185.md" + ], + "source_paths": [ + "web/js/components/preact/settings/MqttTab.jsx", + "web/js/components/preact/settings/StorageTab.jsx", + "web/js/components/preact/settings/StreamsDefaultsTab.jsx", + "web/js/components/preact/settings/WorkspacesTab.jsx", + "web/js/components/preact/timeline/TimelinePage.jsx", + "web/js/components/preact/timeline/TimelinePlayer.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Assert each label resolves to its intended input by id/for with unique IDs across repeated components and that clicking it focuses the input.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_185", + "mkdir -p build/eng-artifacts/T7.185", + "web/node_modules/.bin/eslint web/js/components/preact/settings/MqttTab.jsx web/js/components/preact/settings/StorageTab.jsx web/js/components/preact/settings/StreamsDefaultsTab.jsx web/js/components/preact/settings/WorkspacesTab.jsx web/js/components/preact/timeline/TimelinePage.jsx web/js/components/preact/timeline/TimelinePlayer.jsx --format json --output-file build/eng-artifacts/T7.185/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.185/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/label-has-for'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.185.md", + "finding_ids": [ + "ESLINT-BUCKET-d5ecbc0292c55216", + "ESLINT-BUCKET-c067bb3093f57d49", + "ESLINT-BUCKET-4e8b56001c3a0722", + "ESLINT-BUCKET-223399111dfd4016", + "ESLINT-BUCKET-7d2f50f4d066f6e4", + "ESLINT-BUCKET-00d366c5691b4bb5" + ], + "rule_id": "jsx-a11y/label-has-for", + "reproducers": [ + { + "id": "ESLINT-BUCKET-d5ecbc0292c55216", + "path": "web/js/components/preact/settings/MqttTab.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/settings/MqttTab.jsx", + "original_count": 14, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-c067bb3093f57d49", + "path": "web/js/components/preact/settings/StorageTab.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/settings/StorageTab.jsx", + "original_count": 53, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-4e8b56001c3a0722", + "path": "web/js/components/preact/settings/StreamsDefaultsTab.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/settings/StreamsDefaultsTab.jsx", + "original_count": 5, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-223399111dfd4016", + "path": "web/js/components/preact/settings/WorkspacesTab.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/settings/WorkspacesTab.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-7d2f50f4d066f6e4", + "path": "web/js/components/preact/timeline/TimelinePage.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/timeline/TimelinePage.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-00d366c5691b4bb5", + "path": "web/js/components/preact/timeline/TimelinePlayer.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/timeline/TimelinePlayer.jsx", + "original_count": 1, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.186", + "title": "jsx-a11y/label-has-for in AccessPolicyModal.jsx, AddUserModal.jsx, ApiKeyModal.jsx, AuditDecisionModes.jsx, AuditHistoryModal.jsx, EditUserModal.jsx", + "depends_on": [ + "T7", + "T10", + "T7.164", + "T7.174", + "T7.178" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/users/AccessPolicyModal.jsx", + "web/js/components/preact/users/AddUserModal.jsx", + "web/js/components/preact/users/ApiKeyModal.jsx", + "web/js/components/preact/users/AuditDecisionModes.jsx", + "web/js/components/preact/users/AuditHistoryModal.jsx", + "web/js/components/preact/users/EditUserModal.jsx", + "web/tests/remediation/t7_186.spec.jsx", + "quality/evidence/T7.186.md" + ], + "source_paths": [ + "web/js/components/preact/users/AccessPolicyModal.jsx", + "web/js/components/preact/users/AddUserModal.jsx", + "web/js/components/preact/users/ApiKeyModal.jsx", + "web/js/components/preact/users/AuditDecisionModes.jsx", + "web/js/components/preact/users/AuditHistoryModal.jsx", + "web/js/components/preact/users/EditUserModal.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Assert each label resolves to its intended input by id/for with unique IDs across repeated components and that clicking it focuses the input.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_186", + "mkdir -p build/eng-artifacts/T7.186", + "web/node_modules/.bin/eslint web/js/components/preact/users/AccessPolicyModal.jsx web/js/components/preact/users/AddUserModal.jsx web/js/components/preact/users/ApiKeyModal.jsx web/js/components/preact/users/AuditDecisionModes.jsx web/js/components/preact/users/AuditHistoryModal.jsx web/js/components/preact/users/EditUserModal.jsx --format json --output-file build/eng-artifacts/T7.186/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.186/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/label-has-for'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.186.md", + "finding_ids": [ + "ESLINT-BUCKET-7f43090b7b01626a", + "ESLINT-BUCKET-17ad0e14291e8ec3", + "ESLINT-BUCKET-18b7f3add93999e4", + "ESLINT-BUCKET-d3157833e1568912", + "ESLINT-BUCKET-184f5809a1f3d621", + "ESLINT-BUCKET-682efc8151a90daf" + ], + "rule_id": "jsx-a11y/label-has-for", + "reproducers": [ + { + "id": "ESLINT-BUCKET-7f43090b7b01626a", + "path": "web/js/components/preact/users/AccessPolicyModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/users/AccessPolicyModal.jsx", + "original_count": 4, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-17ad0e14291e8ec3", + "path": "web/js/components/preact/users/AddUserModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/users/AddUserModal.jsx", + "original_count": 5, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-18b7f3add93999e4", + "path": "web/js/components/preact/users/ApiKeyModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/users/ApiKeyModal.jsx", + "original_count": 7, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-d3157833e1568912", + "path": "web/js/components/preact/users/AuditDecisionModes.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/users/AuditDecisionModes.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-184f5809a1f3d621", + "path": "web/js/components/preact/users/AuditHistoryModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/users/AuditHistoryModal.jsx", + "original_count": 10, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-682efc8151a90daf", + "path": "web/js/components/preact/users/EditUserModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/users/EditUserModal.jsx", + "original_count": 7, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.187", + "title": "jsx-a11y/label-has-for in RoleManagerModal.jsx, TotpSetupModal.jsx", + "depends_on": [ + "T7", + "T10", + "T7.175" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/users/RoleManagerModal.jsx", + "web/js/components/preact/users/TotpSetupModal.jsx", + "web/tests/remediation/t7_187.spec.jsx", + "quality/evidence/T7.187.md" + ], + "source_paths": [ + "web/js/components/preact/users/RoleManagerModal.jsx", + "web/js/components/preact/users/TotpSetupModal.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Assert each label resolves to its intended input by id/for with unique IDs across repeated components and that clicking it focuses the input.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_187", + "mkdir -p build/eng-artifacts/T7.187", + "web/node_modules/.bin/eslint web/js/components/preact/users/RoleManagerModal.jsx web/js/components/preact/users/TotpSetupModal.jsx --format json --output-file build/eng-artifacts/T7.187/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.187/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/label-has-for'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.187.md", + "finding_ids": [ + "ESLINT-BUCKET-2e14d60ae388c180", + "ESLINT-BUCKET-9a54a74c58d29d4c" + ], + "rule_id": "jsx-a11y/label-has-for", + "reproducers": [ + { + "id": "ESLINT-BUCKET-2e14d60ae388c180", + "path": "web/js/components/preact/users/RoleManagerModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/users/RoleManagerModal.jsx", + "original_count": 3, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-9a54a74c58d29d4c", + "path": "web/js/components/preact/users/TotpSetupModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/users/TotpSetupModal.jsx", + "original_count": 1, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.188", + "title": "jsx-a11y/media-has-caption in HLSVideoCell.jsx, MSEVideoCell.jsx, UI.jsx, WebRTCVideoCell.jsx, InvestigationView.jsx, TimelinePlayer.jsx", + "depends_on": [ + "T7", + "T10", + "T7.166", + "T7.167", + "T7.180", + "T7.168", + "T7.182", + "T7.185" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/UI.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx", + "web/js/components/preact/investigation/InvestigationView.jsx", + "web/js/components/preact/timeline/TimelinePlayer.jsx", + "web/tests/remediation/t7_188.spec.jsx", + "quality/evidence/T7.188.md" + ], + "source_paths": [ + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/UI.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx", + "web/js/components/preact/investigation/InvestigationView.jsx", + "web/js/components/preact/timeline/TimelinePlayer.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Identify prerecorded speech versus live/silent surveillance streams; provide applicable caption support, or an explicitly reviewed narrow semantic exception with evidence. Never add a fake empty caption track.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_188", + "mkdir -p build/eng-artifacts/T7.188", + "web/node_modules/.bin/eslint web/js/components/preact/HLSVideoCell.jsx web/js/components/preact/MSEVideoCell.jsx web/js/components/preact/UI.jsx web/js/components/preact/WebRTCVideoCell.jsx web/js/components/preact/investigation/InvestigationView.jsx web/js/components/preact/timeline/TimelinePlayer.jsx --format json --output-file build/eng-artifacts/T7.188/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.188/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/media-has-caption'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.188.md", + "finding_ids": [ + "ESLINT-BUCKET-165a348ebdcecd71", + "ESLINT-BUCKET-1760eab07e0cce49", + "ESLINT-BUCKET-df0c5f209b6ef6ab", + "ESLINT-BUCKET-c464a6c1e23bf196", + "ESLINT-BUCKET-de50a4c99ae7d421", + "ESLINT-BUCKET-7189b497b5a855df" + ], + "rule_id": "jsx-a11y/media-has-caption", + "reproducers": [ + { + "id": "ESLINT-BUCKET-165a348ebdcecd71", + "path": "web/js/components/preact/HLSVideoCell.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/media-has-caption:web/js/components/preact/HLSVideoCell.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-1760eab07e0cce49", + "path": "web/js/components/preact/MSEVideoCell.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/media-has-caption:web/js/components/preact/MSEVideoCell.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-df0c5f209b6ef6ab", + "path": "web/js/components/preact/UI.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/media-has-caption:web/js/components/preact/UI.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-c464a6c1e23bf196", + "path": "web/js/components/preact/WebRTCVideoCell.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/media-has-caption:web/js/components/preact/WebRTCVideoCell.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-de50a4c99ae7d421", + "path": "web/js/components/preact/investigation/InvestigationView.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/media-has-caption:web/js/components/preact/investigation/InvestigationView.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-7189b497b5a855df", + "path": "web/js/components/preact/timeline/TimelinePlayer.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/media-has-caption:web/js/components/preact/timeline/TimelinePlayer.jsx", + "original_count": 1, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.189", + "title": "jsx-a11y/mouse-events-have-key-events in DayNightControl.jsx, HLSVideoCell.jsx, SnapshotManager.jsx, StreamCard.jsx, StreamsView.jsx, Toast.jsx", + "depends_on": [ + "T7", + "T10", + "T7.188", + "T7.167", + "T7.180" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/DayNightControl.jsx", + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/SnapshotManager.jsx", + "web/js/components/preact/StreamCard.jsx", + "web/js/components/preact/StreamsView.jsx", + "web/js/components/preact/Toast.jsx", + "web/tests/remediation/t7_189.spec.jsx", + "quality/evidence/T7.189.md" + ], + "source_paths": [ + "web/js/components/preact/DayNightControl.jsx", + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/SnapshotManager.jsx", + "web/js/components/preact/StreamCard.jsx", + "web/js/components/preact/StreamsView.jsx", + "web/js/components/preact/Toast.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Assert focus/blur and mouse enter/leave expose and dismiss the same content without trapping focus.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_189", + "mkdir -p build/eng-artifacts/T7.189", + "web/node_modules/.bin/eslint web/js/components/preact/DayNightControl.jsx web/js/components/preact/HLSVideoCell.jsx web/js/components/preact/SnapshotManager.jsx web/js/components/preact/StreamCard.jsx web/js/components/preact/StreamsView.jsx web/js/components/preact/Toast.jsx --format json --output-file build/eng-artifacts/T7.189/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.189/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/mouse-events-have-key-events'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.189.md", + "finding_ids": [ + "ESLINT-BUCKET-bc4e9a8b10d83163", + "ESLINT-BUCKET-c31a4d9816cac7ce", + "ESLINT-BUCKET-e715a00f3dbe2f4f", + "ESLINT-BUCKET-9a70a1ccf37b9405", + "ESLINT-BUCKET-e876245abbef0a79", + "ESLINT-BUCKET-c811624672d6bfff" + ], + "rule_id": "jsx-a11y/mouse-events-have-key-events", + "reproducers": [ + { + "id": "ESLINT-BUCKET-bc4e9a8b10d83163", + "path": "web/js/components/preact/DayNightControl.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/mouse-events-have-key-events:web/js/components/preact/DayNightControl.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-c31a4d9816cac7ce", + "path": "web/js/components/preact/HLSVideoCell.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/mouse-events-have-key-events:web/js/components/preact/HLSVideoCell.jsx", + "original_count": 14, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-e715a00f3dbe2f4f", + "path": "web/js/components/preact/SnapshotManager.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/mouse-events-have-key-events:web/js/components/preact/SnapshotManager.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-9a70a1ccf37b9405", + "path": "web/js/components/preact/StreamCard.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/mouse-events-have-key-events:web/js/components/preact/StreamCard.jsx", + "original_count": 8, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-e876245abbef0a79", + "path": "web/js/components/preact/StreamsView.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/mouse-events-have-key-events:web/js/components/preact/StreamsView.jsx", + "original_count": 4, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-c811624672d6bfff", + "path": "web/js/components/preact/Toast.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/mouse-events-have-key-events:web/js/components/preact/Toast.jsx", + "original_count": 2, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.190", + "title": "jsx-a11y/mouse-events-have-key-events in WebRTCVideoCell.jsx, RecordingsTable.jsx, TimelinePage.jsx", + "depends_on": [ + "T7", + "T10", + "T7.188", + "T7.183", + "T7.185" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/WebRTCVideoCell.jsx", + "web/js/components/preact/recordings/RecordingsTable.jsx", + "web/js/components/preact/timeline/TimelinePage.jsx", + "web/tests/remediation/t7_190.spec.jsx", + "quality/evidence/T7.190.md" + ], + "source_paths": [ + "web/js/components/preact/WebRTCVideoCell.jsx", + "web/js/components/preact/recordings/RecordingsTable.jsx", + "web/js/components/preact/timeline/TimelinePage.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Assert focus/blur and mouse enter/leave expose and dismiss the same content without trapping focus.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_190", + "mkdir -p build/eng-artifacts/T7.190", + "web/node_modules/.bin/eslint web/js/components/preact/WebRTCVideoCell.jsx web/js/components/preact/recordings/RecordingsTable.jsx web/js/components/preact/timeline/TimelinePage.jsx --format json --output-file build/eng-artifacts/T7.190/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.190/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/mouse-events-have-key-events'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.190.md", + "finding_ids": [ + "ESLINT-BUCKET-a4f59c579d19ce1e", + "ESLINT-BUCKET-7a540f91903a1e57", + "ESLINT-BUCKET-dcdb657c2038e332" + ], + "rule_id": "jsx-a11y/mouse-events-have-key-events", + "reproducers": [ + { + "id": "ESLINT-BUCKET-a4f59c579d19ce1e", + "path": "web/js/components/preact/WebRTCVideoCell.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/mouse-events-have-key-events:web/js/components/preact/WebRTCVideoCell.jsx", + "original_count": 18, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-7a540f91903a1e57", + "path": "web/js/components/preact/recordings/RecordingsTable.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/mouse-events-have-key-events:web/js/components/preact/recordings/RecordingsTable.jsx", + "original_count": 10, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-dcdb657c2038e332", + "path": "web/js/components/preact/timeline/TimelinePage.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/mouse-events-have-key-events:web/js/components/preact/timeline/TimelinePage.jsx", + "original_count": 10, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.191", + "title": "jsx-a11y/no-autofocus in AuthGate.jsx, LoginView.jsx, EventDestinationEditor.jsx, EventRouteEditor.jsx, CollectionManager.jsx, OrganizationManager.jsx", + "depends_on": [ + "T7", + "T10", + "T7.179", + "T7.181", + "T7.182" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/AuthGate.jsx", + "web/js/components/preact/LoginView.jsx", + "web/js/components/preact/events/EventDestinationEditor.jsx", + "web/js/components/preact/events/EventRouteEditor.jsx", + "web/js/components/preact/fleet/CollectionManager.jsx", + "web/js/components/preact/fleet/OrganizationManager.jsx", + "web/tests/remediation/t7_191.spec.jsx", + "quality/evidence/T7.191.md" + ], + "source_paths": [ + "web/js/components/preact/AuthGate.jsx", + "web/js/components/preact/LoginView.jsx", + "web/js/components/preact/events/EventDestinationEditor.jsx", + "web/js/components/preact/events/EventRouteEditor.jsx", + "web/js/components/preact/fleet/CollectionManager.jsx", + "web/js/components/preact/fleet/OrganizationManager.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Assert initial render does not steal focus; explicit dialog-open focus management must return focus to the invoker on close.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_191", + "mkdir -p build/eng-artifacts/T7.191", + "web/node_modules/.bin/eslint web/js/components/preact/AuthGate.jsx web/js/components/preact/LoginView.jsx web/js/components/preact/events/EventDestinationEditor.jsx web/js/components/preact/events/EventRouteEditor.jsx web/js/components/preact/fleet/CollectionManager.jsx web/js/components/preact/fleet/OrganizationManager.jsx --format json --output-file build/eng-artifacts/T7.191/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.191/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/no-autofocus'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.191.md", + "finding_ids": [ + "ESLINT-BUCKET-20016996a3c7e096", + "ESLINT-BUCKET-92718cbd3fc79c29", + "ESLINT-BUCKET-71520b6429344586", + "ESLINT-BUCKET-82f90000b805b238", + "ESLINT-BUCKET-2acf09b0886c70c8", + "ESLINT-BUCKET-e6884093b3a77737" + ], + "rule_id": "jsx-a11y/no-autofocus", + "reproducers": [ + { + "id": "ESLINT-BUCKET-20016996a3c7e096", + "path": "web/js/components/preact/AuthGate.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-autofocus:web/js/components/preact/AuthGate.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-92718cbd3fc79c29", + "path": "web/js/components/preact/LoginView.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-autofocus:web/js/components/preact/LoginView.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-71520b6429344586", + "path": "web/js/components/preact/events/EventDestinationEditor.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-autofocus:web/js/components/preact/events/EventDestinationEditor.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-82f90000b805b238", + "path": "web/js/components/preact/events/EventRouteEditor.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-autofocus:web/js/components/preact/events/EventRouteEditor.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-2acf09b0886c70c8", + "path": "web/js/components/preact/fleet/CollectionManager.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-autofocus:web/js/components/preact/fleet/CollectionManager.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-e6884093b3a77737", + "path": "web/js/components/preact/fleet/OrganizationManager.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-autofocus:web/js/components/preact/fleet/OrganizationManager.jsx", + "original_count": 3, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.192", + "title": "jsx-a11y/no-autofocus in InvestigationBookmarks.jsx, TotpSetupModal.jsx", + "depends_on": [ + "T7", + "T10", + "T7.182", + "T7.187" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/investigation/InvestigationBookmarks.jsx", + "web/js/components/preact/users/TotpSetupModal.jsx", + "web/tests/remediation/t7_192.spec.jsx", + "quality/evidence/T7.192.md" + ], + "source_paths": [ + "web/js/components/preact/investigation/InvestigationBookmarks.jsx", + "web/js/components/preact/users/TotpSetupModal.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Assert initial render does not steal focus; explicit dialog-open focus management must return focus to the invoker on close.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_192", + "mkdir -p build/eng-artifacts/T7.192", + "web/node_modules/.bin/eslint web/js/components/preact/investigation/InvestigationBookmarks.jsx web/js/components/preact/users/TotpSetupModal.jsx --format json --output-file build/eng-artifacts/T7.192/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.192/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/no-autofocus'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.192.md", + "finding_ids": [ + "ESLINT-BUCKET-24d767472f9eac0b", + "ESLINT-BUCKET-6040ad491a730d6d" + ], + "rule_id": "jsx-a11y/no-autofocus", + "reproducers": [ + { + "id": "ESLINT-BUCKET-24d767472f9eac0b", + "path": "web/js/components/preact/investigation/InvestigationBookmarks.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-autofocus:web/js/components/preact/investigation/InvestigationBookmarks.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-6040ad491a730d6d", + "path": "web/js/components/preact/users/TotpSetupModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-autofocus:web/js/components/preact/users/TotpSetupModal.jsx", + "original_count": 1, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.193", + "title": "jsx-a11y/no-noninteractive-element-interactions in FisheyeEptzCanvas.jsx, StreamCard.jsx, ZoneEditor.jsx, LanguageSelector.jsx, InvestigationView.jsx, LiveBuildingPlan.jsx", + "depends_on": [ + "T7", + "T10", + "T7.189", + "T7.180", + "T7.162", + "T7.188", + "T7.183" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/FisheyeEptzCanvas.jsx", + "web/js/components/preact/StreamCard.jsx", + "web/js/components/preact/ZoneEditor.jsx", + "web/js/components/preact/common/LanguageSelector.jsx", + "web/js/components/preact/investigation/InvestigationView.jsx", + "web/js/components/preact/live/LiveBuildingPlan.jsx", + "web/tests/remediation/t7_193.spec.jsx", + "quality/evidence/T7.193.md" + ], + "source_paths": [ + "web/js/components/preact/FisheyeEptzCanvas.jsx", + "web/js/components/preact/StreamCard.jsx", + "web/js/components/preact/ZoneEditor.jsx", + "web/js/components/preact/common/LanguageSelector.jsx", + "web/js/components/preact/investigation/InvestigationView.jsx", + "web/js/components/preact/live/LiveBuildingPlan.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Remove unintended interactive behavior from structural elements or expose correct interactive semantics; preserve nested-control propagation and keyboard behavior.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_193", + "mkdir -p build/eng-artifacts/T7.193", + "web/node_modules/.bin/eslint web/js/components/preact/FisheyeEptzCanvas.jsx web/js/components/preact/StreamCard.jsx web/js/components/preact/ZoneEditor.jsx web/js/components/preact/common/LanguageSelector.jsx web/js/components/preact/investigation/InvestigationView.jsx web/js/components/preact/live/LiveBuildingPlan.jsx --format json --output-file build/eng-artifacts/T7.193/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.193/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/no-noninteractive-element-interactions'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.193.md", + "finding_ids": [ + "ESLINT-BUCKET-d8c2127f8046b560", + "ESLINT-BUCKET-e4342be069acaf24", + "ESLINT-BUCKET-141e103765b7c505", + "ESLINT-BUCKET-370c727cb2690828", + "ESLINT-BUCKET-bf7012d93c48094c", + "ESLINT-BUCKET-11c6ba5b7bf02e40" + ], + "rule_id": "jsx-a11y/no-noninteractive-element-interactions", + "reproducers": [ + { + "id": "ESLINT-BUCKET-d8c2127f8046b560", + "path": "web/js/components/preact/FisheyeEptzCanvas.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/FisheyeEptzCanvas.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-e4342be069acaf24", + "path": "web/js/components/preact/StreamCard.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/StreamCard.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-141e103765b7c505", + "path": "web/js/components/preact/ZoneEditor.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/ZoneEditor.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-370c727cb2690828", + "path": "web/js/components/preact/common/LanguageSelector.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/common/LanguageSelector.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-bf7012d93c48094c", + "path": "web/js/components/preact/investigation/InvestigationView.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/investigation/InvestigationView.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-11c6ba5b7bf02e40", + "path": "web/js/components/preact/live/LiveBuildingPlan.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/live/LiveBuildingPlan.jsx", + "original_count": 1, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.194", + "title": "jsx-a11y/no-noninteractive-element-interactions in LiveOperatorNavigator.jsx, RecordingsGrid.jsx, TimelineCursor.jsx, TimelineSegments.jsx, AccessPolicyModal.jsx, AddUserModal.jsx", + "depends_on": [ + "T7", + "T10", + "T7.183", + "T7.186" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/live/LiveOperatorNavigator.jsx", + "web/js/components/preact/recordings/RecordingsGrid.jsx", + "web/js/components/preact/timeline/TimelineCursor.jsx", + "web/js/components/preact/timeline/TimelineSegments.jsx", + "web/js/components/preact/users/AccessPolicyModal.jsx", + "web/js/components/preact/users/AddUserModal.jsx", + "web/tests/remediation/t7_194.spec.jsx", + "quality/evidence/T7.194.md" + ], + "source_paths": [ + "web/js/components/preact/live/LiveOperatorNavigator.jsx", + "web/js/components/preact/recordings/RecordingsGrid.jsx", + "web/js/components/preact/timeline/TimelineCursor.jsx", + "web/js/components/preact/timeline/TimelineSegments.jsx", + "web/js/components/preact/users/AccessPolicyModal.jsx", + "web/js/components/preact/users/AddUserModal.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Remove unintended interactive behavior from structural elements or expose correct interactive semantics; preserve nested-control propagation and keyboard behavior.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_194", + "mkdir -p build/eng-artifacts/T7.194", + "web/node_modules/.bin/eslint web/js/components/preact/live/LiveOperatorNavigator.jsx web/js/components/preact/recordings/RecordingsGrid.jsx web/js/components/preact/timeline/TimelineCursor.jsx web/js/components/preact/timeline/TimelineSegments.jsx web/js/components/preact/users/AccessPolicyModal.jsx web/js/components/preact/users/AddUserModal.jsx --format json --output-file build/eng-artifacts/T7.194/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.194/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/no-noninteractive-element-interactions'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.194.md", + "finding_ids": [ + "ESLINT-BUCKET-87cfe9ce5d499faf", + "ESLINT-BUCKET-4d679d89b4da6865", + "ESLINT-BUCKET-d670cad0625d4f2c", + "ESLINT-BUCKET-03caeab009bdc4fd", + "ESLINT-BUCKET-939df4abd7adefdd", + "ESLINT-BUCKET-4cf2eab3dda13b90" + ], + "rule_id": "jsx-a11y/no-noninteractive-element-interactions", + "reproducers": [ + { + "id": "ESLINT-BUCKET-87cfe9ce5d499faf", + "path": "web/js/components/preact/live/LiveOperatorNavigator.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/live/LiveOperatorNavigator.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-4d679d89b4da6865", + "path": "web/js/components/preact/recordings/RecordingsGrid.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/recordings/RecordingsGrid.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-d670cad0625d4f2c", + "path": "web/js/components/preact/timeline/TimelineCursor.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/timeline/TimelineCursor.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-03caeab009bdc4fd", + "path": "web/js/components/preact/timeline/TimelineSegments.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/timeline/TimelineSegments.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-939df4abd7adefdd", + "path": "web/js/components/preact/users/AccessPolicyModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/users/AccessPolicyModal.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-4cf2eab3dda13b90", + "path": "web/js/components/preact/users/AddUserModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/users/AddUserModal.jsx", + "original_count": 1, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.195", + "title": "jsx-a11y/no-noninteractive-element-interactions in ApiKeyModal.jsx, AuditHistoryModal.jsx, EditUserModal.jsx, RoleManagerModal.jsx", + "depends_on": [ + "T7", + "T10", + "T7.186", + "T7.187" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/users/ApiKeyModal.jsx", + "web/js/components/preact/users/AuditHistoryModal.jsx", + "web/js/components/preact/users/EditUserModal.jsx", + "web/js/components/preact/users/RoleManagerModal.jsx", + "web/tests/remediation/t7_195.spec.jsx", + "quality/evidence/T7.195.md" + ], + "source_paths": [ + "web/js/components/preact/users/ApiKeyModal.jsx", + "web/js/components/preact/users/AuditHistoryModal.jsx", + "web/js/components/preact/users/EditUserModal.jsx", + "web/js/components/preact/users/RoleManagerModal.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Remove unintended interactive behavior from structural elements or expose correct interactive semantics; preserve nested-control propagation and keyboard behavior.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_195", + "mkdir -p build/eng-artifacts/T7.195", + "web/node_modules/.bin/eslint web/js/components/preact/users/ApiKeyModal.jsx web/js/components/preact/users/AuditHistoryModal.jsx web/js/components/preact/users/EditUserModal.jsx web/js/components/preact/users/RoleManagerModal.jsx --format json --output-file build/eng-artifacts/T7.195/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.195/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/no-noninteractive-element-interactions'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.195.md", + "finding_ids": [ + "ESLINT-BUCKET-68103860cfe78d89", + "ESLINT-BUCKET-be996c224380b85e", + "ESLINT-BUCKET-65f403c439392041", + "ESLINT-BUCKET-752682010e0c301c" + ], + "rule_id": "jsx-a11y/no-noninteractive-element-interactions", + "reproducers": [ + { + "id": "ESLINT-BUCKET-68103860cfe78d89", + "path": "web/js/components/preact/users/ApiKeyModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/users/ApiKeyModal.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-be996c224380b85e", + "path": "web/js/components/preact/users/AuditHistoryModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/users/AuditHistoryModal.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-65f403c439392041", + "path": "web/js/components/preact/users/EditUserModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/users/EditUserModal.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-752682010e0c301c", + "path": "web/js/components/preact/users/RoleManagerModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/users/RoleManagerModal.jsx", + "original_count": 1, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.196", + "title": "jsx-a11y/no-noninteractive-tabindex in FisheyeEptzCanvas.jsx, LanguageSelector.jsx", + "depends_on": [ + "T7", + "T10", + "T7.193" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/FisheyeEptzCanvas.jsx", + "web/js/components/preact/common/LanguageSelector.jsx", + "web/tests/remediation/t7_196.spec.jsx", + "quality/evidence/T7.196.md" + ], + "source_paths": [ + "web/js/components/preact/FisheyeEptzCanvas.jsx", + "web/js/components/preact/common/LanguageSelector.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Assert the tab order includes only intended interactive controls; keyboard navigation of composite widgets must follow their documented role.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_196", + "mkdir -p build/eng-artifacts/T7.196", + "web/node_modules/.bin/eslint web/js/components/preact/FisheyeEptzCanvas.jsx web/js/components/preact/common/LanguageSelector.jsx --format json --output-file build/eng-artifacts/T7.196/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.196/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/no-noninteractive-tabindex'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.196.md", + "finding_ids": [ + "ESLINT-BUCKET-f32c4fd5a51337d3", + "ESLINT-BUCKET-d5958c65428cdc31" + ], + "rule_id": "jsx-a11y/no-noninteractive-tabindex", + "reproducers": [ + { + "id": "ESLINT-BUCKET-f32c4fd5a51337d3", + "path": "web/js/components/preact/FisheyeEptzCanvas.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-tabindex:web/js/components/preact/FisheyeEptzCanvas.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-d5958c65428cdc31", + "path": "web/js/components/preact/common/LanguageSelector.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-tabindex:web/js/components/preact/common/LanguageSelector.jsx", + "original_count": 1, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.197", + "title": "jsx-a11y/no-static-element-interactions in GridPicker.jsx, HLSVideoCell.jsx, HealthView.jsx, LiveView.jsx, MSEVideoCell.jsx, StreamCard.jsx", + "depends_on": [ + "T7", + "T10", + "T7.161", + "T7.189", + "T7.179", + "T7.188", + "T7.193" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/GridPicker.jsx", + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/HealthView.jsx", + "web/js/components/preact/LiveView.jsx", + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/StreamCard.jsx", + "web/tests/remediation/t7_197.spec.jsx", + "quality/evidence/T7.197.md" + ], + "source_paths": [ + "web/js/components/preact/GridPicker.jsx", + "web/js/components/preact/HLSVideoCell.jsx", + "web/js/components/preact/HealthView.jsx", + "web/js/components/preact/LiveView.jsx", + "web/js/components/preact/MSEVideoCell.jsx", + "web/js/components/preact/StreamCard.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Make reported actions native interactive controls or provide correct role, focus and keyboard activation; pointer and keyboard must execute the same action once.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_197", + "mkdir -p build/eng-artifacts/T7.197", + "web/node_modules/.bin/eslint web/js/components/preact/GridPicker.jsx web/js/components/preact/HLSVideoCell.jsx web/js/components/preact/HealthView.jsx web/js/components/preact/LiveView.jsx web/js/components/preact/MSEVideoCell.jsx web/js/components/preact/StreamCard.jsx --format json --output-file build/eng-artifacts/T7.197/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.197/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/no-static-element-interactions'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.197.md", + "finding_ids": [ + "ESLINT-BUCKET-45ebdb33421d89d5", + "ESLINT-BUCKET-d6af678aacfbb026", + "ESLINT-BUCKET-e48ab90f6d76f69a", + "ESLINT-BUCKET-6cf65d94c0e817c8", + "ESLINT-BUCKET-d0493f3174391c77", + "ESLINT-BUCKET-134e1087e8cda477" + ], + "rule_id": "jsx-a11y/no-static-element-interactions", + "reproducers": [ + { + "id": "ESLINT-BUCKET-45ebdb33421d89d5", + "path": "web/js/components/preact/GridPicker.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/GridPicker.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-d6af678aacfbb026", + "path": "web/js/components/preact/HLSVideoCell.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/HLSVideoCell.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-e48ab90f6d76f69a", + "path": "web/js/components/preact/HealthView.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/HealthView.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-6cf65d94c0e817c8", + "path": "web/js/components/preact/LiveView.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/LiveView.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-d0493f3174391c77", + "path": "web/js/components/preact/MSEVideoCell.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/MSEVideoCell.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-134e1087e8cda477", + "path": "web/js/components/preact/StreamCard.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/StreamCard.jsx", + "original_count": 1, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.198", + "title": "jsx-a11y/no-static-element-interactions in StreamConfigModal.jsx, StreamsView.jsx, ToastContainer.jsx, UI.jsx, WebRTCVideoCell.jsx, ZoneEditor.jsx", + "depends_on": [ + "T7", + "T10", + "T7.180", + "T7.189", + "T7.162", + "T7.188", + "T7.190", + "T7.193" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/StreamConfigModal.jsx", + "web/js/components/preact/StreamsView.jsx", + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/UI.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx", + "web/js/components/preact/ZoneEditor.jsx", + "web/tests/remediation/t7_198.spec.jsx", + "quality/evidence/T7.198.md" + ], + "source_paths": [ + "web/js/components/preact/StreamConfigModal.jsx", + "web/js/components/preact/StreamsView.jsx", + "web/js/components/preact/ToastContainer.jsx", + "web/js/components/preact/UI.jsx", + "web/js/components/preact/WebRTCVideoCell.jsx", + "web/js/components/preact/ZoneEditor.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Make reported actions native interactive controls or provide correct role, focus and keyboard activation; pointer and keyboard must execute the same action once.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_198", + "mkdir -p build/eng-artifacts/T7.198", + "web/node_modules/.bin/eslint web/js/components/preact/StreamConfigModal.jsx web/js/components/preact/StreamsView.jsx web/js/components/preact/ToastContainer.jsx web/js/components/preact/UI.jsx web/js/components/preact/WebRTCVideoCell.jsx web/js/components/preact/ZoneEditor.jsx --format json --output-file build/eng-artifacts/T7.198/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.198/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/no-static-element-interactions'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.198.md", + "finding_ids": [ + "ESLINT-BUCKET-8a059d804561f236", + "ESLINT-BUCKET-21e6c2fa9c26c964", + "ESLINT-BUCKET-b18881a630321191", + "ESLINT-BUCKET-d9d81163d1e1193d", + "ESLINT-BUCKET-3322f39793a9258c", + "ESLINT-BUCKET-6bdf7c909180cb5e" + ], + "rule_id": "jsx-a11y/no-static-element-interactions", + "reproducers": [ + { + "id": "ESLINT-BUCKET-8a059d804561f236", + "path": "web/js/components/preact/StreamConfigModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/StreamConfigModal.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-21e6c2fa9c26c964", + "path": "web/js/components/preact/StreamsView.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/StreamsView.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-b18881a630321191", + "path": "web/js/components/preact/ToastContainer.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/ToastContainer.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-d9d81163d1e1193d", + "path": "web/js/components/preact/UI.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/UI.jsx", + "original_count": 3, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-3322f39793a9258c", + "path": "web/js/components/preact/WebRTCVideoCell.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/WebRTCVideoCell.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-6bdf7c909180cb5e", + "path": "web/js/components/preact/ZoneEditor.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/ZoneEditor.jsx", + "original_count": 1, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.199", + "title": "jsx-a11y/no-static-element-interactions in ModalDialog.jsx, BulkOrganizeModal.jsx, CollectionManager.jsx, OrganizationManager.jsx, LiveBuildingPlan.jsx, LiveOperatorNavigator.jsx", + "depends_on": [ + "T7", + "T10", + "T7.180", + "T7.181", + "T7.191", + "T7.193", + "T7.194" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/common/ModalDialog.jsx", + "web/js/components/preact/fleet/BulkOrganizeModal.jsx", + "web/js/components/preact/fleet/CollectionManager.jsx", + "web/js/components/preact/fleet/OrganizationManager.jsx", + "web/js/components/preact/live/LiveBuildingPlan.jsx", + "web/js/components/preact/live/LiveOperatorNavigator.jsx", + "web/tests/remediation/t7_199.spec.jsx", + "quality/evidence/T7.199.md" + ], + "source_paths": [ + "web/js/components/preact/common/ModalDialog.jsx", + "web/js/components/preact/fleet/BulkOrganizeModal.jsx", + "web/js/components/preact/fleet/CollectionManager.jsx", + "web/js/components/preact/fleet/OrganizationManager.jsx", + "web/js/components/preact/live/LiveBuildingPlan.jsx", + "web/js/components/preact/live/LiveOperatorNavigator.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Make reported actions native interactive controls or provide correct role, focus and keyboard activation; pointer and keyboard must execute the same action once.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_199", + "mkdir -p build/eng-artifacts/T7.199", + "web/node_modules/.bin/eslint web/js/components/preact/common/ModalDialog.jsx web/js/components/preact/fleet/BulkOrganizeModal.jsx web/js/components/preact/fleet/CollectionManager.jsx web/js/components/preact/fleet/OrganizationManager.jsx web/js/components/preact/live/LiveBuildingPlan.jsx web/js/components/preact/live/LiveOperatorNavigator.jsx --format json --output-file build/eng-artifacts/T7.199/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.199/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/no-static-element-interactions'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.199.md", + "finding_ids": [ + "ESLINT-BUCKET-243fa74ece4acc83", + "ESLINT-BUCKET-aa87081e964848f0", + "ESLINT-BUCKET-b9126919c0a748d2", + "ESLINT-BUCKET-ac70bbab0047fa80", + "ESLINT-BUCKET-23073b0c71d7d2e3", + "ESLINT-BUCKET-be705595f12d1850" + ], + "rule_id": "jsx-a11y/no-static-element-interactions", + "reproducers": [ + { + "id": "ESLINT-BUCKET-243fa74ece4acc83", + "path": "web/js/components/preact/common/ModalDialog.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/common/ModalDialog.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-aa87081e964848f0", + "path": "web/js/components/preact/fleet/BulkOrganizeModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/fleet/BulkOrganizeModal.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-b9126919c0a748d2", + "path": "web/js/components/preact/fleet/CollectionManager.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/fleet/CollectionManager.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-ac70bbab0047fa80", + "path": "web/js/components/preact/fleet/OrganizationManager.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/fleet/OrganizationManager.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-23073b0c71d7d2e3", + "path": "web/js/components/preact/live/LiveBuildingPlan.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/live/LiveBuildingPlan.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-be705595f12d1850", + "path": "web/js/components/preact/live/LiveOperatorNavigator.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/live/LiveOperatorNavigator.jsx", + "original_count": 1, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.200", + "title": "jsx-a11y/no-static-element-interactions in RecordingsGrid.jsx, Go2rtcTab.jsx, ClearLogsModal.jsx, RestartModal.jsx, TimelinePlayer.jsx, AccessPolicyModal.jsx", + "depends_on": [ + "T7", + "T10", + "T7.194", + "T7.184", + "T7.163", + "T7.188" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/recordings/RecordingsGrid.jsx", + "web/js/components/preact/settings/Go2rtcTab.jsx", + "web/js/components/preact/system/ClearLogsModal.jsx", + "web/js/components/preact/system/RestartModal.jsx", + "web/js/components/preact/timeline/TimelinePlayer.jsx", + "web/js/components/preact/users/AccessPolicyModal.jsx", + "web/tests/remediation/t7_200.spec.jsx", + "quality/evidence/T7.200.md" + ], + "source_paths": [ + "web/js/components/preact/recordings/RecordingsGrid.jsx", + "web/js/components/preact/settings/Go2rtcTab.jsx", + "web/js/components/preact/system/ClearLogsModal.jsx", + "web/js/components/preact/system/RestartModal.jsx", + "web/js/components/preact/timeline/TimelinePlayer.jsx", + "web/js/components/preact/users/AccessPolicyModal.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Make reported actions native interactive controls or provide correct role, focus and keyboard activation; pointer and keyboard must execute the same action once.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_200", + "mkdir -p build/eng-artifacts/T7.200", + "web/node_modules/.bin/eslint web/js/components/preact/recordings/RecordingsGrid.jsx web/js/components/preact/settings/Go2rtcTab.jsx web/js/components/preact/system/ClearLogsModal.jsx web/js/components/preact/system/RestartModal.jsx web/js/components/preact/timeline/TimelinePlayer.jsx web/js/components/preact/users/AccessPolicyModal.jsx --format json --output-file build/eng-artifacts/T7.200/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.200/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/no-static-element-interactions'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.200.md", + "finding_ids": [ + "ESLINT-BUCKET-55a74c5d3180cf15", + "ESLINT-BUCKET-fd743aa60d9abb1f", + "ESLINT-BUCKET-fbc7ca1e0083c1d1", + "ESLINT-BUCKET-259ca1824a1d1447", + "ESLINT-BUCKET-c06de8e6c5473e61", + "ESLINT-BUCKET-6bab06cb3c8102a9" + ], + "rule_id": "jsx-a11y/no-static-element-interactions", + "reproducers": [ + { + "id": "ESLINT-BUCKET-55a74c5d3180cf15", + "path": "web/js/components/preact/recordings/RecordingsGrid.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/recordings/RecordingsGrid.jsx", + "original_count": 4, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-fd743aa60d9abb1f", + "path": "web/js/components/preact/settings/Go2rtcTab.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/settings/Go2rtcTab.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-fbc7ca1e0083c1d1", + "path": "web/js/components/preact/system/ClearLogsModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/system/ClearLogsModal.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-259ca1824a1d1447", + "path": "web/js/components/preact/system/RestartModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/system/RestartModal.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-c06de8e6c5473e61", + "path": "web/js/components/preact/timeline/TimelinePlayer.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/timeline/TimelinePlayer.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-6bab06cb3c8102a9", + "path": "web/js/components/preact/users/AccessPolicyModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/users/AccessPolicyModal.jsx", + "original_count": 1, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.201", + "title": "jsx-a11y/no-static-element-interactions in AddUserModal.jsx, ApiKeyModal.jsx, AuditHistoryModal.jsx, DeleteUserModal.jsx, EditUserModal.jsx, RoleManagerModal.jsx", + "depends_on": [ + "T7", + "T10", + "T7.194", + "T7.195", + "T7.164" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/users/AddUserModal.jsx", + "web/js/components/preact/users/ApiKeyModal.jsx", + "web/js/components/preact/users/AuditHistoryModal.jsx", + "web/js/components/preact/users/DeleteUserModal.jsx", + "web/js/components/preact/users/EditUserModal.jsx", + "web/js/components/preact/users/RoleManagerModal.jsx", + "web/tests/remediation/t7_201.spec.jsx", + "quality/evidence/T7.201.md" + ], + "source_paths": [ + "web/js/components/preact/users/AddUserModal.jsx", + "web/js/components/preact/users/ApiKeyModal.jsx", + "web/js/components/preact/users/AuditHistoryModal.jsx", + "web/js/components/preact/users/DeleteUserModal.jsx", + "web/js/components/preact/users/EditUserModal.jsx", + "web/js/components/preact/users/RoleManagerModal.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Make reported actions native interactive controls or provide correct role, focus and keyboard activation; pointer and keyboard must execute the same action once.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_201", + "mkdir -p build/eng-artifacts/T7.201", + "web/node_modules/.bin/eslint web/js/components/preact/users/AddUserModal.jsx web/js/components/preact/users/ApiKeyModal.jsx web/js/components/preact/users/AuditHistoryModal.jsx web/js/components/preact/users/DeleteUserModal.jsx web/js/components/preact/users/EditUserModal.jsx web/js/components/preact/users/RoleManagerModal.jsx --format json --output-file build/eng-artifacts/T7.201/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.201/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/no-static-element-interactions'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.201.md", + "finding_ids": [ + "ESLINT-BUCKET-3ace786e8c2cd1a8", + "ESLINT-BUCKET-08d8785eb7476330", + "ESLINT-BUCKET-51093f104f4e1cbb", + "ESLINT-BUCKET-7c82f257c4fb1103", + "ESLINT-BUCKET-c4dd2be3483455e5", + "ESLINT-BUCKET-5c8c07852ed0b107" + ], + "rule_id": "jsx-a11y/no-static-element-interactions", + "reproducers": [ + { + "id": "ESLINT-BUCKET-3ace786e8c2cd1a8", + "path": "web/js/components/preact/users/AddUserModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/users/AddUserModal.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-08d8785eb7476330", + "path": "web/js/components/preact/users/ApiKeyModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/users/ApiKeyModal.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-51093f104f4e1cbb", + "path": "web/js/components/preact/users/AuditHistoryModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/users/AuditHistoryModal.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-7c82f257c4fb1103", + "path": "web/js/components/preact/users/DeleteUserModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/users/DeleteUserModal.jsx", + "original_count": 2, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-c4dd2be3483455e5", + "path": "web/js/components/preact/users/EditUserModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/users/EditUserModal.jsx", + "original_count": 1, + "scanner": "eslint-web" + }, + { + "id": "ESLINT-BUCKET-5c8c07852ed0b107", + "path": "web/js/components/preact/users/RoleManagerModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/users/RoleManagerModal.jsx", + "original_count": 1, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.202", + "title": "jsx-a11y/no-static-element-interactions in TotpSetupModal.jsx", + "depends_on": [ + "T7", + "T10", + "T7.192" + ], + "kind": "web-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/users/TotpSetupModal.jsx", + "web/tests/remediation/t7_202.spec.jsx", + "quality/evidence/T7.202.md" + ], + "source_paths": [ + "web/js/components/preact/users/TotpSetupModal.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Make reported actions native interactive controls or provide correct role, focus and keyboard activation; pointer and keyboard must execute the same action once.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_202", + "mkdir -p build/eng-artifacts/T7.202", + "web/node_modules/.bin/eslint web/js/components/preact/users/TotpSetupModal.jsx --format json --output-file build/eng-artifacts/T7.202/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.202/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'jsx-a11y/no-static-element-interactions'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.202.md", + "finding_ids": [ + "ESLINT-BUCKET-e046fbe269eed0dc" + ], + "rule_id": "jsx-a11y/no-static-element-interactions", + "reproducers": [ + { + "id": "ESLINT-BUCKET-e046fbe269eed0dc", + "path": "web/js/components/preact/users/TotpSetupModal.jsx", + "line": null, + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/users/TotpSetupModal.jsx", + "original_count": 2, + "scanner": "eslint-web" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.203", + "title": "nullPointerArithmeticRedundantCheck in sod_img_writer.h", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_203-upstream.json", + "quality/evidence/T7.203.md" + ], + "source_paths": [ + "include/sod/sod_img_writer.h" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_203-upstream.json" + ], + "evidence": "quality/evidence/T7.203.md", + "finding_ids": [ + "CPPCHECK-38d664fd8e77f607", + "CPPCHECK-3d1693ad77a15fa2", + "CPPCHECK-3508a7db3ef7fc03", + "CPPCHECK-ca79e52beb5f22bb", + "CPPCHECK-5941fdb9ccb989f3" + ], + "rule_id": "nullPointerArithmeticRedundantCheck", + "reproducers": [ + { + "id": "CPPCHECK-38d664fd8e77f607", + "path": "include/sod/sod_img_writer.h", + "line": 1022, + "fingerprint": "cppcheck:nullPointerArithmeticRedundantCheck:include/sod/sod_img_writer.h:38d664fd8e77f607", + "original_count": 1, + "scanner": "cppcheck" + }, + { + "id": "CPPCHECK-3d1693ad77a15fa2", + "path": "include/sod/sod_img_writer.h", + "line": 1023, + "fingerprint": "cppcheck:nullPointerArithmeticRedundantCheck:include/sod/sod_img_writer.h:3d1693ad77a15fa2", + "original_count": 1, + "scanner": "cppcheck" + }, + { + "id": "CPPCHECK-3508a7db3ef7fc03", + "path": "include/sod/sod_img_writer.h", + "line": 1024, + "fingerprint": "cppcheck:nullPointerArithmeticRedundantCheck:include/sod/sod_img_writer.h:3508a7db3ef7fc03", + "original_count": 1, + "scanner": "cppcheck" + }, + { + "id": "CPPCHECK-ca79e52beb5f22bb", + "path": "include/sod/sod_img_writer.h", + "line": 1044, + "fingerprint": "cppcheck:nullPointerArithmeticRedundantCheck:include/sod/sod_img_writer.h:ca79e52beb5f22bb", + "original_count": 1, + "scanner": "cppcheck" + }, + { + "id": "CPPCHECK-5941fdb9ccb989f3", + "path": "include/sod/sod_img_writer.h", + "line": 1045, + "fingerprint": "cppcheck:nullPointerArithmeticRedundantCheck:include/sod/sod_img_writer.h:5941fdb9ccb989f3", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.204", + "title": "nullPointerRedundantCheck in sod_img_writer.h", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_204-upstream.json", + "quality/evidence/T7.204.md" + ], + "source_paths": [ + "include/sod/sod_img_writer.h" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_204-upstream.json" + ], + "evidence": "quality/evidence/T7.204.md", + "finding_ids": [ + "CPPCHECK-10a0fa2f24fefc90", + "CPPCHECK-ffdd97ac6ebb6b4b", + "CPPCHECK-7dc87bf617f52146", + "CPPCHECK-347fec696ca3fcab", + "CPPCHECK-1980a8233237856a" + ], + "rule_id": "nullPointerRedundantCheck", + "reproducers": [ + { + "id": "CPPCHECK-10a0fa2f24fefc90", + "path": "include/sod/sod_img_writer.h", + "line": 1022, + "fingerprint": "cppcheck:nullPointerRedundantCheck:include/sod/sod_img_writer.h:10a0fa2f24fefc90", + "original_count": 1, + "scanner": "cppcheck" + }, + { + "id": "CPPCHECK-ffdd97ac6ebb6b4b", + "path": "include/sod/sod_img_writer.h", + "line": 1023, + "fingerprint": "cppcheck:nullPointerRedundantCheck:include/sod/sod_img_writer.h:ffdd97ac6ebb6b4b", + "original_count": 1, + "scanner": "cppcheck" + }, + { + "id": "CPPCHECK-7dc87bf617f52146", + "path": "include/sod/sod_img_writer.h", + "line": 1024, + "fingerprint": "cppcheck:nullPointerRedundantCheck:include/sod/sod_img_writer.h:7dc87bf617f52146", + "original_count": 1, + "scanner": "cppcheck" + }, + { + "id": "CPPCHECK-347fec696ca3fcab", + "path": "include/sod/sod_img_writer.h", + "line": 1044, + "fingerprint": "cppcheck:nullPointerRedundantCheck:include/sod/sod_img_writer.h:347fec696ca3fcab", + "original_count": 1, + "scanner": "cppcheck" + }, + { + "id": "CPPCHECK-1980a8233237856a", + "path": "include/sod/sod_img_writer.h", + "line": 1045, + "fingerprint": "cppcheck:nullPointerRedundantCheck:include/sod/sod_img_writer.h:1980a8233237856a", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.205", + "title": "wrongPrintfScanfArgNum in linux_thermal.c", + "depends_on": [ + "T7", + "T13", + "T7.95" + ], + "kind": "native-fix", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "src/telemetry/collectors/linux_thermal.c", + "tests/unit/test_t7_205.c", + "tests/unit/cmake/eng/t7_205.cmake", + "quality/evidence/T7.205.md" + ], + "source_paths": [ + "src/telemetry/collectors/linux_thermal.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Exercise every reported format/library call with boundary values; argument types/counts, buffer extents and returned errors must match the library contract with no UB.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.205 --regex '^test_t7_205$'" + ], + "evidence": "quality/evidence/T7.205.md", + "finding_ids": [ + "CPPCHECK-e9cd8f29e136cbb8" + ], + "rule_id": "wrongPrintfScanfArgNum", + "reproducers": [ + { + "id": "CPPCHECK-e9cd8f29e136cbb8", + "path": "src/telemetry/collectors/linux_thermal.c", + "line": 45, + "fingerprint": "cppcheck:wrongPrintfScanfArgNum:src/telemetry/collectors/linux_thermal.c:e9cd8f29e136cbb8", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.206", + "title": "zerodivcond in sod_img_reader.h", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "low", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_206-upstream.json", + "quality/evidence/T7.206.md" + ], + "source_paths": [ + "include/sod/sod_img_reader.h" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_206-upstream.json" + ], + "evidence": "quality/evidence/T7.206.md", + "finding_ids": [ + "CPPCHECK-ac6f81ae03a685f3" + ], + "rule_id": "zerodivcond", + "reproducers": [ + { + "id": "CPPCHECK-ac6f81ae03a685f3", + "path": "include/sod/sod_img_reader.h", + "line": 1097, + "fingerprint": "cppcheck:zerodivcond:include/sod/sod_img_reader.h:ac6f81ae03a685f3", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.207", + "title": "arrayIndexThenCheck in sod_img_writer.h", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_207-upstream.json", + "quality/evidence/T7.207.md" + ], + "source_paths": [ + "include/sod/sod_img_writer.h" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_207-upstream.json" + ], + "evidence": "quality/evidence/T7.207.md", + "finding_ids": [ + "CPPCHECK-BUCKET-8bb35cef096bd68d" + ], + "rule_id": "arrayIndexThenCheck", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-8bb35cef096bd68d", + "path": "include/sod/sod_img_writer.h", + "line": null, + "fingerprint": "cppcheck-bucket:arrayIndexThenCheck:include/sod/sod_img_writer.h", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.208", + "title": "constParameter in linux_network.c", + "depends_on": [ + "T7", + "T13", + "T7.95" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/telemetry/collectors/linux_network.c", + "tests/unit/test_t7_208.c", + "tests/unit/cmake/eng/t7_208.cmake", + "quality/evidence/T7.208.md" + ], + "source_paths": [ + "src/telemetry/collectors/linux_network.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.208 --regex '^test_t7_208$'" + ], + "evidence": "quality/evidence/T7.208.md", + "finding_ids": [ + "CPPCHECK-BUCKET-7e66ded89b37cb4f" + ], + "rule_id": "constParameter", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-7e66ded89b37cb4f", + "path": "src/telemetry/collectors/linux_network.c", + "line": null, + "fingerprint": "cppcheck-bucket:constParameter:src/telemetry/collectors/linux_network.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.209", + "title": "constParameter in api_handlers_investigations.c", + "depends_on": [ + "T7", + "T13", + "T7.148" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_investigations.c", + "tests/unit/test_t7_209.c", + "tests/unit/cmake/eng/t7_209.cmake", + "quality/evidence/T7.209.md" + ], + "source_paths": [ + "src/web/api_handlers_investigations.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.209 --regex '^test_t7_209$'" + ], + "evidence": "quality/evidence/T7.209.md", + "finding_ids": [ + "CPPCHECK-BUCKET-c6d1df4e6770f40e" + ], + "rule_id": "constParameter", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-c6d1df4e6770f40e", + "path": "src/web/api_handlers_investigations.c", + "line": null, + "fingerprint": "cppcheck-bucket:constParameter:src/web/api_handlers_investigations.c", + "original_count": 2, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.210", + "title": "constParameterCallback in sod_img_reader.h, sod_img_writer.h", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_210-upstream.json", + "quality/evidence/T7.210.md" + ], + "source_paths": [ + "include/sod/sod_img_reader.h", + "include/sod/sod_img_writer.h" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_210-upstream.json" + ], + "evidence": "quality/evidence/T7.210.md", + "finding_ids": [ + "CPPCHECK-BUCKET-fb37582a72f59582", + "CPPCHECK-BUCKET-c7b3ef530f996e26" + ], + "rule_id": "constParameterCallback", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-fb37582a72f59582", + "path": "include/sod/sod_img_reader.h", + "line": null, + "fingerprint": "cppcheck-bucket:constParameterCallback:include/sod/sod_img_reader.h", + "original_count": 5, + "scanner": "cppcheck" + }, + { + "id": "CPPCHECK-BUCKET-c7b3ef530f996e26", + "path": "include/sod/sod_img_writer.h", + "line": null, + "fingerprint": "cppcheck-bucket:constParameterCallback:include/sod/sod_img_writer.h", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.211", + "title": "constParameterCallback in storage_migration.c", + "depends_on": [ + "T7", + "T13", + "T7.138" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/storage/storage_migration.c", + "tests/unit/test_t7_211.c", + "tests/unit/cmake/eng/t7_211.cmake", + "quality/evidence/T7.211.md" + ], + "source_paths": [ + "src/storage/storage_migration.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.211 --regex '^test_t7_211$'" + ], + "evidence": "quality/evidence/T7.211.md", + "finding_ids": [ + "CPPCHECK-BUCKET-90ec02278e01bcac" + ], + "rule_id": "constParameterCallback", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-90ec02278e01bcac", + "path": "src/storage/storage_migration.c", + "line": null, + "fingerprint": "cppcheck-bucket:constParameterCallback:src/storage/storage_migration.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.212", + "title": "constParameterCallback in yaml_redact.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/utils/yaml_redact.c", + "tests/unit/test_t7_212.c", + "tests/unit/cmake/eng/t7_212.cmake", + "quality/evidence/T7.212.md" + ], + "source_paths": [ + "src/utils/yaml_redact.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.212 --regex '^test_t7_212$'" + ], + "evidence": "quality/evidence/T7.212.md", + "finding_ids": [ + "CPPCHECK-BUCKET-6291a48798ed350c" + ], + "rule_id": "constParameterCallback", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-6291a48798ed350c", + "path": "src/utils/yaml_redact.c", + "line": null, + "fingerprint": "cppcheck-bucket:constParameterCallback:src/utils/yaml_redact.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.213", + "title": "constParameterCallback in api_detection.c", + "depends_on": [ + "T7", + "T13", + "T7.112" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/video/api_detection.c", + "tests/unit/test_t7_213.c", + "tests/unit/cmake/eng/t7_213.cmake", + "quality/evidence/T7.213.md" + ], + "source_paths": [ + "src/video/api_detection.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.213 --regex '^test_t7_213$'" + ], + "evidence": "quality/evidence/T7.213.md", + "finding_ids": [ + "CPPCHECK-BUCKET-681aedac30d87a1e" + ], + "rule_id": "constParameterCallback", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-681aedac30d87a1e", + "path": "src/video/api_detection.c", + "line": null, + "fingerprint": "cppcheck-bucket:constParameterCallback:src/video/api_detection.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.214", + "title": "constParameterCallback in go2rtc_api.c, go2rtc_integration.c, go2rtc_snapshot.c", + "depends_on": [ + "T7", + "T13", + "T7.98", + "T7.154" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/video/go2rtc/go2rtc_api.c", + "src/video/go2rtc/go2rtc_integration.c", + "src/video/go2rtc/go2rtc_snapshot.c", + "tests/unit/test_t7_214.c", + "tests/unit/cmake/eng/t7_214.cmake", + "quality/evidence/T7.214.md" + ], + "source_paths": [ + "src/video/go2rtc/go2rtc_api.c", + "src/video/go2rtc/go2rtc_integration.c", + "src/video/go2rtc/go2rtc_snapshot.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.214 --regex '^test_t7_214$'" + ], + "evidence": "quality/evidence/T7.214.md", + "finding_ids": [ + "CPPCHECK-BUCKET-ee781b371da39bf5", + "CPPCHECK-BUCKET-dc056676c7084f53", + "CPPCHECK-BUCKET-0130dae8fb623afa" + ], + "rule_id": "constParameterCallback", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-ee781b371da39bf5", + "path": "src/video/go2rtc/go2rtc_api.c", + "line": null, + "fingerprint": "cppcheck-bucket:constParameterCallback:src/video/go2rtc/go2rtc_api.c", + "original_count": 2, + "scanner": "cppcheck" + }, + { + "id": "CPPCHECK-BUCKET-dc056676c7084f53", + "path": "src/video/go2rtc/go2rtc_integration.c", + "line": null, + "fingerprint": "cppcheck-bucket:constParameterCallback:src/video/go2rtc/go2rtc_integration.c", + "original_count": 1, + "scanner": "cppcheck" + }, + { + "id": "CPPCHECK-BUCKET-0130dae8fb623afa", + "path": "src/video/go2rtc/go2rtc_snapshot.c", + "line": null, + "fingerprint": "cppcheck-bucket:constParameterCallback:src/video/go2rtc/go2rtc_snapshot.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.215", + "title": "constParameterCallback in onvif_detection.c", + "depends_on": [ + "T7", + "T13", + "T7.146" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/video/onvif_detection.c", + "tests/unit/test_t7_215.c", + "tests/unit/cmake/eng/t7_215.cmake", + "quality/evidence/T7.215.md" + ], + "source_paths": [ + "src/video/onvif_detection.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.215 --regex '^test_t7_215$'" + ], + "evidence": "quality/evidence/T7.215.md", + "finding_ids": [ + "CPPCHECK-BUCKET-365ebbda46eacf74" + ], + "rule_id": "constParameterCallback", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-365ebbda46eacf74", + "path": "src/video/onvif_detection.c", + "line": null, + "fingerprint": "cppcheck-bucket:constParameterCallback:src/video/onvif_detection.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.216", + "title": "constParameterCallback in onvif_device_management.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/video/onvif_device_management.c", + "tests/unit/test_t7_216.c", + "tests/unit/cmake/eng/t7_216.cmake", + "quality/evidence/T7.216.md" + ], + "source_paths": [ + "src/video/onvif_device_management.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.216 --regex '^test_t7_216$'" + ], + "evidence": "quality/evidence/T7.216.md", + "finding_ids": [ + "CPPCHECK-BUCKET-8737ababcc06f484" + ], + "rule_id": "constParameterCallback", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-8737ababcc06f484", + "path": "src/video/onvif_device_management.c", + "line": null, + "fingerprint": "cppcheck-bucket:constParameterCallback:src/video/onvif_device_management.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.217", + "title": "constParameterCallback in onvif_imaging.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/video/onvif_imaging.c", + "tests/unit/test_t7_217.c", + "tests/unit/cmake/eng/t7_217.cmake", + "quality/evidence/T7.217.md" + ], + "source_paths": [ + "src/video/onvif_imaging.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.217 --regex '^test_t7_217$'" + ], + "evidence": "quality/evidence/T7.217.md", + "finding_ids": [ + "CPPCHECK-BUCKET-baf28ba17bc25dd0" + ], + "rule_id": "constParameterCallback", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-baf28ba17bc25dd0", + "path": "src/video/onvif_imaging.c", + "line": null, + "fingerprint": "cppcheck-bucket:constParameterCallback:src/video/onvif_imaging.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.218", + "title": "constParameterCallback in onvif_ptz.c", + "depends_on": [ + "T7", + "T13", + "T7.156" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/video/onvif_ptz.c", + "tests/unit/test_t7_218.c", + "tests/unit/cmake/eng/t7_218.cmake", + "quality/evidence/T7.218.md" + ], + "source_paths": [ + "src/video/onvif_ptz.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.218 --regex '^test_t7_218$'" + ], + "evidence": "quality/evidence/T7.218.md", + "finding_ids": [ + "CPPCHECK-BUCKET-462bf13ae3867115" + ], + "rule_id": "constParameterCallback", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-462bf13ae3867115", + "path": "src/video/onvif_ptz.c", + "line": null, + "fingerprint": "cppcheck-bucket:constParameterCallback:src/video/onvif_ptz.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.219", + "title": "constParameterCallback in api_handlers_go2rtc_proxy.c", + "depends_on": [ + "T7", + "T13", + "T7.147" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_go2rtc_proxy.c", + "tests/unit/test_t7_219.c", + "tests/unit/cmake/eng/t7_219.cmake", + "quality/evidence/T7.219.md" + ], + "source_paths": [ + "src/web/api_handlers_go2rtc_proxy.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.219 --regex '^test_t7_219$'" + ], + "evidence": "quality/evidence/T7.219.md", + "finding_ids": [ + "CPPCHECK-BUCKET-b6f82c4c9b287eba" + ], + "rule_id": "constParameterCallback", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-b6f82c4c9b287eba", + "path": "src/web/api_handlers_go2rtc_proxy.c", + "line": null, + "fingerprint": "cppcheck-bucket:constParameterCallback:src/web/api_handlers_go2rtc_proxy.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.220", + "title": "constParameterCallback in api_handlers_health.c", + "depends_on": [ + "T7", + "T13", + "T7.158" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_health.c", + "tests/unit/test_t7_220.c", + "tests/unit/cmake/eng/t7_220.cmake", + "quality/evidence/T7.220.md" + ], + "source_paths": [ + "src/web/api_handlers_health.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.220 --regex '^test_t7_220$'" + ], + "evidence": "quality/evidence/T7.220.md", + "finding_ids": [ + "CPPCHECK-BUCKET-c7a8e9a51802c60d" + ], + "rule_id": "constParameterCallback", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-c7a8e9a51802c60d", + "path": "src/web/api_handlers_health.c", + "line": null, + "fingerprint": "cppcheck-bucket:constParameterCallback:src/web/api_handlers_health.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.221", + "title": "constParameterCallback in go2rtc_proxy_thread.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/web/go2rtc_proxy_thread.c", + "tests/unit/test_t7_221.c", + "tests/unit/cmake/eng/t7_221.cmake", + "quality/evidence/T7.221.md" + ], + "source_paths": [ + "src/web/go2rtc_proxy_thread.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.221 --regex '^test_t7_221$'" + ], + "evidence": "quality/evidence/T7.221.md", + "finding_ids": [ + "CPPCHECK-BUCKET-d3985740b2ac6585" + ], + "rule_id": "constParameterCallback", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-d3985740b2ac6585", + "path": "src/web/go2rtc_proxy_thread.c", + "line": null, + "fingerprint": "cppcheck-bucket:constParameterCallback:src/web/go2rtc_proxy_thread.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.222", + "title": "constParameterPointer in sod_img_reader.h, sod_img_writer.h", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_222-upstream.json", + "quality/evidence/T7.222.md" + ], + "source_paths": [ + "include/sod/sod_img_reader.h", + "include/sod/sod_img_writer.h" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_222-upstream.json" + ], + "evidence": "quality/evidence/T7.222.md", + "finding_ids": [ + "CPPCHECK-BUCKET-82a085f0cc04468f", + "CPPCHECK-BUCKET-27ab7ab1e74c2e72" + ], + "rule_id": "constParameterPointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-82a085f0cc04468f", + "path": "include/sod/sod_img_reader.h", + "line": null, + "fingerprint": "cppcheck-bucket:constParameterPointer:include/sod/sod_img_reader.h", + "original_count": 12, + "scanner": "cppcheck" + }, + { + "id": "CPPCHECK-BUCKET-27ab7ab1e74c2e72", + "path": "include/sod/sod_img_writer.h", + "line": null, + "fingerprint": "cppcheck-bucket:constParameterPointer:include/sod/sod_img_writer.h", + "original_count": 7, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.223", + "title": "constParameterPointer in authorization.c", + "depends_on": [ + "T7", + "T13", + "T7.114" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/core/authorization.c", + "tests/unit/test_t7_223.c", + "tests/unit/cmake/eng/t7_223.cmake", + "quality/evidence/T7.223.md" + ], + "source_paths": [ + "src/core/authorization.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.223 --regex '^test_t7_223$'" + ], + "evidence": "quality/evidence/T7.223.md", + "finding_ids": [ + "CPPCHECK-BUCKET-d0de2e4ac47c3191" + ], + "rule_id": "constParameterPointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-d0de2e4ac47c3191", + "path": "src/core/authorization.c", + "line": null, + "fingerprint": "cppcheck-bucket:constParameterPointer:src/core/authorization.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.224", + "title": "constParameterPointer in mqtt_destination_client.c", + "depends_on": [ + "T7", + "T13", + "T7.134" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/core/mqtt_destination_client.c", + "tests/unit/test_t7_224.c", + "tests/unit/cmake/eng/t7_224.cmake", + "quality/evidence/T7.224.md" + ], + "source_paths": [ + "src/core/mqtt_destination_client.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.224 --regex '^test_t7_224$'" + ], + "evidence": "quality/evidence/T7.224.md", + "finding_ids": [ + "CPPCHECK-BUCKET-fbb9e9402242eaba" + ], + "rule_id": "constParameterPointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-fbb9e9402242eaba", + "path": "src/core/mqtt_destination_client.c", + "line": null, + "fingerprint": "cppcheck-bucket:constParameterPointer:src/core/mqtt_destination_client.c", + "original_count": 2, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.225", + "title": "constParameterPointer in db_camera_collections.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/database/db_camera_collections.c", + "tests/unit/test_t7_225.c", + "tests/unit/cmake/eng/t7_225.cmake", + "quality/evidence/T7.225.md" + ], + "source_paths": [ + "src/database/db_camera_collections.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.225 --regex '^test_t7_225$'" + ], + "evidence": "quality/evidence/T7.225.md", + "finding_ids": [ + "CPPCHECK-BUCKET-fd8d6a4b8cc77400" + ], + "rule_id": "constParameterPointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-fd8d6a4b8cc77400", + "path": "src/database/db_camera_collections.c", + "line": null, + "fingerprint": "cppcheck-bucket:constParameterPointer:src/database/db_camera_collections.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.226", + "title": "constParameterPointer in ezxml.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_226-upstream.json", + "quality/evidence/T7.226.md" + ], + "source_paths": [ + "src/ezxml/ezxml.c" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_226-upstream.json" + ], + "evidence": "quality/evidence/T7.226.md", + "finding_ids": [ + "CPPCHECK-BUCKET-43fcd9340a9e63ed" + ], + "rule_id": "constParameterPointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-43fcd9340a9e63ed", + "path": "src/ezxml/ezxml.c", + "line": null, + "fingerprint": "cppcheck-bucket:constParameterPointer:src/ezxml/ezxml.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.227", + "title": "constParameterPointer in sod.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_227-upstream.json", + "quality/evidence/T7.227.md" + ], + "source_paths": [ + "src/sod/sod.c" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_227-upstream.json" + ], + "evidence": "quality/evidence/T7.227.md", + "finding_ids": [ + "CPPCHECK-BUCKET-e7f8f80f0cd95f0d" + ], + "rule_id": "constParameterPointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-e7f8f80f0cd95f0d", + "path": "src/sod/sod.c", + "line": null, + "fingerprint": "cppcheck-bucket:constParameterPointer:src/sod/sod.c", + "original_count": 75, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.228", + "title": "constParameterPointer in linux_cgroup.c", + "depends_on": [ + "T7", + "T13", + "T7.83" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/telemetry/collectors/linux_cgroup.c", + "tests/unit/test_t7_228.c", + "tests/unit/cmake/eng/t7_228.cmake", + "quality/evidence/T7.228.md" + ], + "source_paths": [ + "src/telemetry/collectors/linux_cgroup.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.228 --regex '^test_t7_228$'" + ], + "evidence": "quality/evidence/T7.228.md", + "finding_ids": [ + "CPPCHECK-BUCKET-70e0496568faa30f" + ], + "rule_id": "constParameterPointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-70e0496568faa30f", + "path": "src/telemetry/collectors/linux_cgroup.c", + "line": null, + "fingerprint": "cppcheck-bucket:constParameterPointer:src/telemetry/collectors/linux_cgroup.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.229", + "title": "constParameterPointer in nvme_provider.c", + "depends_on": [ + "T7", + "T13", + "T7.76" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/telemetry/providers/nvme_provider.c", + "tests/unit/test_t7_229.c", + "tests/unit/cmake/eng/t7_229.cmake", + "quality/evidence/T7.229.md" + ], + "source_paths": [ + "src/telemetry/providers/nvme_provider.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.229 --regex '^test_t7_229$'" + ], + "evidence": "quality/evidence/T7.229.md", + "finding_ids": [ + "CPPCHECK-BUCKET-5bdf073f41a6c65d" + ], + "rule_id": "constParameterPointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-5bdf073f41a6c65d", + "path": "src/telemetry/providers/nvme_provider.c", + "line": null, + "fingerprint": "cppcheck-bucket:constParameterPointer:src/telemetry/providers/nvme_provider.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.230", + "title": "constParameterPointer in system_health_evaluator.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/telemetry/system_health_evaluator.c", + "tests/unit/test_t7_230.c", + "tests/unit/cmake/eng/t7_230.cmake", + "quality/evidence/T7.230.md" + ], + "source_paths": [ + "src/telemetry/system_health_evaluator.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.230 --regex '^test_t7_230$'" + ], + "evidence": "quality/evidence/T7.230.md", + "finding_ids": [ + "CPPCHECK-BUCKET-527aa4750d3ac84a" + ], + "rule_id": "constParameterPointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-527aa4750d3ac84a", + "path": "src/telemetry/system_health_evaluator.c", + "line": null, + "fingerprint": "cppcheck-bucket:constParameterPointer:src/telemetry/system_health_evaluator.c", + "original_count": 2, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.231", + "title": "constParameterPointer in go2rtc_base_path.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/utils/go2rtc_base_path.c", + "tests/unit/test_t7_231.c", + "tests/unit/cmake/eng/t7_231.cmake", + "quality/evidence/T7.231.md" + ], + "source_paths": [ + "src/utils/go2rtc_base_path.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.231 --regex '^test_t7_231$'" + ], + "evidence": "quality/evidence/T7.231.md", + "finding_ids": [ + "CPPCHECK-BUCKET-d9684d3aa203568c" + ], + "rule_id": "constParameterPointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-d9684d3aa203568c", + "path": "src/utils/go2rtc_base_path.c", + "line": null, + "fingerprint": "cppcheck-bucket:constParameterPointer:src/utils/go2rtc_base_path.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.232", + "title": "constParameterPointer in strings.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/utils/strings.c", + "tests/unit/test_t7_232.c", + "tests/unit/cmake/eng/t7_232.cmake", + "quality/evidence/T7.232.md" + ], + "source_paths": [ + "src/utils/strings.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.232 --regex '^test_t7_232$'" + ], + "evidence": "quality/evidence/T7.232.md", + "finding_ids": [ + "CPPCHECK-BUCKET-e228634622467328" + ], + "rule_id": "constParameterPointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-e228634622467328", + "path": "src/utils/strings.c", + "line": null, + "fingerprint": "cppcheck-bucket:constParameterPointer:src/utils/strings.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.233", + "title": "constParameterPointer in faac_encoder.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/video/faac_encoder.c", + "tests/unit/test_t7_233.c", + "tests/unit/cmake/eng/t7_233.cmake", + "quality/evidence/T7.233.md" + ], + "source_paths": [ + "src/video/faac_encoder.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.233 --regex '^test_t7_233$'" + ], + "evidence": "quality/evidence/T7.233.md", + "finding_ids": [ + "CPPCHECK-BUCKET-bdb708e597b5cade" + ], + "rule_id": "constParameterPointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-bdb708e597b5cade", + "path": "src/video/faac_encoder.c", + "line": null, + "fingerprint": "cppcheck-bucket:constParameterPointer:src/video/faac_encoder.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.234", + "title": "constParameterPointer in hls_unified_thread.c", + "depends_on": [ + "T7", + "T13", + "T7.69" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/video/hls/hls_unified_thread.c", + "tests/unit/test_t7_234.c", + "tests/unit/cmake/eng/t7_234.cmake", + "quality/evidence/T7.234.md" + ], + "source_paths": [ + "src/video/hls/hls_unified_thread.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.234 --regex '^test_t7_234$'" + ], + "evidence": "quality/evidence/T7.234.md", + "finding_ids": [ + "CPPCHECK-BUCKET-cbab871259b9963d" + ], + "rule_id": "constParameterPointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-cbab871259b9963d", + "path": "src/video/hls/hls_unified_thread.c", + "line": null, + "fingerprint": "cppcheck-bucket:constParameterPointer:src/video/hls/hls_unified_thread.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.235", + "title": "constParameterPointer in unified_detection_thread.c", + "depends_on": [ + "T7", + "T13", + "T7.122" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/video/unified_detection_thread.c", + "tests/unit/test_t7_235.c", + "tests/unit/cmake/eng/t7_235.cmake", + "quality/evidence/T7.235.md" + ], + "source_paths": [ + "src/video/unified_detection_thread.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.235 --regex '^test_t7_235$'" + ], + "evidence": "quality/evidence/T7.235.md", + "finding_ids": [ + "CPPCHECK-BUCKET-8c644cc847574bfe" + ], + "rule_id": "constParameterPointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-8c644cc847574bfe", + "path": "src/video/unified_detection_thread.c", + "line": null, + "fingerprint": "cppcheck-bucket:constParameterPointer:src/video/unified_detection_thread.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.236", + "title": "constParameterPointer in go2rtc_websocket.c", + "depends_on": [ + "T7", + "T13", + "T7.150" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/web/go2rtc_websocket.c", + "tests/unit/test_t7_236.c", + "tests/unit/cmake/eng/t7_236.cmake", + "quality/evidence/T7.236.md" + ], + "source_paths": [ + "src/web/go2rtc_websocket.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.236 --regex '^test_t7_236$'" + ], + "evidence": "quality/evidence/T7.236.md", + "finding_ids": [ + "CPPCHECK-BUCKET-4c0052bc9de6e496" + ], + "rule_id": "constParameterPointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-4c0052bc9de6e496", + "path": "src/web/go2rtc_websocket.c", + "line": null, + "fingerprint": "cppcheck-bucket:constParameterPointer:src/web/go2rtc_websocket.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.237", + "title": "constParameterPointer in recording_archive.c", + "depends_on": [ + "T7", + "T13", + "T7.141" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/web/recording_archive.c", + "tests/unit/test_t7_237.c", + "tests/unit/cmake/eng/t7_237.cmake", + "quality/evidence/T7.237.md" + ], + "source_paths": [ + "src/web/recording_archive.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.237 --regex '^test_t7_237$'" + ], + "evidence": "quality/evidence/T7.237.md", + "finding_ids": [ + "CPPCHECK-BUCKET-45cfee19afe8668f" + ], + "rule_id": "constParameterPointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-45cfee19afe8668f", + "path": "src/web/recording_archive.c", + "line": null, + "fingerprint": "cppcheck-bucket:constParameterPointer:src/web/recording_archive.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.238", + "title": "constVariable in sod_img_reader.h, sod_img_writer.h", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_238-upstream.json", + "quality/evidence/T7.238.md" + ], + "source_paths": [ + "include/sod/sod_img_reader.h", + "include/sod/sod_img_writer.h" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_238-upstream.json" + ], + "evidence": "quality/evidence/T7.238.md", + "finding_ids": [ + "CPPCHECK-BUCKET-933d7ae37be3c395", + "CPPCHECK-BUCKET-b1c0c559c6e17a23" + ], + "rule_id": "constVariable", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-933d7ae37be3c395", + "path": "include/sod/sod_img_reader.h", + "line": null, + "fingerprint": "cppcheck-bucket:constVariable:include/sod/sod_img_reader.h", + "original_count": 6, + "scanner": "cppcheck" + }, + { + "id": "CPPCHECK-BUCKET-b1c0c559c6e17a23", + "path": "include/sod/sod_img_writer.h", + "line": null, + "fingerprint": "cppcheck-bucket:constVariable:include/sod/sod_img_writer.h", + "original_count": 7, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.239", + "title": "constVariable in mqtt_delivery_worker.c", + "depends_on": [ + "T7", + "T13", + "T7.91" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/core/mqtt_delivery_worker.c", + "tests/unit/test_t7_239.c", + "tests/unit/cmake/eng/t7_239.cmake", + "quality/evidence/T7.239.md" + ], + "source_paths": [ + "src/core/mqtt_delivery_worker.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.239 --regex '^test_t7_239$'" + ], + "evidence": "quality/evidence/T7.239.md", + "finding_ids": [ + "CPPCHECK-BUCKET-8596888f0dd1cc7e" + ], + "rule_id": "constVariable", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-8596888f0dd1cc7e", + "path": "src/core/mqtt_delivery_worker.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariable:src/core/mqtt_delivery_worker.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.240", + "title": "constVariable in sod.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_240-upstream.json", + "quality/evidence/T7.240.md" + ], + "source_paths": [ + "src/sod/sod.c" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_240-upstream.json" + ], + "evidence": "quality/evidence/T7.240.md", + "finding_ids": [ + "CPPCHECK-BUCKET-298feb4a490d6252" + ], + "rule_id": "constVariable", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-298feb4a490d6252", + "path": "src/sod/sod.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariable:src/sod/sod.c", + "original_count": 4, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.241", + "title": "constVariable in sod_ingenic_mxu.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_241-upstream.json", + "quality/evidence/T7.241.md" + ], + "source_paths": [ + "src/sod/sod_ingenic_mxu.c" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_241-upstream.json" + ], + "evidence": "quality/evidence/T7.241.md", + "finding_ids": [ + "CPPCHECK-BUCKET-a8ce2c3168c021de" + ], + "rule_id": "constVariable", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-a8ce2c3168c021de", + "path": "src/sod/sod_ingenic_mxu.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariable:src/sod/sod_ingenic_mxu.c", + "original_count": 2, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.242", + "title": "constVariablePointer in sod_img_reader.h, sod_img_writer.h", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_242-upstream.json", + "quality/evidence/T7.242.md" + ], + "source_paths": [ + "include/sod/sod_img_reader.h", + "include/sod/sod_img_writer.h" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_242-upstream.json" + ], + "evidence": "quality/evidence/T7.242.md", + "finding_ids": [ + "CPPCHECK-BUCKET-9575437f939001d5", + "CPPCHECK-BUCKET-df230b0a5672f192" + ], + "rule_id": "constVariablePointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-9575437f939001d5", + "path": "include/sod/sod_img_reader.h", + "line": null, + "fingerprint": "cppcheck-bucket:constVariablePointer:include/sod/sod_img_reader.h", + "original_count": 12, + "scanner": "cppcheck" + }, + { + "id": "CPPCHECK-BUCKET-df230b0a5672f192", + "path": "include/sod/sod_img_writer.h", + "line": null, + "fingerprint": "cppcheck-bucket:constVariablePointer:include/sod/sod_img_writer.h", + "original_count": 3, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.243", + "title": "constVariablePointer in path_utils.c", + "depends_on": [ + "T7", + "T13", + "T7.128" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/core/path_utils.c", + "tests/unit/test_t7_243.c", + "tests/unit/cmake/eng/t7_243.cmake", + "quality/evidence/T7.243.md" + ], + "source_paths": [ + "src/core/path_utils.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.243 --regex '^test_t7_243$'" + ], + "evidence": "quality/evidence/T7.243.md", + "finding_ids": [ + "CPPCHECK-BUCKET-8e110c5360beb299" + ], + "rule_id": "constVariablePointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-8e110c5360beb299", + "path": "src/core/path_utils.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariablePointer:src/core/path_utils.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.244", + "title": "constVariablePointer in db_auth.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/database/db_auth.c", + "tests/unit/test_t7_244.c", + "tests/unit/cmake/eng/t7_244.cmake", + "quality/evidence/T7.244.md" + ], + "source_paths": [ + "src/database/db_auth.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.244 --regex '^test_t7_244$'" + ], + "evidence": "quality/evidence/T7.244.md", + "finding_ids": [ + "CPPCHECK-BUCKET-6c5cf9bd3f338f84" + ], + "rule_id": "constVariablePointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-6c5cf9bd3f338f84", + "path": "src/database/db_auth.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariablePointer:src/database/db_auth.c", + "original_count": 3, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.245", + "title": "constVariablePointer in db_authorization.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/database/db_authorization.c", + "tests/unit/test_t7_245.c", + "tests/unit/cmake/eng/t7_245.cmake", + "quality/evidence/T7.245.md" + ], + "source_paths": [ + "src/database/db_authorization.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.245 --regex '^test_t7_245$'" + ], + "evidence": "quality/evidence/T7.245.md", + "finding_ids": [ + "CPPCHECK-BUCKET-08f60b7ec76ce9d3" + ], + "rule_id": "constVariablePointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-08f60b7ec76ce9d3", + "path": "src/database/db_authorization.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariablePointer:src/database/db_authorization.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.246", + "title": "constVariablePointer in db_camera_tags.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/database/db_camera_tags.c", + "tests/unit/test_t7_246.c", + "tests/unit/cmake/eng/t7_246.cmake", + "quality/evidence/T7.246.md" + ], + "source_paths": [ + "src/database/db_camera_tags.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.246 --regex '^test_t7_246$'" + ], + "evidence": "quality/evidence/T7.246.md", + "finding_ids": [ + "CPPCHECK-BUCKET-7e7f6cc12d937123" + ], + "rule_id": "constVariablePointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-7e7f6cc12d937123", + "path": "src/database/db_camera_tags.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariablePointer:src/database/db_camera_tags.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.247", + "title": "constVariablePointer in db_core.c", + "depends_on": [ + "T7", + "T13", + "T7.25" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/database/db_core.c", + "tests/unit/test_t7_247.c", + "tests/unit/cmake/eng/t7_247.cmake", + "quality/evidence/T7.247.md" + ], + "source_paths": [ + "src/database/db_core.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.247 --regex '^test_t7_247$'" + ], + "evidence": "quality/evidence/T7.247.md", + "finding_ids": [ + "CPPCHECK-BUCKET-f21c65912e355ace" + ], + "rule_id": "constVariablePointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-f21c65912e355ace", + "path": "src/database/db_core.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariablePointer:src/database/db_core.c", + "original_count": 2, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.248", + "title": "constVariablePointer in db_fleet_query.c", + "depends_on": [ + "T7", + "T13", + "T7.113" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/database/db_fleet_query.c", + "tests/unit/test_t7_248.c", + "tests/unit/cmake/eng/t7_248.cmake", + "quality/evidence/T7.248.md" + ], + "source_paths": [ + "src/database/db_fleet_query.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.248 --regex '^test_t7_248$'" + ], + "evidence": "quality/evidence/T7.248.md", + "finding_ids": [ + "CPPCHECK-BUCKET-9f651ab0c8ea6422" + ], + "rule_id": "constVariablePointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-9f651ab0c8ea6422", + "path": "src/database/db_fleet_query.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariablePointer:src/database/db_fleet_query.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.249", + "title": "constVariablePointer in db_storage_lifecycle.c", + "depends_on": [ + "T7", + "T13", + "T7.129" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/database/db_storage_lifecycle.c", + "tests/unit/test_t7_249.c", + "tests/unit/cmake/eng/t7_249.cmake", + "quality/evidence/T7.249.md" + ], + "source_paths": [ + "src/database/db_storage_lifecycle.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.249 --regex '^test_t7_249$'" + ], + "evidence": "quality/evidence/T7.249.md", + "finding_ids": [ + "CPPCHECK-BUCKET-353deb8bba479029" + ], + "rule_id": "constVariablePointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-353deb8bba479029", + "path": "src/database/db_storage_lifecycle.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariablePointer:src/database/db_storage_lifecycle.c", + "original_count": 2, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.250", + "title": "constVariablePointer in ezxml.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_250-upstream.json", + "quality/evidence/T7.250.md" + ], + "source_paths": [ + "src/ezxml/ezxml.c" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_250-upstream.json" + ], + "evidence": "quality/evidence/T7.250.md", + "finding_ids": [ + "CPPCHECK-BUCKET-c6ee03168003661f" + ], + "rule_id": "constVariablePointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-c6ee03168003661f", + "path": "src/ezxml/ezxml.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariablePointer:src/ezxml/ezxml.c", + "original_count": 4, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.251", + "title": "constVariablePointer in sod.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_251-upstream.json", + "quality/evidence/T7.251.md" + ], + "source_paths": [ + "src/sod/sod.c" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_251-upstream.json" + ], + "evidence": "quality/evidence/T7.251.md", + "finding_ids": [ + "CPPCHECK-BUCKET-5d8aaf042fefce78" + ], + "rule_id": "constVariablePointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-5d8aaf042fefce78", + "path": "src/sod/sod.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariablePointer:src/sod/sod.c", + "original_count": 24, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.252", + "title": "constVariablePointer in storage_deletion.c", + "depends_on": [ + "T7", + "T13", + "T7.137" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/storage/storage_deletion.c", + "tests/unit/test_t7_252.c", + "tests/unit/cmake/eng/t7_252.cmake", + "quality/evidence/T7.252.md" + ], + "source_paths": [ + "src/storage/storage_deletion.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.252 --regex '^test_t7_252$'" + ], + "evidence": "quality/evidence/T7.252.md", + "finding_ids": [ + "CPPCHECK-BUCKET-b4e128a1af325d4f" + ], + "rule_id": "constVariablePointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-b4e128a1af325d4f", + "path": "src/storage/storage_deletion.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariablePointer:src/storage/storage_deletion.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.253", + "title": "constVariablePointer in storage_source.c", + "depends_on": [ + "T7", + "T13", + "T7.140" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/storage/storage_source.c", + "tests/unit/test_t7_253.c", + "tests/unit/cmake/eng/t7_253.cmake", + "quality/evidence/T7.253.md" + ], + "source_paths": [ + "src/storage/storage_source.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.253 --regex '^test_t7_253$'" + ], + "evidence": "quality/evidence/T7.253.md", + "finding_ids": [ + "CPPCHECK-BUCKET-77479b4ba7ef9849" + ], + "rule_id": "constVariablePointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-77479b4ba7ef9849", + "path": "src/storage/storage_source.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariablePointer:src/storage/storage_source.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.254", + "title": "constVariablePointer in linux_network.c, linux_process.c, linux_thermal.c", + "depends_on": [ + "T7", + "T13", + "T7.208", + "T7.95", + "T7.205" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/telemetry/collectors/linux_network.c", + "src/telemetry/collectors/linux_process.c", + "src/telemetry/collectors/linux_thermal.c", + "tests/unit/test_t7_254.c", + "tests/unit/cmake/eng/t7_254.cmake", + "quality/evidence/T7.254.md" + ], + "source_paths": [ + "src/telemetry/collectors/linux_network.c", + "src/telemetry/collectors/linux_process.c", + "src/telemetry/collectors/linux_thermal.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.254 --regex '^test_t7_254$'" + ], + "evidence": "quality/evidence/T7.254.md", + "finding_ids": [ + "CPPCHECK-BUCKET-c9404ed2a73b0977", + "CPPCHECK-BUCKET-e924700b1413accd", + "CPPCHECK-BUCKET-2ca7413944026780" + ], + "rule_id": "constVariablePointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-c9404ed2a73b0977", + "path": "src/telemetry/collectors/linux_network.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariablePointer:src/telemetry/collectors/linux_network.c", + "original_count": 1, + "scanner": "cppcheck" + }, + { + "id": "CPPCHECK-BUCKET-e924700b1413accd", + "path": "src/telemetry/collectors/linux_process.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariablePointer:src/telemetry/collectors/linux_process.c", + "original_count": 1, + "scanner": "cppcheck" + }, + { + "id": "CPPCHECK-BUCKET-2ca7413944026780", + "path": "src/telemetry/collectors/linux_thermal.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariablePointer:src/telemetry/collectors/linux_thermal.c", + "original_count": 3, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.255", + "title": "constVariablePointer in linux_device_map.c, linux_hardware.c, nvme_provider.c", + "depends_on": [ + "T7", + "T13", + "T7.143", + "T7.229" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/telemetry/providers/linux_device_map.c", + "src/telemetry/providers/linux_hardware.c", + "src/telemetry/providers/nvme_provider.c", + "tests/unit/test_t7_255.c", + "tests/unit/cmake/eng/t7_255.cmake", + "quality/evidence/T7.255.md" + ], + "source_paths": [ + "src/telemetry/providers/linux_device_map.c", + "src/telemetry/providers/linux_hardware.c", + "src/telemetry/providers/nvme_provider.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.255 --regex '^test_t7_255$'" + ], + "evidence": "quality/evidence/T7.255.md", + "finding_ids": [ + "CPPCHECK-BUCKET-a1edb744b382f8f5", + "CPPCHECK-BUCKET-4001e3b91223c7ad", + "CPPCHECK-BUCKET-ae15015525d96c08" + ], + "rule_id": "constVariablePointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-a1edb744b382f8f5", + "path": "src/telemetry/providers/linux_device_map.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariablePointer:src/telemetry/providers/linux_device_map.c", + "original_count": 1, + "scanner": "cppcheck" + }, + { + "id": "CPPCHECK-BUCKET-4001e3b91223c7ad", + "path": "src/telemetry/providers/linux_hardware.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariablePointer:src/telemetry/providers/linux_hardware.c", + "original_count": 5, + "scanner": "cppcheck" + }, + { + "id": "CPPCHECK-BUCKET-ae15015525d96c08", + "path": "src/telemetry/providers/nvme_provider.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariablePointer:src/telemetry/providers/nvme_provider.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.256", + "title": "constVariablePointer in system_health.c", + "depends_on": [ + "T7", + "T13", + "T7.59" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/telemetry/system_health.c", + "tests/unit/test_t7_256.c", + "tests/unit/cmake/eng/t7_256.cmake", + "quality/evidence/T7.256.md" + ], + "source_paths": [ + "src/telemetry/system_health.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.256 --regex '^test_t7_256$'" + ], + "evidence": "quality/evidence/T7.256.md", + "finding_ids": [ + "CPPCHECK-BUCKET-f3bb2108694b562f" + ], + "rule_id": "constVariablePointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-f3bb2108694b562f", + "path": "src/telemetry/system_health.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariablePointer:src/telemetry/system_health.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.257", + "title": "constVariablePointer in system_health_evaluator.c", + "depends_on": [ + "T7", + "T13", + "T7.230" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/telemetry/system_health_evaluator.c", + "tests/unit/test_t7_257.c", + "tests/unit/cmake/eng/t7_257.cmake", + "quality/evidence/T7.257.md" + ], + "source_paths": [ + "src/telemetry/system_health_evaluator.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.257 --regex '^test_t7_257$'" + ], + "evidence": "quality/evidence/T7.257.md", + "finding_ids": [ + "CPPCHECK-BUCKET-57093ce27e4aabc5" + ], + "rule_id": "constVariablePointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-57093ce27e4aabc5", + "path": "src/telemetry/system_health_evaluator.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariablePointer:src/telemetry/system_health_evaluator.c", + "original_count": 3, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.258", + "title": "constVariablePointer in go2rtc_base_path.c", + "depends_on": [ + "T7", + "T13", + "T7.231" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/utils/go2rtc_base_path.c", + "tests/unit/test_t7_258.c", + "tests/unit/cmake/eng/t7_258.cmake", + "quality/evidence/T7.258.md" + ], + "source_paths": [ + "src/utils/go2rtc_base_path.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.258 --regex '^test_t7_258$'" + ], + "evidence": "quality/evidence/T7.258.md", + "finding_ids": [ + "CPPCHECK-BUCKET-4dc0544d99c6a120" + ], + "rule_id": "constVariablePointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-4dc0544d99c6a120", + "path": "src/utils/go2rtc_base_path.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariablePointer:src/utils/go2rtc_base_path.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.259", + "title": "constVariablePointer in detection_model.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/video/detection_model.c", + "tests/unit/test_t7_259.c", + "tests/unit/cmake/eng/t7_259.cmake", + "quality/evidence/T7.259.md" + ], + "source_paths": [ + "src/video/detection_model.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.259 --regex '^test_t7_259$'" + ], + "evidence": "quality/evidence/T7.259.md", + "finding_ids": [ + "CPPCHECK-BUCKET-aa0082260172b3b9" + ], + "rule_id": "constVariablePointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-aa0082260172b3b9", + "path": "src/video/detection_model.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariablePointer:src/video/detection_model.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.260", + "title": "constVariablePointer in go2rtc_integration.c, go2rtc_process.c", + "depends_on": [ + "T7", + "T13", + "T7.214", + "T7.145" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/video/go2rtc/go2rtc_integration.c", + "src/video/go2rtc/go2rtc_process.c", + "tests/unit/test_t7_260.c", + "tests/unit/cmake/eng/t7_260.cmake", + "quality/evidence/T7.260.md" + ], + "source_paths": [ + "src/video/go2rtc/go2rtc_integration.c", + "src/video/go2rtc/go2rtc_process.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.260 --regex '^test_t7_260$'" + ], + "evidence": "quality/evidence/T7.260.md", + "finding_ids": [ + "CPPCHECK-BUCKET-5f736ad7b9095aea", + "CPPCHECK-BUCKET-eabea03354c7b4b7" + ], + "rule_id": "constVariablePointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-5f736ad7b9095aea", + "path": "src/video/go2rtc/go2rtc_integration.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariablePointer:src/video/go2rtc/go2rtc_integration.c", + "original_count": 5, + "scanner": "cppcheck" + }, + { + "id": "CPPCHECK-BUCKET-eabea03354c7b4b7", + "path": "src/video/go2rtc/go2rtc_process.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariablePointer:src/video/go2rtc/go2rtc_process.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.261", + "title": "constVariablePointer in mp4_recording_core.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/video/mp4_recording_core.c", + "tests/unit/test_t7_261.c", + "tests/unit/cmake/eng/t7_261.cmake", + "quality/evidence/T7.261.md" + ], + "source_paths": [ + "src/video/mp4_recording_core.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.261 --regex '^test_t7_261$'" + ], + "evidence": "quality/evidence/T7.261.md", + "finding_ids": [ + "CPPCHECK-BUCKET-e9a38e72fa2e4a7c" + ], + "rule_id": "constVariablePointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-e9a38e72fa2e4a7c", + "path": "src/video/mp4_recording_core.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariablePointer:src/video/mp4_recording_core.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.262", + "title": "constVariablePointer in mp4_recording_writer.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/video/mp4_recording_writer.c", + "tests/unit/test_t7_262.c", + "tests/unit/cmake/eng/t7_262.cmake", + "quality/evidence/T7.262.md" + ], + "source_paths": [ + "src/video/mp4_recording_writer.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.262 --regex '^test_t7_262$'" + ], + "evidence": "quality/evidence/T7.262.md", + "finding_ids": [ + "CPPCHECK-BUCKET-3ec7089cfaa16e94" + ], + "rule_id": "constVariablePointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-3ec7089cfaa16e94", + "path": "src/video/mp4_recording_writer.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariablePointer:src/video/mp4_recording_writer.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.263", + "title": "constVariablePointer in stream_state_adapter.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/video/stream_state_adapter.c", + "tests/unit/test_t7_263.c", + "tests/unit/cmake/eng/t7_263.cmake", + "quality/evidence/T7.263.md" + ], + "source_paths": [ + "src/video/stream_state_adapter.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.263 --regex '^test_t7_263$'" + ], + "evidence": "quality/evidence/T7.263.md", + "finding_ids": [ + "CPPCHECK-BUCKET-4ffd5c5d72b2c6a0" + ], + "rule_id": "constVariablePointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-4ffd5c5d72b2c6a0", + "path": "src/video/stream_state_adapter.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariablePointer:src/video/stream_state_adapter.c", + "original_count": 2, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.264", + "title": "constVariablePointer in api_handlers_go2rtc_proxy.c", + "depends_on": [ + "T7", + "T13", + "T7.219" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_go2rtc_proxy.c", + "tests/unit/test_t7_264.c", + "tests/unit/cmake/eng/t7_264.cmake", + "quality/evidence/T7.264.md" + ], + "source_paths": [ + "src/web/api_handlers_go2rtc_proxy.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.264 --regex '^test_t7_264$'" + ], + "evidence": "quality/evidence/T7.264.md", + "finding_ids": [ + "CPPCHECK-BUCKET-f4469b09cc19dae9" + ], + "rule_id": "constVariablePointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-f4469b09cc19dae9", + "path": "src/web/api_handlers_go2rtc_proxy.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariablePointer:src/web/api_handlers_go2rtc_proxy.c", + "original_count": 2, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.265", + "title": "constVariablePointer in api_handlers_recordings_list.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_recordings_list.c", + "tests/unit/test_t7_265.c", + "tests/unit/cmake/eng/t7_265.cmake", + "quality/evidence/T7.265.md" + ], + "source_paths": [ + "src/web/api_handlers_recordings_list.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.265 --regex '^test_t7_265$'" + ], + "evidence": "quality/evidence/T7.265.md", + "finding_ids": [ + "CPPCHECK-BUCKET-611000c5c122ad1e" + ], + "rule_id": "constVariablePointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-611000c5c122ad1e", + "path": "src/web/api_handlers_recordings_list.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariablePointer:src/web/api_handlers_recordings_list.c", + "original_count": 2, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.266", + "title": "constVariablePointer in api_handlers_recordings_thumbnail.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_recordings_thumbnail.c", + "tests/unit/test_t7_266.c", + "tests/unit/cmake/eng/t7_266.cmake", + "quality/evidence/T7.266.md" + ], + "source_paths": [ + "src/web/api_handlers_recordings_thumbnail.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.266 --regex '^test_t7_266$'" + ], + "evidence": "quality/evidence/T7.266.md", + "finding_ids": [ + "CPPCHECK-BUCKET-d41611e4fb1c1abd" + ], + "rule_id": "constVariablePointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-d41611e4fb1c1abd", + "path": "src/web/api_handlers_recordings_thumbnail.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariablePointer:src/web/api_handlers_recordings_thumbnail.c", + "original_count": 2, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.267", + "title": "constVariablePointer in api_handlers_system_logs.c", + "depends_on": [ + "T7", + "T13", + "T7.149" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_system_logs.c", + "tests/unit/test_t7_267.c", + "tests/unit/cmake/eng/t7_267.cmake", + "quality/evidence/T7.267.md" + ], + "source_paths": [ + "src/web/api_handlers_system_logs.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.267 --regex '^test_t7_267$'" + ], + "evidence": "quality/evidence/T7.267.md", + "finding_ids": [ + "CPPCHECK-BUCKET-b14c25475c91b307" + ], + "rule_id": "constVariablePointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-b14c25475c91b307", + "path": "src/web/api_handlers_system_logs.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariablePointer:src/web/api_handlers_system_logs.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.268", + "title": "constVariablePointer in api_handlers_timeline.c", + "depends_on": [ + "T7", + "T13", + "T7.107" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_timeline.c", + "tests/unit/test_t7_268.c", + "tests/unit/cmake/eng/t7_268.cmake", + "quality/evidence/T7.268.md" + ], + "source_paths": [ + "src/web/api_handlers_timeline.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.268 --regex '^test_t7_268$'" + ], + "evidence": "quality/evidence/T7.268.md", + "finding_ids": [ + "CPPCHECK-BUCKET-03f92e362a140589" + ], + "rule_id": "constVariablePointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-03f92e362a140589", + "path": "src/web/api_handlers_timeline.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariablePointer:src/web/api_handlers_timeline.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.269", + "title": "constVariablePointer in api_handlers_users_backend_agnostic.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_users_backend_agnostic.c", + "tests/unit/test_t7_269.c", + "tests/unit/cmake/eng/t7_269.cmake", + "quality/evidence/T7.269.md" + ], + "source_paths": [ + "src/web/api_handlers_users_backend_agnostic.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.269 --regex '^test_t7_269$'" + ], + "evidence": "quality/evidence/T7.269.md", + "finding_ids": [ + "CPPCHECK-BUCKET-d45c6fa42b05db96" + ], + "rule_id": "constVariablePointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-d45c6fa42b05db96", + "path": "src/web/api_handlers_users_backend_agnostic.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariablePointer:src/web/api_handlers_users_backend_agnostic.c", + "original_count": 2, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.270", + "title": "constVariablePointer in httpd_utils.c", + "depends_on": [ + "T7", + "T13", + "T7.133" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/web/httpd_utils.c", + "tests/unit/test_t7_270.c", + "tests/unit/cmake/eng/t7_270.cmake", + "quality/evidence/T7.270.md" + ], + "source_paths": [ + "src/web/httpd_utils.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.270 --regex '^test_t7_270$'" + ], + "evidence": "quality/evidence/T7.270.md", + "finding_ids": [ + "CPPCHECK-BUCKET-9551a431943d8273" + ], + "rule_id": "constVariablePointer", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-9551a431943d8273", + "path": "src/web/httpd_utils.c", + "line": null, + "fingerprint": "cppcheck-bucket:constVariablePointer:src/web/httpd_utils.c", + "original_count": 3, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.271", + "title": "duplicateAssignExpression in sod.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_271-upstream.json", + "quality/evidence/T7.271.md" + ], + "source_paths": [ + "src/sod/sod.c" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_271-upstream.json" + ], + "evidence": "quality/evidence/T7.271.md", + "finding_ids": [ + "CPPCHECK-BUCKET-86335be98f6f2e90" + ], + "rule_id": "duplicateAssignExpression", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-86335be98f6f2e90", + "path": "src/sod/sod.c", + "line": null, + "fingerprint": "cppcheck-bucket:duplicateAssignExpression:src/sod/sod.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.272", + "title": "duplicateCondition in motion_detection.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/video/motion_detection.c", + "tests/unit/test_t7_272.c", + "tests/unit/cmake/eng/t7_272.cmake", + "quality/evidence/T7.272.md" + ], + "source_paths": [ + "src/video/motion_detection.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.272 --regex '^test_t7_272$'" + ], + "evidence": "quality/evidence/T7.272.md", + "finding_ids": [ + "CPPCHECK-BUCKET-f814692d9029a8a1" + ], + "rule_id": "duplicateCondition", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-f814692d9029a8a1", + "path": "src/video/motion_detection.c", + "line": null, + "fingerprint": "cppcheck-bucket:duplicateCondition:src/video/motion_detection.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.273", + "title": "js/unused-local-variable in LanguageSelector.jsx", + "depends_on": [ + "T7", + "T10", + "T7.196" + ], + "kind": "web-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "web/js/components/preact/common/LanguageSelector.jsx", + "web/tests/remediation/t7_273.spec.jsx", + "quality/evidence/T7.273.md" + ], + "source_paths": [ + "web/js/components/preact/common/LanguageSelector.jsx" + ], + "description": "Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests.", + "acceptance_criteria": [ + "Remove only the proven unused binding; assert language selection/persistence and localized rendering still work.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "npm --prefix web test -- --runInBand --testPathPatterns=t7_273", + "mkdir -p build/eng-artifacts/T7.273", + "web/node_modules/.bin/eslint web/js/components/preact/common/LanguageSelector.jsx --format json --output-file build/eng-artifacts/T7.273/eslint.json", + "python3 -c 'import json; data=json.load(open('\"'\"'build/eng-artifacts/T7.273/eslint.json'\"'\"')); assert not [m for f in data for m in f[\"messages\"] if m.get(\"ruleId\")=='\"'\"'js/unused-local-variable'\"'\"'], \"targeted diagnostic remains\"'" + ], + "evidence": "quality/evidence/T7.273.md", + "finding_ids": [ + "CODEQUALITY-941" + ], + "rule_id": "js/unused-local-variable", + "reproducers": [ + { + "id": "CODEQUALITY-941", + "path": "web/js/components/preact/common/LanguageSelector.jsx", + "line": 4, + "fingerprint": "code-quality:js/unused-local-variable:web/js/components/preact/common/LanguageSelector.jsx:933ea2431b1d5059", + "original_count": 1, + "scanner": "github-code-quality" + } + ], + "lease": "isolated Jest test; exclusive full lint/build lease" + }, + { + "id": "T7.274", + "title": "knownConditionTrueFalse in sod_img_reader.h", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_274-upstream.json", + "quality/evidence/T7.274.md" + ], + "source_paths": [ + "include/sod/sod_img_reader.h" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_274-upstream.json" + ], + "evidence": "quality/evidence/T7.274.md", + "finding_ids": [ + "CPPCHECK-BUCKET-1f586f8741e770e9" + ], + "rule_id": "knownConditionTrueFalse", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-1f586f8741e770e9", + "path": "include/sod/sod_img_reader.h", + "line": null, + "fingerprint": "cppcheck-bucket:knownConditionTrueFalse:include/sod/sod_img_reader.h", + "original_count": 7, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.275", + "title": "knownConditionTrueFalse in event_router.c", + "depends_on": [ + "T7", + "T13", + "T7.90" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/core/event_router.c", + "tests/unit/test_t7_275.c", + "tests/unit/cmake/eng/t7_275.cmake", + "quality/evidence/T7.275.md" + ], + "source_paths": [ + "src/core/event_router.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.275 --regex '^test_t7_275$'" + ], + "evidence": "quality/evidence/T7.275.md", + "finding_ids": [ + "CPPCHECK-BUCKET-95058fe138843b1f" + ], + "rule_id": "knownConditionTrueFalse", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-95058fe138843b1f", + "path": "src/core/event_router.c", + "line": null, + "fingerprint": "cppcheck-bucket:knownConditionTrueFalse:src/core/event_router.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.276", + "title": "knownConditionTrueFalse in mqtt_event_adapter.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/core/mqtt_event_adapter.c", + "tests/unit/test_t7_276.c", + "tests/unit/cmake/eng/t7_276.cmake", + "quality/evidence/T7.276.md" + ], + "source_paths": [ + "src/core/mqtt_event_adapter.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.276 --regex '^test_t7_276$'" + ], + "evidence": "quality/evidence/T7.276.md", + "finding_ids": [ + "CPPCHECK-BUCKET-9c71189558451cd4" + ], + "rule_id": "knownConditionTrueFalse", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-9c71189558451cd4", + "path": "src/core/mqtt_event_adapter.c", + "line": null, + "fingerprint": "cppcheck-bucket:knownConditionTrueFalse:src/core/mqtt_event_adapter.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.277", + "title": "knownConditionTrueFalse in db_storage_targets.c", + "depends_on": [ + "T7", + "T13", + "T7.136" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/database/db_storage_targets.c", + "tests/unit/test_t7_277.c", + "tests/unit/cmake/eng/t7_277.cmake", + "quality/evidence/T7.277.md" + ], + "source_paths": [ + "src/database/db_storage_targets.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.277 --regex '^test_t7_277$'" + ], + "evidence": "quality/evidence/T7.277.md", + "finding_ids": [ + "CPPCHECK-BUCKET-2f8dc61aeb7cdda6" + ], + "rule_id": "knownConditionTrueFalse", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-2f8dc61aeb7cdda6", + "path": "src/database/db_storage_targets.c", + "line": null, + "fingerprint": "cppcheck-bucket:knownConditionTrueFalse:src/database/db_storage_targets.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.278", + "title": "knownConditionTrueFalse in ezxml.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_278-upstream.json", + "quality/evidence/T7.278.md" + ], + "source_paths": [ + "src/ezxml/ezxml.c" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_278-upstream.json" + ], + "evidence": "quality/evidence/T7.278.md", + "finding_ids": [ + "CPPCHECK-BUCKET-c7e9176ca688d280" + ], + "rule_id": "knownConditionTrueFalse", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-c7e9176ca688d280", + "path": "src/ezxml/ezxml.c", + "line": null, + "fingerprint": "cppcheck-bucket:knownConditionTrueFalse:src/ezxml/ezxml.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.279", + "title": "knownConditionTrueFalse in sod.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_279-upstream.json", + "quality/evidence/T7.279.md" + ], + "source_paths": [ + "src/sod/sod.c" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_279-upstream.json" + ], + "evidence": "quality/evidence/T7.279.md", + "finding_ids": [ + "CPPCHECK-BUCKET-064299ecf7d09b55" + ], + "rule_id": "knownConditionTrueFalse", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-064299ecf7d09b55", + "path": "src/sod/sod.c", + "line": null, + "fingerprint": "cppcheck-bucket:knownConditionTrueFalse:src/sod/sod.c", + "original_count": 4, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.280", + "title": "knownConditionTrueFalse in linux_process.c", + "depends_on": [ + "T7", + "T13", + "T7.254" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/telemetry/collectors/linux_process.c", + "tests/unit/test_t7_280.c", + "tests/unit/cmake/eng/t7_280.cmake", + "quality/evidence/T7.280.md" + ], + "source_paths": [ + "src/telemetry/collectors/linux_process.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.280 --regex '^test_t7_280$'" + ], + "evidence": "quality/evidence/T7.280.md", + "finding_ids": [ + "CPPCHECK-BUCKET-28b7ea4b18c686f4" + ], + "rule_id": "knownConditionTrueFalse", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-28b7ea4b18c686f4", + "path": "src/telemetry/collectors/linux_process.c", + "line": null, + "fingerprint": "cppcheck-bucket:knownConditionTrueFalse:src/telemetry/collectors/linux_process.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.281", + "title": "knownConditionTrueFalse in health_helper_runner.c", + "depends_on": [ + "T7", + "T13", + "T7.68" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/telemetry/health_helper_runner.c", + "tests/unit/test_t7_281.c", + "tests/unit/cmake/eng/t7_281.cmake", + "quality/evidence/T7.281.md" + ], + "source_paths": [ + "src/telemetry/health_helper_runner.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.281 --regex '^test_t7_281$'" + ], + "evidence": "quality/evidence/T7.281.md", + "finding_ids": [ + "CPPCHECK-BUCKET-1ac7ae81e97d3df2" + ], + "rule_id": "knownConditionTrueFalse", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-1ac7ae81e97d3df2", + "path": "src/telemetry/health_helper_runner.c", + "line": null, + "fingerprint": "cppcheck-bucket:knownConditionTrueFalse:src/telemetry/health_helper_runner.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.282", + "title": "knownConditionTrueFalse in api_handlers_imaging.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_imaging.c", + "tests/unit/test_t7_282.c", + "tests/unit/cmake/eng/t7_282.cmake", + "quality/evidence/T7.282.md" + ], + "source_paths": [ + "src/web/api_handlers_imaging.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.282 --regex '^test_t7_282$'" + ], + "evidence": "quality/evidence/T7.282.md", + "finding_ids": [ + "CPPCHECK-BUCKET-0251d17e5b89df2a" + ], + "rule_id": "knownConditionTrueFalse", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-0251d17e5b89df2a", + "path": "src/web/api_handlers_imaging.c", + "line": null, + "fingerprint": "cppcheck-bucket:knownConditionTrueFalse:src/web/api_handlers_imaging.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.283", + "title": "redundantCondition in sod_img_reader.h", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_283-upstream.json", + "quality/evidence/T7.283.md" + ], + "source_paths": [ + "include/sod/sod_img_reader.h" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_283-upstream.json" + ], + "evidence": "quality/evidence/T7.283.md", + "finding_ids": [ + "CPPCHECK-BUCKET-eee46ed30daef891" + ], + "rule_id": "redundantCondition", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-eee46ed30daef891", + "path": "include/sod/sod_img_reader.h", + "line": null, + "fingerprint": "cppcheck-bucket:redundantCondition:include/sod/sod_img_reader.h", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.284", + "title": "redundantInitialization in sod_img_reader.h", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_284-upstream.json", + "quality/evidence/T7.284.md" + ], + "source_paths": [ + "include/sod/sod_img_reader.h" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_284-upstream.json" + ], + "evidence": "quality/evidence/T7.284.md", + "finding_ids": [ + "CPPCHECK-BUCKET-dcdbd8e6357d7e12" + ], + "rule_id": "redundantInitialization", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-dcdbd8e6357d7e12", + "path": "include/sod/sod_img_reader.h", + "line": null, + "fingerprint": "cppcheck-bucket:redundantInitialization:include/sod/sod_img_reader.h", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.285", + "title": "redundantInitialization in db_authorization.c", + "depends_on": [ + "T7", + "T13", + "T7.245" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/database/db_authorization.c", + "tests/unit/test_t7_285.c", + "tests/unit/cmake/eng/t7_285.cmake", + "quality/evidence/T7.285.md" + ], + "source_paths": [ + "src/database/db_authorization.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.285 --regex '^test_t7_285$'" + ], + "evidence": "quality/evidence/T7.285.md", + "finding_ids": [ + "CPPCHECK-BUCKET-bbeef7abfa51d073" + ], + "rule_id": "redundantInitialization", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-bbeef7abfa51d073", + "path": "src/database/db_authorization.c", + "line": null, + "fingerprint": "cppcheck-bucket:redundantInitialization:src/database/db_authorization.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.286", + "title": "redundantInitialization in recording_path.c", + "depends_on": [ + "T7", + "T13", + "T7.157" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/video/recording_path.c", + "tests/unit/test_t7_286.c", + "tests/unit/cmake/eng/t7_286.cmake", + "quality/evidence/T7.286.md" + ], + "source_paths": [ + "src/video/recording_path.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.286 --regex '^test_t7_286$'" + ], + "evidence": "quality/evidence/T7.286.md", + "finding_ids": [ + "CPPCHECK-BUCKET-0be349a4e3fc0518" + ], + "rule_id": "redundantInitialization", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-0be349a4e3fc0518", + "path": "src/video/recording_path.c", + "line": null, + "fingerprint": "cppcheck-bucket:redundantInitialization:src/video/recording_path.c", + "original_count": 2, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.287", + "title": "redundantPointerOp in sod.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_287-upstream.json", + "quality/evidence/T7.287.md" + ], + "source_paths": [ + "src/sod/sod.c" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_287-upstream.json" + ], + "evidence": "quality/evidence/T7.287.md", + "finding_ids": [ + "CPPCHECK-BUCKET-8f929a70e127f155" + ], + "rule_id": "redundantPointerOp", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-8f929a70e127f155", + "path": "src/sod/sod.c", + "line": null, + "fingerprint": "cppcheck-bucket:redundantPointerOp:src/sod/sod.c", + "original_count": 59, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.288", + "title": "shadowFunction in db_storage_targets.c", + "depends_on": [ + "T7", + "T13", + "T7.277" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/database/db_storage_targets.c", + "tests/unit/test_t7_288.c", + "tests/unit/cmake/eng/t7_288.cmake", + "quality/evidence/T7.288.md" + ], + "source_paths": [ + "src/database/db_storage_targets.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.288 --regex '^test_t7_288$'" + ], + "evidence": "quality/evidence/T7.288.md", + "finding_ids": [ + "CPPCHECK-BUCKET-147fba26f7ae351b" + ], + "rule_id": "shadowFunction", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-147fba26f7ae351b", + "path": "src/database/db_storage_targets.c", + "line": null, + "fingerprint": "cppcheck-bucket:shadowFunction:src/database/db_storage_targets.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.289", + "title": "shadowFunction in stream_manager.c", + "depends_on": [ + "T7", + "T13", + "T7.62" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/video/stream_manager.c", + "tests/unit/test_t7_289.c", + "tests/unit/cmake/eng/t7_289.cmake", + "quality/evidence/T7.289.md" + ], + "source_paths": [ + "src/video/stream_manager.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.289 --regex '^test_t7_289$'" + ], + "evidence": "quality/evidence/T7.289.md", + "finding_ids": [ + "CPPCHECK-BUCKET-05b22ae697eaa4ca" + ], + "rule_id": "shadowFunction", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-05b22ae697eaa4ca", + "path": "src/video/stream_manager.c", + "line": null, + "fingerprint": "cppcheck-bucket:shadowFunction:src/video/stream_manager.c", + "original_count": 6, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.290", + "title": "shadowVariable in config.h", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "include/core/config.h", + "tests/unit/test_t7_290.c", + "tests/unit/cmake/eng/t7_290.cmake", + "quality/evidence/T7.290.md" + ], + "source_paths": [ + "include/core/config.h" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.290 --regex '^test_t7_290$'" + ], + "evidence": "quality/evidence/T7.290.md", + "finding_ids": [ + "CPPCHECK-BUCKET-9d2c058ee958f85a" + ], + "rule_id": "shadowVariable", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-9d2c058ee958f85a", + "path": "include/core/config.h", + "line": null, + "fingerprint": "cppcheck-bucket:shadowVariable:include/core/config.h", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.291", + "title": "unpreciseMathCall in sod.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_291-upstream.json", + "quality/evidence/T7.291.md" + ], + "source_paths": [ + "src/sod/sod.c" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_291-upstream.json" + ], + "evidence": "quality/evidence/T7.291.md", + "finding_ids": [ + "CPPCHECK-BUCKET-426773bc9bc5a5d5" + ], + "rule_id": "unpreciseMathCall", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-426773bc9bc5a5d5", + "path": "src/sod/sod.c", + "line": null, + "fingerprint": "cppcheck-bucket:unpreciseMathCall:src/sod/sod.c", + "original_count": 2, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.292", + "title": "unreadVariable in sod_img_reader.h", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_292-upstream.json", + "quality/evidence/T7.292.md" + ], + "source_paths": [ + "include/sod/sod_img_reader.h" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_292-upstream.json" + ], + "evidence": "quality/evidence/T7.292.md", + "finding_ids": [ + "CPPCHECK-BUCKET-eda9b7001501e847" + ], + "rule_id": "unreadVariable", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-eda9b7001501e847", + "path": "include/sod/sod_img_reader.h", + "line": null, + "fingerprint": "cppcheck-bucket:unreadVariable:include/sod/sod_img_reader.h", + "original_count": 6, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.293", + "title": "unreadVariable in mqtt_client.c", + "depends_on": [ + "T7", + "T13", + "T7.29" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/core/mqtt_client.c", + "tests/unit/test_t7_293.c", + "tests/unit/cmake/eng/t7_293.cmake", + "quality/evidence/T7.293.md" + ], + "source_paths": [ + "src/core/mqtt_client.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.293 --regex '^test_t7_293$'" + ], + "evidence": "quality/evidence/T7.293.md", + "finding_ids": [ + "CPPCHECK-BUCKET-779ca0994d939da1" + ], + "rule_id": "unreadVariable", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-779ca0994d939da1", + "path": "src/core/mqtt_client.c", + "line": null, + "fingerprint": "cppcheck-bucket:unreadVariable:src/core/mqtt_client.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.294", + "title": "unreadVariable in sod.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_294-upstream.json", + "quality/evidence/T7.294.md" + ], + "source_paths": [ + "src/sod/sod.c" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_294-upstream.json" + ], + "evidence": "quality/evidence/T7.294.md", + "finding_ids": [ + "CPPCHECK-BUCKET-93112ea9a6a3c10d" + ], + "rule_id": "unreadVariable", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-93112ea9a6a3c10d", + "path": "src/sod/sod.c", + "line": null, + "fingerprint": "cppcheck-bucket:unreadVariable:src/sod/sod.c", + "original_count": 51, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.295", + "title": "unreadVariable in onvif_ptz.c", + "depends_on": [ + "T7", + "T13", + "T7.218" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/video/onvif_ptz.c", + "tests/unit/test_t7_295.c", + "tests/unit/cmake/eng/t7_295.cmake", + "quality/evidence/T7.295.md" + ], + "source_paths": [ + "src/video/onvif_ptz.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.295 --regex '^test_t7_295$'" + ], + "evidence": "quality/evidence/T7.295.md", + "finding_ids": [ + "CPPCHECK-BUCKET-b1b17a4b9a2646a0" + ], + "rule_id": "unreadVariable", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-b1b17a4b9a2646a0", + "path": "src/video/onvif_ptz.c", + "line": null, + "fingerprint": "cppcheck-bucket:unreadVariable:src/video/onvif_ptz.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.296", + "title": "unsignedLessThanZero in sod.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_296-upstream.json", + "quality/evidence/T7.296.md" + ], + "source_paths": [ + "src/sod/sod.c" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_296-upstream.json" + ], + "evidence": "quality/evidence/T7.296.md", + "finding_ids": [ + "CPPCHECK-BUCKET-a4ae78869ec196b6" + ], + "rule_id": "unsignedLessThanZero", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-a4ae78869ec196b6", + "path": "src/sod/sod.c", + "line": null, + "fingerprint": "cppcheck-bucket:unsignedLessThanZero:src/sod/sod.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.297", + "title": "unusedStructMember in mqtt_destination_client.c", + "depends_on": [ + "T7", + "T13", + "T7.224" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/core/mqtt_destination_client.c", + "tests/unit/test_t7_297.c", + "tests/unit/cmake/eng/t7_297.cmake", + "quality/evidence/T7.297.md" + ], + "source_paths": [ + "src/core/mqtt_destination_client.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.297 --regex '^test_t7_297$'" + ], + "evidence": "quality/evidence/T7.297.md", + "finding_ids": [ + "CPPCHECK-BUCKET-efd7988ca87c95ed" + ], + "rule_id": "unusedStructMember", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-efd7988ca87c95ed", + "path": "src/core/mqtt_destination_client.c", + "line": null, + "fingerprint": "cppcheck-bucket:unusedStructMember:src/core/mqtt_destination_client.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.298", + "title": "unusedStructMember in sod.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_298-upstream.json", + "quality/evidence/T7.298.md" + ], + "source_paths": [ + "src/sod/sod.c" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_298-upstream.json" + ], + "evidence": "quality/evidence/T7.298.md", + "finding_ids": [ + "CPPCHECK-BUCKET-49117790281d294c" + ], + "rule_id": "unusedStructMember", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-49117790281d294c", + "path": "src/sod/sod.c", + "line": null, + "fingerprint": "cppcheck-bucket:unusedStructMember:src/sod/sod.c", + "original_count": 22, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.299", + "title": "unusedStructMember in sod_detection.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/video/sod_detection.c", + "tests/unit/test_t7_299.c", + "tests/unit/cmake/eng/t7_299.cmake", + "quality/evidence/T7.299.md" + ], + "source_paths": [ + "src/video/sod_detection.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.299 --regex '^test_t7_299$'" + ], + "evidence": "quality/evidence/T7.299.md", + "finding_ids": [ + "CPPCHECK-BUCKET-a12a87ba590d2536" + ], + "rule_id": "unusedStructMember", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-a12a87ba590d2536", + "path": "src/video/sod_detection.c", + "line": null, + "fingerprint": "cppcheck-bucket:unusedStructMember:src/video/sod_detection.c", + "original_count": 18, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.300", + "title": "uselessAssignmentArg in sod.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_300-upstream.json", + "quality/evidence/T7.300.md" + ], + "source_paths": [ + "src/sod/sod.c" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_300-upstream.json" + ], + "evidence": "quality/evidence/T7.300.md", + "finding_ids": [ + "CPPCHECK-BUCKET-56c122b53a2e50cb" + ], + "rule_id": "uselessAssignmentArg", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-56c122b53a2e50cb", + "path": "src/sod/sod.c", + "line": null, + "fingerprint": "cppcheck-bucket:uselessAssignmentArg:src/sod/sod.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.301", + "title": "variableScope in sod_img_reader.h, sod_img_writer.h", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_301-upstream.json", + "quality/evidence/T7.301.md" + ], + "source_paths": [ + "include/sod/sod_img_reader.h", + "include/sod/sod_img_writer.h" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_301-upstream.json" + ], + "evidence": "quality/evidence/T7.301.md", + "finding_ids": [ + "CPPCHECK-BUCKET-ae4dbf08b9cfd1fe", + "CPPCHECK-BUCKET-b9ff6009cfa26f69" + ], + "rule_id": "variableScope", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-ae4dbf08b9cfd1fe", + "path": "include/sod/sod_img_reader.h", + "line": null, + "fingerprint": "cppcheck-bucket:variableScope:include/sod/sod_img_reader.h", + "original_count": 16, + "scanner": "cppcheck" + }, + { + "id": "CPPCHECK-BUCKET-b9ff6009cfa26f69", + "path": "include/sod/sod_img_writer.h", + "line": null, + "fingerprint": "cppcheck-bucket:variableScope:include/sod/sod_img_writer.h", + "original_count": 3, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.302", + "title": "variableScope in db_detection_engines.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/database/db_detection_engines.c", + "tests/unit/test_t7_302.c", + "tests/unit/cmake/eng/t7_302.cmake", + "quality/evidence/T7.302.md" + ], + "source_paths": [ + "src/database/db_detection_engines.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.302 --regex '^test_t7_302$'" + ], + "evidence": "quality/evidence/T7.302.md", + "finding_ids": [ + "CPPCHECK-BUCKET-b614f3b94230fe9a" + ], + "rule_id": "variableScope", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-b614f3b94230fe9a", + "path": "src/database/db_detection_engines.c", + "line": null, + "fingerprint": "cppcheck-bucket:variableScope:src/database/db_detection_engines.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.303", + "title": "variableScope in db_lpr_reads.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/database/db_lpr_reads.c", + "tests/unit/test_t7_303.c", + "tests/unit/cmake/eng/t7_303.cmake", + "quality/evidence/T7.303.md" + ], + "source_paths": [ + "src/database/db_lpr_reads.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.303 --regex '^test_t7_303$'" + ], + "evidence": "quality/evidence/T7.303.md", + "finding_ids": [ + "CPPCHECK-BUCKET-664e70c550c3ef36" + ], + "rule_id": "variableScope", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-664e70c550c3ef36", + "path": "src/database/db_lpr_reads.c", + "line": null, + "fingerprint": "cppcheck-bucket:variableScope:src/database/db_lpr_reads.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.304", + "title": "variableScope in db_recordings.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/database/db_recordings.c", + "tests/unit/test_t7_304.c", + "tests/unit/cmake/eng/t7_304.cmake", + "quality/evidence/T7.304.md" + ], + "source_paths": [ + "src/database/db_recordings.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.304 --regex '^test_t7_304$'" + ], + "evidence": "quality/evidence/T7.304.md", + "finding_ids": [ + "CPPCHECK-BUCKET-2afdb0b1f1146eeb" + ], + "rule_id": "variableScope", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-2afdb0b1f1146eeb", + "path": "src/database/db_recordings.c", + "line": null, + "fingerprint": "cppcheck-bucket:variableScope:src/database/db_recordings.c", + "original_count": 2, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.305", + "title": "variableScope in ezxml.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_305-upstream.json", + "quality/evidence/T7.305.md" + ], + "source_paths": [ + "src/ezxml/ezxml.c" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_305-upstream.json" + ], + "evidence": "quality/evidence/T7.305.md", + "finding_ids": [ + "CPPCHECK-BUCKET-96d5b13210206feb" + ], + "rule_id": "variableScope", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-96d5b13210206feb", + "path": "src/ezxml/ezxml.c", + "line": null, + "fingerprint": "cppcheck-bucket:variableScope:src/ezxml/ezxml.c", + "original_count": 3, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.306", + "title": "variableScope in sod.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "upstream-review", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "quality/reviews/t7_306-upstream.json", + "quality/evidence/T7.306.md" + ], + "source_paths": [ + "src/sod/sod.c" + ], + "description": "Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 -m json.tool quality/reviews/t7_306-upstream.json" + ], + "evidence": "quality/evidence/T7.306.md", + "finding_ids": [ + "CPPCHECK-BUCKET-50bc6e286ac69abd" + ], + "rule_id": "variableScope", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-50bc6e286ac69abd", + "path": "src/sod/sod.c", + "line": null, + "fingerprint": "cppcheck-bucket:variableScope:src/sod/sod.c", + "original_count": 56, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.307", + "title": "variableScope in storage_deletion.c", + "depends_on": [ + "T7", + "T13", + "T7.252" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/storage/storage_deletion.c", + "tests/unit/test_t7_307.c", + "tests/unit/cmake/eng/t7_307.cmake", + "quality/evidence/T7.307.md" + ], + "source_paths": [ + "src/storage/storage_deletion.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.307 --regex '^test_t7_307$'" + ], + "evidence": "quality/evidence/T7.307.md", + "finding_ids": [ + "CPPCHECK-BUCKET-89a47a59067748c1" + ], + "rule_id": "variableScope", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-89a47a59067748c1", + "path": "src/storage/storage_deletion.c", + "line": null, + "fingerprint": "cppcheck-bucket:variableScope:src/storage/storage_deletion.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.308", + "title": "variableScope in storage_migration.c", + "depends_on": [ + "T7", + "T13", + "T7.211" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/storage/storage_migration.c", + "tests/unit/test_t7_308.c", + "tests/unit/cmake/eng/t7_308.cmake", + "quality/evidence/T7.308.md" + ], + "source_paths": [ + "src/storage/storage_migration.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.308 --regex '^test_t7_308$'" + ], + "evidence": "quality/evidence/T7.308.md", + "finding_ids": [ + "CPPCHECK-BUCKET-da5006735d5c5165" + ], + "rule_id": "variableScope", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-da5006735d5c5165", + "path": "src/storage/storage_migration.c", + "line": null, + "fingerprint": "cppcheck-bucket:variableScope:src/storage/storage_migration.c", + "original_count": 5, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.309", + "title": "variableScope in storage_placement.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/storage/storage_placement.c", + "tests/unit/test_t7_309.c", + "tests/unit/cmake/eng/t7_309.cmake", + "quality/evidence/T7.309.md" + ], + "source_paths": [ + "src/storage/storage_placement.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.309 --regex '^test_t7_309$'" + ], + "evidence": "quality/evidence/T7.309.md", + "finding_ids": [ + "CPPCHECK-BUCKET-51dd1a644803f48d" + ], + "rule_id": "variableScope", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-51dd1a644803f48d", + "path": "src/storage/storage_placement.c", + "line": null, + "fingerprint": "cppcheck-bucket:variableScope:src/storage/storage_placement.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.310", + "title": "variableScope in storage_s3.c", + "depends_on": [ + "T7", + "T13", + "T7.142" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/storage/storage_s3.c", + "tests/unit/test_t7_310.c", + "tests/unit/cmake/eng/t7_310.cmake", + "quality/evidence/T7.310.md" + ], + "source_paths": [ + "src/storage/storage_s3.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.310 --regex '^test_t7_310$'" + ], + "evidence": "quality/evidence/T7.310.md", + "finding_ids": [ + "CPPCHECK-BUCKET-a3e8d56a93d61112" + ], + "rule_id": "variableScope", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-a3e8d56a93d61112", + "path": "src/storage/storage_s3.c", + "line": null, + "fingerprint": "cppcheck-bucket:variableScope:src/storage/storage_s3.c", + "original_count": 3, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.311", + "title": "variableScope in linux_cgroup.c, linux_thermal.c", + "depends_on": [ + "T7", + "T13", + "T7.228", + "T7.254" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/telemetry/collectors/linux_cgroup.c", + "src/telemetry/collectors/linux_thermal.c", + "tests/unit/test_t7_311.c", + "tests/unit/cmake/eng/t7_311.cmake", + "quality/evidence/T7.311.md" + ], + "source_paths": [ + "src/telemetry/collectors/linux_cgroup.c", + "src/telemetry/collectors/linux_thermal.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.311 --regex '^test_t7_311$'" + ], + "evidence": "quality/evidence/T7.311.md", + "finding_ids": [ + "CPPCHECK-BUCKET-771b3fde1937be8a", + "CPPCHECK-BUCKET-e4dae70b5d1bd770" + ], + "rule_id": "variableScope", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-771b3fde1937be8a", + "path": "src/telemetry/collectors/linux_cgroup.c", + "line": null, + "fingerprint": "cppcheck-bucket:variableScope:src/telemetry/collectors/linux_cgroup.c", + "original_count": 1, + "scanner": "cppcheck" + }, + { + "id": "CPPCHECK-BUCKET-e4dae70b5d1bd770", + "path": "src/telemetry/collectors/linux_thermal.c", + "line": null, + "fingerprint": "cppcheck-bucket:variableScope:src/telemetry/collectors/linux_thermal.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.312", + "title": "variableScope in stream_metrics.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/telemetry/stream_metrics.c", + "tests/unit/test_t7_312.c", + "tests/unit/cmake/eng/t7_312.cmake", + "quality/evidence/T7.312.md" + ], + "source_paths": [ + "src/telemetry/stream_metrics.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.312 --regex '^test_t7_312$'" + ], + "evidence": "quality/evidence/T7.312.md", + "finding_ids": [ + "CPPCHECK-BUCKET-9cc73ce911540ad4" + ], + "rule_id": "variableScope", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-9cc73ce911540ad4", + "path": "src/telemetry/stream_metrics.c", + "line": null, + "fingerprint": "cppcheck-bucket:variableScope:src/telemetry/stream_metrics.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.313", + "title": "variableScope in api_detection.c", + "depends_on": [ + "T7", + "T13", + "T7.213" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/video/api_detection.c", + "tests/unit/test_t7_313.c", + "tests/unit/cmake/eng/t7_313.cmake", + "quality/evidence/T7.313.md" + ], + "source_paths": [ + "src/video/api_detection.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.313 --regex '^test_t7_313$'" + ], + "evidence": "quality/evidence/T7.313.md", + "finding_ids": [ + "CPPCHECK-BUCKET-905555e786df0459" + ], + "rule_id": "variableScope", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-905555e786df0459", + "path": "src/video/api_detection.c", + "line": null, + "fingerprint": "cppcheck-bucket:variableScope:src/video/api_detection.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.314", + "title": "variableScope in hls_directory.c", + "depends_on": [ + "T7", + "T13" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/video/hls/hls_directory.c", + "tests/unit/test_t7_314.c", + "tests/unit/cmake/eng/t7_314.cmake", + "quality/evidence/T7.314.md" + ], + "source_paths": [ + "src/video/hls/hls_directory.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.314 --regex '^test_t7_314$'" + ], + "evidence": "quality/evidence/T7.314.md", + "finding_ids": [ + "CPPCHECK-BUCKET-5d0aacd6263110c5" + ], + "rule_id": "variableScope", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-5d0aacd6263110c5", + "path": "src/video/hls/hls_directory.c", + "line": null, + "fingerprint": "cppcheck-bucket:variableScope:src/video/hls/hls_directory.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.315", + "title": "variableScope in recording_transcode.c", + "depends_on": [ + "T7", + "T13", + "T7.66" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/video/recording_transcode.c", + "tests/unit/test_t7_315.c", + "tests/unit/cmake/eng/t7_315.cmake", + "quality/evidence/T7.315.md" + ], + "source_paths": [ + "src/video/recording_transcode.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.315 --regex '^test_t7_315$'" + ], + "evidence": "quality/evidence/T7.315.md", + "finding_ids": [ + "CPPCHECK-BUCKET-ec17ee32f6d27cdb" + ], + "rule_id": "variableScope", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-ec17ee32f6d27cdb", + "path": "src/video/recording_transcode.c", + "line": null, + "fingerprint": "cppcheck-bucket:variableScope:src/video/recording_transcode.c", + "original_count": 2, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.316", + "title": "variableScope in unified_detection_thread.c", + "depends_on": [ + "T7", + "T13", + "T7.235" + ], + "kind": "native-fix", + "priority": "info", + "status": "Not Completed", + "ownership": [ + "src/video/unified_detection_thread.c", + "tests/unit/test_t7_316.c", + "tests/unit/cmake/eng/t7_316.cmake", + "quality/evidence/T7.316.md" + ], + "source_paths": [ + "src/video/unified_detection_thread.c" + ], + "description": "Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression.", + "acceptance_criteria": [ + "Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness.", + "Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed.", + "Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33." + ], + "validation": [ + "python3 scripts/quality/run-native.py --task T7.316 --regex '^test_t7_316$'" + ], + "evidence": "quality/evidence/T7.316.md", + "finding_ids": [ + "CPPCHECK-BUCKET-d4393cc822a0c2d3" + ], + "rule_id": "variableScope", + "reproducers": [ + { + "id": "CPPCHECK-BUCKET-d4393cc822a0c2d3", + "path": "src/video/unified_detection_thread.c", + "line": null, + "fingerprint": "cppcheck-bucket:variableScope:src/video/unified_detection_thread.c", + "original_count": 1, + "scanner": "cppcheck" + } + ], + "lease": "exclusive native runner/build lease" + }, + { + "id": "T7.317", + "title": "Authenticate before exposing stream existence", + "depends_on": [ + "T7", + "T11", + "T13", + "T7.64", + "T7.50" + ], + "kind": "pilot-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_streams_get.c", + "src/web/api_handlers_streams_modify.c", + "tests/integration/specs/t7_317.api.spec.ts", + "quality/evidence/T7.317.md" + ], + "source_paths": [ + "src/web/api_handlers_streams_get.c", + "src/web/api_handlers_streams_modify.c" + ], + "description": "Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect.", + "acceptance_criteria": [ + "Unauthenticated known and unknown names both return the authentication failure; authenticated unauthorized users retain intentional policy response without leaking privileged data.", + "Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage." + ], + "validation": [ + "node scripts/quality/run-integration.mjs --task T7.317 --project api --grep @t7_317", + "npm run typecheck:tests" + ], + "evidence": "quality/evidence/T7.317.md", + "finding_ids": [ + "F-T11-01" + ], + "lease": "exclusive real-server runner lease" + }, + { + "id": "T7.318", + "title": "Correct documented Streams wire examples", + "depends_on": [ + "T7", + "T11", + "T7.319", + "T7.320", + "T7.321", + "T7.322", + "T7.323", + "T7.324", + "T7.325", + "T7.326", + "T7.327", + "T7.328", + "T7.329", + "T7.330", + "T7.331", + "T7.332", + "T7.333" + ], + "kind": "documentation", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "docs/API.md", + "quality/evidence/T7.318.md" + ], + "source_paths": [ + "docs/API.md" + ], + "description": "Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Update documentation only after the wire behavior is reconciled.", + "acceptance_criteria": [ + "Examples use the real array/page envelopes, integer percentage threshold and emitted names/statuses; every example maps to the revised contract.", + "Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage." + ], + "validation": [ + "python3 scripts/check_docs_links.py" + ], + "evidence": "quality/evidence/T7.318.md", + "finding_ids": [ + "F-T11-02" + ], + "lease": null + }, + { + "id": "T7.319", + "title": "Remove query credentials from viewer URLs", + "depends_on": [ + "T7", + "T11", + "T13", + "T7.317" + ], + "kind": "pilot-fix", + "priority": "high", + "status": "Not Completed", + "ownership": [ + "src/core/url_utils.c", + "src/web/api_handlers_streams_get.c", + "tests/integration/specs/t7_319.api.spec.ts", + "quality/evidence/T7.319.md" + ], + "source_paths": [ + "src/core/url_utils.c", + "src/web/api_handlers_streams_get.c" + ], + "description": "Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect.", + "acceptance_criteria": [ + "Viewer responses contain neither userinfo nor sensitive query credentials, including encoded/mixed-case keys; configurers retain required edit data and benign query options remain usable.", + "Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage." + ], + "validation": [ + "node scripts/quality/run-integration.mjs --task T7.319 --project api --grep @t7_319", + "npm run typecheck:tests" + ], + "evidence": "quality/evidence/T7.319.md", + "finding_ids": [ + "F-T11-03" + ], + "lease": "exclusive real-server runner lease" + }, + { + "id": "T7.320", + "title": "Reject non-object stream updates", + "depends_on": [ + "T7", + "T11", + "T13", + "T7.317" + ], + "kind": "pilot-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_streams_modify.c", + "tests/integration/specs/t7_320.api.spec.ts", + "quality/evidence/T7.320.md" + ], + "source_paths": [ + "src/web/api_handlers_streams_modify.c" + ], + "description": "Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect.", + "acceptance_criteria": [ + "null, arrays and primitives return 400 with no mutation, ONVIF request or reload; an empty object has explicit unchanged semantics.", + "Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage." + ], + "validation": [ + "node scripts/quality/run-integration.mjs --task T7.320 --project api --grep @t7_320", + "npm run typecheck:tests" + ], + "evidence": "quality/evidence/T7.320.md", + "finding_ids": [ + "F-T11-04" + ], + "lease": "exclusive real-server runner lease" + }, + { + "id": "T7.321", + "title": "Reject wrong-typed stream fields", + "depends_on": [ + "T7", + "T11", + "T13", + "T7.320" + ], + "kind": "pilot-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_streams_modify.c", + "tests/integration/specs/t7_321.api.spec.ts", + "quality/evidence/T7.321.md" + ], + "source_paths": [ + "src/web/api_handlers_streams_modify.c" + ], + "description": "Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect.", + "acceptance_criteria": [ + "Wrong types return 400 with state unchanged; supported nullable clears retain their documented semantics and validation precedes all side effects.", + "Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage." + ], + "validation": [ + "node scripts/quality/run-integration.mjs --task T7.321 --project api --grep @t7_321", + "npm run typecheck:tests" + ], + "evidence": "quality/evidence/T7.321.md", + "finding_ids": [ + "F-T11-05" + ], + "lease": "exclusive real-server runner lease" + }, + { + "id": "T7.322", + "title": "Validate bounded stream numeric fields", + "depends_on": [ + "T7", + "T11", + "T13", + "T7.321" + ], + "kind": "pilot-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_streams_modify.c", + "tests/integration/specs/t7_322.api.spec.ts", + "quality/evidence/T7.322.md" + ], + "source_paths": [ + "src/web/api_handlers_streams_modify.c" + ], + "description": "Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect.", + "acceptance_criteria": [ + "Protocol enum, priorities, interval, buffer, storage, PTZ and port limits reject out-of-range and fractional values before mutation; boundaries agree with storage and runtime callers.", + "Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage." + ], + "validation": [ + "node scripts/quality/run-integration.mjs --task T7.322 --project api --grep @t7_322", + "npm run typecheck:tests" + ], + "evidence": "quality/evidence/T7.322.md", + "finding_ids": [ + "F-T11-06" + ], + "lease": "exclusive real-server runner lease" + }, + { + "id": "T7.323", + "title": "Validate complete boolean schedules", + "depends_on": [ + "T7", + "T11", + "T13", + "T7.322" + ], + "kind": "pilot-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_streams_modify.c", + "tests/integration/specs/t7_323.api.spec.ts", + "quality/evidence/T7.323.md" + ], + "source_paths": [ + "src/web/api_handlers_streams_modify.c" + ], + "description": "Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect.", + "acceptance_criteria": [ + "Only exactly 168 booleans are accepted; short/long/non-array or wrong element types fail atomically and valid week schedules round-trip unchanged.", + "Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage." + ], + "validation": [ + "node scripts/quality/run-integration.mjs --task T7.323 --project api --grep @t7_323", + "npm run typecheck:tests" + ], + "evidence": "quality/evidence/T7.323.md", + "finding_ids": [ + "F-T11-07" + ], + "lease": "exclusive real-server runner lease" + }, + { + "id": "T7.324", + "title": "Address encoded slash names without aliasing", + "depends_on": [ + "T7", + "T11", + "T13", + "T7.319" + ], + "kind": "pilot-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_streams_get.c", + "tests/integration/specs/t7_324.api.spec.ts", + "quality/evidence/T7.324.md" + ], + "source_paths": [ + "src/web/api_handlers_streams_get.c" + ], + "description": "Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect.", + "acceptance_criteria": [ + "An encoded slash may either address the complete supported legacy name or be explicitly rejected; it must never select/authorize a different truncated camera.", + "Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage." + ], + "validation": [ + "node scripts/quality/run-integration.mjs --task T7.324 --project api --grep @t7_324", + "npm run typecheck:tests" + ], + "evidence": "quality/evidence/T7.324.md", + "finding_ids": [ + "F-T11-08" + ], + "lease": "exclusive real-server runner lease" + }, + { + "id": "T7.325", + "title": "Enforce decoded stream name limits consistently", + "depends_on": [ + "T7", + "T11", + "T13", + "T7.324" + ], + "kind": "pilot-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/web/request_response.c", + "src/web/api_handlers_streams_get.c", + "tests/integration/specs/t7_325.api.spec.ts", + "quality/evidence/T7.325.md" + ], + "source_paths": [ + "src/web/request_response.c", + "src/web/api_handlers_streams_get.c" + ], + "description": "Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect.", + "acceptance_criteria": [ + "UTF-8 names at the stored byte limit are consistently addressable by PUT/full/zones; encoded suffix length does not truncate/alias a name. Malformed escapes/NUL/dot segments remain rejected. Current encoded suffix includes /full or /zones.", + "Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage." + ], + "validation": [ + "node scripts/quality/run-integration.mjs --task T7.325 --project api --grep @t7_325", + "npm run typecheck:tests" + ], + "evidence": "quality/evidence/T7.325.md", + "finding_ids": [ + "F-T11-09" + ], + "lease": "exclusive real-server runner lease" + }, + { + "id": "T7.326", + "title": "Handle missing fleet inventory rows consistently", + "depends_on": [ + "T7", + "T11", + "T13", + "T7.325" + ], + "kind": "pilot-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_streams_get.c", + "tests/integration/specs/t7_326.api.spec.ts", + "quality/evidence/T7.326.md" + ], + "source_paths": [ + "src/web/api_handlers_streams_get.c" + ], + "description": "Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect.", + "acceptance_criteria": [ + "A missing authorization inventory row cannot expose a camera; document fail-closed behavior and isolate an inconsistent row only if policy permits, while preserving authorized list results and surfacing the inconsistency.", + "Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage." + ], + "validation": [ + "node scripts/quality/run-integration.mjs --task T7.326 --project api --grep @t7_326", + "npm run typecheck:tests" + ], + "evidence": "quality/evidence/T7.326.md", + "finding_ids": [ + "F-T11-10" + ], + "lease": "exclusive real-server runner lease" + }, + { + "id": "T7.327", + "title": "Preserve omitted ONVIF update state", + "depends_on": [ + "T7", + "T11", + "T13", + "T7.323" + ], + "kind": "pilot-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_streams_modify.c", + "tests/integration/specs/t7_327.api.spec.ts", + "quality/evidence/T7.327.md" + ], + "source_paths": [ + "src/web/api_handlers_streams_modify.c" + ], + "description": "Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect.", + "acceptance_criteria": [ + "A tags-only or empty update preserves isOnvif and credentials without an ONVIF network call; explicit ONVIF changes retain their intended behavior.", + "Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage." + ], + "validation": [ + "node scripts/quality/run-integration.mjs --task T7.327 --project api --grep @t7_327", + "npm run typecheck:tests" + ], + "evidence": "quality/evidence/T7.327.md", + "finding_ids": [ + "F-T11-11" + ], + "lease": "exclusive real-server runner lease" + }, + { + "id": "T7.328", + "title": "Make privacy mutations atomic and report failure", + "depends_on": [ + "T7", + "T11", + "T13", + "T7.327" + ], + "kind": "pilot-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_streams_modify.c", + "tests/integration/specs/t7_328.api.spec.ts", + "quality/evidence/T7.328.md" + ], + "source_paths": [ + "src/web/api_handlers_streams_modify.c" + ], + "description": "Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect.", + "acceptance_criteria": [ + "Privacy-only success follows a successful database write; database failure returns failure. Mixed privacy/edit requests are rejected before enable/reload/network side effects or handled through a separately specified atomic contract.", + "Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage." + ], + "validation": [ + "node scripts/quality/run-integration.mjs --task T7.328 --project api --grep @t7_328", + "npm run typecheck:tests" + ], + "evidence": "quality/evidence/T7.328.md", + "finding_ids": [ + "F-T11-12" + ], + "lease": "exclusive real-server runner lease" + }, + { + "id": "T7.329", + "title": "Expose demo mode for authenticated users", + "depends_on": [ + "T7", + "T11", + "T13" + ], + "kind": "pilot-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_auth_backend_agnostic.c", + "tests/integration/specs/t7_329.api.spec.ts", + "quality/evidence/T7.329.md" + ], + "source_paths": [ + "src/web/api_handlers_auth_backend_agnostic.c" + ], + "description": "Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect.", + "acceptance_criteria": [ + "Authenticated demo responses carry authoritative demo state while roles remain accurate, server-side redaction remains enforced and normal authenticated responses remain compatible.", + "Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage." + ], + "validation": [ + "node scripts/quality/run-integration.mjs --task T7.329 --project api --grep @t7_329", + "npm run typecheck:tests" + ], + "evidence": "quality/evidence/T7.329.md", + "finding_ids": [ + "F-T11-13" + ], + "lease": "exclusive real-server runner lease" + }, + { + "id": "T7.330", + "title": "Reject overlong stream strings without truncation", + "depends_on": [ + "T7", + "T11", + "T13", + "T7.328" + ], + "kind": "pilot-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_streams_modify.c", + "tests/integration/specs/t7_330.api.spec.ts", + "quality/evidence/T7.330.md" + ], + "source_paths": [ + "src/web/api_handlers_streams_modify.c" + ], + "description": "Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect.", + "acceptance_criteria": [ + "Each field checks UTF-8 byte length against the destination buffer before mutation; maximum valid values round-trip and one-byte overflow is rejected atomically, including detection_model temporary-buffer limits.", + "Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage." + ], + "validation": [ + "node scripts/quality/run-integration.mjs --task T7.330 --project api --grep @t7_330", + "npm run typecheck:tests" + ], + "evidence": "quality/evidence/T7.330.md", + "finding_ids": [ + "F-T11-14" + ], + "lease": "exclusive real-server runner lease" + }, + { + "id": "T7.331", + "title": "Bound ONVIF edit validation latency", + "depends_on": [ + "T7", + "T11", + "T13", + "T7.330" + ], + "kind": "pilot-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_streams_modify.c", + "tests/integration/specs/t7_331.api.spec.ts", + "quality/evidence/T7.331.md" + ], + "source_paths": [ + "src/web/api_handlers_streams_modify.c" + ], + "description": "Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect.", + "acceptance_criteria": [ + "An unresponsive synthetic ONVIF endpoint cannot monopolize a worker indefinitely; preserve accepted/persisted semantics and avoid blind retries of possibly successful mutations. Record the deadline before the test, below the client timeout or explicitly reconcile client behavior.", + "Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage." + ], + "validation": [ + "node scripts/quality/run-integration.mjs --task T7.331 --project api --grep @t7_331", + "npm run typecheck:tests" + ], + "evidence": "quality/evidence/T7.331.md", + "finding_ids": [ + "F-T11-15" + ], + "lease": "exclusive real-server runner lease" + }, + { + "id": "T7.332", + "title": "Preserve detection threshold round trips", + "depends_on": [ + "T7", + "T11", + "T13", + "T7.326", + "T7.331" + ], + "kind": "pilot-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_streams_get.c", + "src/web/api_handlers_streams_modify.c", + "tests/integration/specs/t7_332.api.spec.ts", + "quality/evidence/T7.332.md" + ], + "source_paths": [ + "src/web/api_handlers_streams_get.c", + "src/web/api_handlers_streams_modify.c" + ], + "description": "Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect.", + "acceptance_criteria": [ + "All integer percentages 0..100 survive PUT\u2192GET round trips; specifically 53 and 59 must not become 52 and 58. Preserve representation for existing stored floats with a documented rounding policy.", + "Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage." + ], + "validation": [ + "node scripts/quality/run-integration.mjs --task T7.332 --project api --grep @t7_332", + "npm run typecheck:tests" + ], + "evidence": "quality/evidence/T7.332.md", + "finding_ids": [ + "F-T11-16" + ], + "lease": "exclusive real-server runner lease" + }, + { + "id": "T7.333", + "title": "Specify password omission and explicit clear semantics", + "depends_on": [ + "T7", + "T11", + "T13", + "T7.332" + ], + "kind": "pilot-fix", + "priority": "medium", + "status": "Not Completed", + "ownership": [ + "src/web/api_handlers_streams_modify.c", + "tests/integration/specs/t7_333.api.spec.ts", + "quality/evidence/T7.333.md" + ], + "source_paths": [ + "src/web/api_handlers_streams_modify.c" + ], + "description": "Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect.", + "acceptance_criteria": [ + "Omitted onvif_password leaves the secret unchanged; explicit empty clears only as an intentional authorized action. Client form construction never echoes a redacted empty value as a destructive update.", + "Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage." + ], + "validation": [ + "node scripts/quality/run-integration.mjs --task T7.333 --project api --grep @t7_333", + "npm run typecheck:tests" + ], + "evidence": "quality/evidence/T7.333.md", + "finding_ids": [ + "F-T11-17" + ], + "lease": "exclusive real-server runner lease" + }, + { + "id": "T7.334", + "title": "Reconcile Streams contracts after behavioral fixes", + "depends_on": [ + "T7", + "T12", + "T7.317", + "T7.318", + "T7.319", + "T7.320", + "T7.321", + "T7.322", + "T7.323", + "T7.324", + "T7.325", + "T7.326", + "T7.327", + "T7.328", + "T7.329", + "T7.330", + "T7.331", + "T7.332", + "T7.333" + ], + "kind": "integration", + "priority": "high", + "status": "Not Completed", + "ownership": [ + "docs/api/contracts/streams.yaml", + "docs/api/contracts/common.yaml", + "docs/api/openapi.yaml", + "tests/contracts/fixtures/streams/auth-verify.auth-disabled.valid.json", + "tests/contracts/fixtures/streams/auth-verify.demo-as-admin.invalid.json", + "tests/contracts/fixtures/streams/auth-verify.demo.valid.json", + "tests/contracts/fixtures/streams/auth-verify.user.valid.json", + "tests/contracts/fixtures/streams/client-config.camelcase-only.invalid.json", + "tests/contracts/fixtures/streams/client-config.valid.json", + "tests/contracts/fixtures/streams/detection-models.403-viewer.valid.json", + "tests/contracts/fixtures/streams/detection-models.no-directory.valid.json", + "tests/contracts/fixtures/streams/detection-models.unsupported-without-reason.invalid.json", + "tests/contracts/fixtures/streams/detection-models.valid.json", + "tests/contracts/fixtures/streams/error.400-retention.valid.json", + "tests/contracts/fixtures/streams/error.400-surface.valid.json", + "tests/contracts/fixtures/streams/error.401.valid.json", + "tests/contracts/fixtures/streams/error.403-put-viewer.valid.json", + "tests/contracts/fixtures/streams/error.404-camera.valid.json", + "tests/contracts/fixtures/streams/error.404-stream.valid.json", + "tests/contracts/fixtures/streams/error.413-publish-url.valid.json", + "tests/contracts/fixtures/streams/error.empty-message.invalid.json", + "tests/contracts/fixtures/streams/error.message-key.invalid.json", + "tests/contracts/fixtures/streams/full.any.generic-schema.valid.json", + "tests/contracts/fixtures/streams/full.configurer.legacy-name-plain-credentials.valid.json", + "tests/contracts/fixtures/streams/full.configurer.missing-onvif-password.invalid.json", + "tests/contracts/fixtures/streams/full.configurer.onvif-url-userinfo.invalid.json", + "tests/contracts/fixtures/streams/full.configurer.onvif.valid.json", + "tests/contracts/fixtures/streams/full.error-message-without-error.invalid.json", + "tests/contracts/fixtures/streams/full.live-only.claims-configure.invalid.json", + "tests/contracts/fixtures/streams/full.live-only.error-status.valid.json", + "tests/contracts/fixtures/streams/full.live-only.leaked-admin-url.invalid.json", + "tests/contracts/fixtures/streams/full.live-only.leaked-detection-url.invalid.json", + "tests/contracts/fixtures/streams/full.live-only.leaked-go2rtc-override.invalid.json", + "tests/contracts/fixtures/streams/full.live-only.leaked-onvif-password.invalid.json", + "tests/contracts/fixtures/streams/full.live-only.leaked-onvif-username.invalid.json", + "tests/contracts/fixtures/streams/full.live-only.leaked-publish-url.invalid.json", + "tests/contracts/fixtures/streams/full.live-only.leaked-sub-stream-url.invalid.json", + "tests/contracts/fixtures/streams/full.live-only.redacted.valid.json", + "tests/contracts/fixtures/streams/full.live-only.sensitive-keys-absent.valid.json", + "tests/contracts/fixtures/streams/full.live-only.url-query-secret.invalid.json", + "tests/contracts/fixtures/streams/full.live-only.url-userinfo.invalid.json", + "tests/contracts/fixtures/streams/full.live-only.url-username-only.invalid.json", + "tests/contracts/fixtures/streams/full.null-tags.invalid.json", + "tests/contracts/fixtures/streams/full.protocol-out-of-enum.invalid.json", + "tests/contracts/fixtures/streams/full.retention-below-inherit.invalid.json", + "tests/contracts/fixtures/streams/full.retention-over-max.invalid.json", + "tests/contracts/fixtures/streams/full.schedule-167-entries.invalid.json", + "tests/contracts/fixtures/streams/full.status-docs-value.invalid.json", + "tests/contracts/fixtures/streams/full.threshold-as-fraction.invalid.json", + "tests/contracts/fixtures/streams/full.unwrapped-object.invalid.json", + "tests/contracts/fixtures/streams/index.json", + "tests/contracts/fixtures/streams/path-encoding.cases.json", + "tests/contracts/fixtures/streams/put-response.200-privacy.valid.json", + "tests/contracts/fixtures/streams/put-response.202-onvif-failed.valid.json", + "tests/contracts/fixtures/streams/put-response.202-onvif-status-without-message.invalid.json", + "tests/contracts/fixtures/streams/put-response.202.valid.json", + "tests/contracts/fixtures/streams/put.clear-with-null.valid.json", + "tests/contracts/fixtures/streams/put.detection-retention-minus-2.invalid.json", + "tests/contracts/fixtures/streams/put.detection-url-file-scheme.invalid.json", + "tests/contracts/fixtures/streams/put.detection-url-too-long.invalid.json", + "tests/contracts/fixtures/streams/put.edit-form.valid.json", + "tests/contracts/fixtures/streams/put.empty-object.valid.json", + "tests/contracts/fixtures/streams/put.eptz-not-string.invalid.json", + "tests/contracts/fixtures/streams/put.eptz-wrong-projection.invalid.json", + "tests/contracts/fixtures/streams/put.is-deleted.invalid.json", + "tests/contracts/fixtures/streams/put.name-in-body.invalid.json", + "tests/contracts/fixtures/streams/put.playback-transport-bogus.invalid.json", + "tests/contracts/fixtures/streams/put.privacy-mixed-with-edit.invalid.json", + "tests/contracts/fixtures/streams/put.protocol-out-of-enum.invalid.json", + "tests/contracts/fixtures/streams/put.publish-and-detection-url.valid.json", + "tests/contracts/fixtures/streams/put.publish-url-http.invalid.json", + "tests/contracts/fixtures/streams/put.publish-url-quote.invalid.json", + "tests/contracts/fixtures/streams/put.record-as-string.invalid.json", + "tests/contracts/fixtures/streams/put.retention-366.invalid.json", + "tests/contracts/fixtures/streams/put.retention-finite-boundary.valid.json", + "tests/contracts/fixtures/streams/put.retention-tristate.valid.json", + "tests/contracts/fixtures/streams/put.schedule-weekday.valid.json", + "tests/contracts/fixtures/streams/put.schedule-wrong-length.invalid.json", + "tests/contracts/fixtures/streams/put.set-privacy-mode.valid.json", + "tests/contracts/fixtures/streams/put.tags-too-long.invalid.json", + "tests/contracts/fixtures/streams/summary.admin.admin-url-without-configure.invalid.json", + "tests/contracts/fixtures/streams/summary.admin.configurer-with-admin-url.valid.json", + "tests/contracts/fixtures/streams/summary.admin.contains-url.invalid.json", + "tests/contracts/fixtures/streams/summary.admin.empty.valid.json", + "tests/contracts/fixtures/streams/summary.admin.missing-can-configure.invalid.json", + "tests/contracts/fixtures/streams/summary.admin.page-beyond-end.valid.json", + "tests/contracts/fixtures/streams/summary.admin.page-size-over-max.invalid.json", + "tests/contracts/fixtures/streams/summary.admin.status-from-detail-enum.invalid.json", + "tests/contracts/fixtures/streams/summary.admin.viewer.valid.json", + "tests/contracts/fixtures/streams/summary.live.contains-admin-url.invalid.json", + "tests/contracts/fixtures/streams/summary.live.contains-onvif-password.invalid.json", + "tests/contracts/fixtures/streams/summary.live.viewer.valid.json", + "tests/contracts/fixtures/streams/summary.lpr.leaks-location.invalid.json", + "tests/contracts/fixtures/streams/summary.lpr.valid.json", + "tests/contracts/fixtures/streams/zones.empty.valid.json", + "tests/contracts/fixtures/streams/zones.valid.json", + "web/js/api/generated/", + "tests/contracts/generated/", + "quality/evidence/T7.334.md" + ], + "source_paths": [], + "description": "Under the exclusive generation lease, reconcile the exact schemas and affected fixture files after the preceding fixes. The exact fixture list is recorded in ownership; generated directories are exclusively owned outputs of T12. Regenerate only through T12 tooling; no concurrent generation. Preserve separate desired-client and current-wire cases where intentionally different.", + "acceptance_criteria": [ + "All valid and invalid fixtures retain explicit reasons and agree with the corrected real backend.", + "Generate deterministic artifacts and run real pilot regressions; T18/T19 cannot use stale contracts." + ], + "validation": [ + "node scripts/quality/contracts.mjs --generate", + "node scripts/quality/contracts.mjs --check", + "node --test tests/quality/contracts.test.mjs", + "npm --prefix web run typecheck" + ], + "evidence": "quality/evidence/T7.334.md", + "finding_ids": [], + "lease": "exclusive schema/generation/build lease" + }, + { + "id": "T7.335", + "title": "Resolve proposed ownership and exception review records", + "depends_on": [ + "T7", + "T7.1" + ], + "kind": "approval-review", + "priority": "high", + "status": "Not Completed", + "ownership": [ + "quality/reviews/exception-ownership.json", + "quality/evidence/T7.335.md" + ], + "source_paths": [], + "description": "Collect accountable owners and explicit approvals/denials for T1/T6 proposals and any new residual exceptions. Existing maintainers/ strings and proposed dates are not acceptance. Prepare a concrete review record; leave pending entries unresolved until actual authorized reviewer input arrives.", + "acceptance_criteria": [ + "Every unresolved proposal names its exact finding/gap, requested owner, exposure, rationale, proposed expiry and approval state.", + "No approval, repository protection change, CODEOWNERS assignment or publication is inferred from implementation authorization." + ], + "validation": [ + "python3 -m json.tool quality/reviews/exception-ownership.json" + ], + "evidence": "quality/evidence/T7.335.md", + "finding_ids": [], + "requires_external_evidence": true + } + ], + "finding_map": [ + { + "finding_id": "ADVISORY-GHSA-cv53-mq7p-6jp2", + "task_id": "T7.2", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ADVISORY-repo-advisory-draft-1", + "task_id": "T7.3", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ADVISORY-repo-advisory-closed-1", + "task_id": "T7.4", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ADVISORY-repo-advisory-draft-2", + "task_id": "T7.5", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ADVISORY-GHSA-rqj3-pch5-rq4f", + "task_id": "T7.6", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ADVISORY-GHSA-pvw7-7j8c-qx96", + "task_id": "T7.7", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "NPM-WEB-GHSA-3g3m-2fjr-6pw4-glob", + "task_id": "T7.8", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "NPM-WEB-GHSA-g3hv-75wg-m249-minimatch", + "task_id": "T7.9", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "DEPENDABOT-101", + "task_id": "T7.10", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "NPM-WEB-GHSA-gcqx-w48m-w2h4-deepmerge", + "task_id": "T7.10", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-316", + "task_id": "T7.11", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-307", + "task_id": "T7.11", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-185", + "task_id": "T7.12", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-183", + "task_id": "T7.12", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-181", + "task_id": "T7.12", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-267", + "task_id": "T7.13", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-64", + "task_id": "T7.13", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-63", + "task_id": "T7.13", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-264", + "task_id": "T7.14", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-14", + "task_id": "T7.15", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-329", + "task_id": "T7.16", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-78", + "task_id": "T7.17", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-77", + "task_id": "T7.17", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-76", + "task_id": "T7.17", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-75", + "task_id": "T7.17", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-71", + "task_id": "T7.17", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-70", + "task_id": "T7.17", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-69", + "task_id": "T7.17", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-20", + "task_id": "T7.17", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-19", + "task_id": "T7.17", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-337", + "task_id": "T7.18", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-336", + "task_id": "T7.18", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-335", + "task_id": "T7.18", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-334", + "task_id": "T7.18", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-272", + "task_id": "T7.18", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-271", + "task_id": "T7.18", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-270", + "task_id": "T7.18", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-59", + "task_id": "T7.19", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-73", + "task_id": "T7.20", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-325", + "task_id": "T7.21", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-320", + "task_id": "T7.22", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-319", + "task_id": "T7.22", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-318", + "task_id": "T7.22", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-317", + "task_id": "T7.22", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-67", + "task_id": "T7.23", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-66", + "task_id": "T7.23", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-330", + "task_id": "T7.24", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-321", + "task_id": "T7.25", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-310", + "task_id": "T7.26", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-315", + "task_id": "T7.27", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-314", + "task_id": "T7.27", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-313", + "task_id": "T7.27", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-306", + "task_id": "T7.28", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-305", + "task_id": "T7.28", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQL-293", + "task_id": "T7.29", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-0dfdce44e3f2c522", + "task_id": "T7.30", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-9b21a14b97b3a15e", + "task_id": "T7.31", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-b7cb62f9287bca53", + "task_id": "T7.32", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-a918c6008bfe9234", + "task_id": "T7.33", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-a5ab5fe6add78d8e", + "task_id": "T7.34", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-cb260984bd5750f8", + "task_id": "T7.35", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-f240093f03b567fb", + "task_id": "T7.36", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-f8203edcc8863cd8", + "task_id": "T7.37", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-179513c629f1ecac", + "task_id": "T7.38", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-33d1c32daba1778e", + "task_id": "T7.39", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-14fc6cb721e4ff46", + "task_id": "T7.40", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-848024a1059f9105", + "task_id": "T7.41", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-c18dbfa67bfd519e", + "task_id": "T7.41", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-3853c804fd823d76", + "task_id": "T7.42", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-e903e0b58c1ab7fb", + "task_id": "T7.42", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-7037bcf50d8dd6e1", + "task_id": "T7.42", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-468c829b1cc867f5", + "task_id": "T7.42", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-5546a3c4710ffc07", + "task_id": "T7.42", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-9c42b9e1d1f45117", + "task_id": "T7.42", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-b45db718e3e94b0d", + "task_id": "T7.42", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-dc1d8989b6dc0f0a", + "task_id": "T7.43", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-18224b07c8f96008", + "task_id": "T7.44", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-36ab8111fbec813b", + "task_id": "T7.45", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-21f4fa94b0f2d17d", + "task_id": "T7.45", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-e722e2369c13444f", + "task_id": "T7.46", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-67d853afc9b7eefe", + "task_id": "T7.47", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-44c26e7cc4f14d25", + "task_id": "T7.48", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-7f68b57abf95cdae", + "task_id": "T7.48", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-2b9b559954a51bc7", + "task_id": "T7.49", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-3ac69a72123df761", + "task_id": "T7.50", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-2eb8f8220e64672b", + "task_id": "T7.51", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-8935718b76906f1e", + "task_id": "T7.51", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-db6d4840afaa43ce", + "task_id": "T7.51", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-6253a319b7ed3b31", + "task_id": "T7.51", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-d86514e7015dbd70", + "task_id": "T7.52", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-c4536c7eb269c97d", + "task_id": "T7.53", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-dc57edf3e0b50ae4", + "task_id": "T7.53", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-ff30996a0be1b3ef", + "task_id": "T7.54", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-470e897ffa76864e", + "task_id": "T7.55", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-2772ec37ee463512", + "task_id": "T7.56", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-9259d0adb44e3ab3", + "task_id": "T7.57", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-55f597a830e65b4d", + "task_id": "T7.57", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-eaf20c1f0de62870", + "task_id": "T7.57", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-c05a923060c50809", + "task_id": "T7.57", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-30cd36651cb697e6", + "task_id": "T7.57", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-29fe00c504db3f7e", + "task_id": "T7.58", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-93f7df7451e39223", + "task_id": "T7.58", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-192595ad5f7437f2", + "task_id": "T7.59", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-6eb7be7d5d4be88a", + "task_id": "T7.60", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-e88c078f85b44a5e", + "task_id": "T7.61", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-87fe5c4f9b2c4103", + "task_id": "T7.62", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-b6500f12e4ee30b7", + "task_id": "T7.63", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-a01b119b5b6a4463", + "task_id": "T7.63", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-d562d8dbfbb1dcc3", + "task_id": "T7.64", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-24b2873ab4fb113e", + "task_id": "T7.64", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-4f6abbd42f9a1855", + "task_id": "T7.65", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-c7df8f3cce68c5a4", + "task_id": "T7.65", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-d6eef8565b934dd8", + "task_id": "T7.66", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-4976fee144691228", + "task_id": "T7.66", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-4c710ebaa0f3ef18", + "task_id": "T7.67", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-e7f2b500346b1db4", + "task_id": "T7.67", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-59d7e244d1294daa", + "task_id": "T7.67", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-de5c9750f9e973f2", + "task_id": "T7.67", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-8a0289975bb00ddb", + "task_id": "T7.68", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-1728287dd1cfa5a4", + "task_id": "T7.69", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-f15ef4cfb6675401", + "task_id": "T7.70", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-d8903761e409b32d", + "task_id": "T7.70", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-f70e12d3b12447f9", + "task_id": "T7.71", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-81dd4bf2eb1bd4a8", + "task_id": "T7.71", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-b38fd5e59ea07d0e", + "task_id": "T7.72", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-ebeb3bd843bc6421", + "task_id": "T7.72", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-a8a2fee09e04d7a2", + "task_id": "T7.73", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-582ed0e8d5a10fc1", + "task_id": "T7.74", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-d14ab8cc9d321477", + "task_id": "T7.75", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-7bc58272fe78e01c", + "task_id": "T7.75", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-d1406d76ca075628", + "task_id": "T7.75", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-187d49bac01afe0b", + "task_id": "T7.75", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-01d35c4f8b07a420", + "task_id": "T7.75", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-7ed0f3ac85abfc0f", + "task_id": "T7.75", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-afd0bb6171ab9102", + "task_id": "T7.75", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-6c275f8832cf9762", + "task_id": "T7.75", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-340c5f9dec875049", + "task_id": "T7.75", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-94d7d3c523b01523", + "task_id": "T7.75", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-65f97e38c1e1c5df", + "task_id": "T7.75", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-377feb103d4c3b66", + "task_id": "T7.75", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-1c7b293c20ba8b3d", + "task_id": "T7.76", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-1afeb1315d85ff61", + "task_id": "T7.77", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-1d3bfb4e5fc184fe", + "task_id": "T7.78", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-808f26556ac98110", + "task_id": "T7.79", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-7e1ce15fe947a21d", + "task_id": "T7.79", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-c34509f97f5eb3bf", + "task_id": "T7.80", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-6ac00b1420332d40", + "task_id": "T7.80", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-1848d1ca57216f44", + "task_id": "T7.80", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-be52eb80a1a9b4e2", + "task_id": "T7.80", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-02365646d53a2c50", + "task_id": "T7.81", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-a219d74f760de10e", + "task_id": "T7.81", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-96f8eef93ec11127", + "task_id": "T7.81", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-221d97bd8b8ca157", + "task_id": "T7.81", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-b6b7c0de32a0c6b7", + "task_id": "T7.81", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-4edbb01e2c9075ed", + "task_id": "T7.81", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-ec9cd5d6ab7a3d6e", + "task_id": "T7.81", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-2f30db61a3888f56", + "task_id": "T7.81", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-82315a3f137f4aff", + "task_id": "T7.82", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-eac1097bd3780c16", + "task_id": "T7.83", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-a03bd79d6040e625", + "task_id": "T7.84", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-f1f70f55c95dfbaf", + "task_id": "T7.85", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-5bdf00371aedee4a", + "task_id": "T7.86", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-ccff9a5b097b862e", + "task_id": "T7.87", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-73322317a31f8bcc", + "task_id": "T7.88", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-dbe8bf00e4b146ee", + "task_id": "T7.88", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-2fcad01867c4b146", + "task_id": "T7.89", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-51ab98673b990b2c", + "task_id": "T7.89", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-a48d8d980b8dbfcc", + "task_id": "T7.89", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-767515747827ef14", + "task_id": "T7.90", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-ced78137a6871fda", + "task_id": "T7.91", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-4ce72e7a43d0bcce", + "task_id": "T7.92", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-50703d3018f9bed5", + "task_id": "T7.93", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-15fa53ad8b574808", + "task_id": "T7.93", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-e5960a2d15356c27", + "task_id": "T7.93", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-1fac122c6010eb36", + "task_id": "T7.93", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-612c846365824225", + "task_id": "T7.94", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-1e0ea76108754cd5", + "task_id": "T7.94", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-ab4dc4b3768799ca", + "task_id": "T7.94", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-14f55668eaa243b0", + "task_id": "T7.94", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-fbf040917d8b6cf7", + "task_id": "T7.94", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-52dada64b4a6e625", + "task_id": "T7.94", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-d1d1cf8dcb7070f8", + "task_id": "T7.94", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-bfb7d2825452ce0c", + "task_id": "T7.94", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-842c6bb171a64e75", + "task_id": "T7.94", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-4a2a60d787933d7d", + "task_id": "T7.94", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-a145bd05b0189193", + "task_id": "T7.94", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-f72760acc6c09e16", + "task_id": "T7.94", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-0866b8e57f533141", + "task_id": "T7.94", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-d08422316656b39c", + "task_id": "T7.94", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-d7c0ab1bf29a42a3", + "task_id": "T7.94", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-8d33cee7806f5d43", + "task_id": "T7.95", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-02b18b5e0f4e3b93", + "task_id": "T7.95", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-b84c577b6e369ac3", + "task_id": "T7.95", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-8b66085f0250d8e1", + "task_id": "T7.95", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-15838d8765a7623e", + "task_id": "T7.95", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-df8a271dac7dc00c", + "task_id": "T7.95", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-802a0570e39a96a6", + "task_id": "T7.96", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-a072eb98578bd9cf", + "task_id": "T7.96", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-576d7acbaee5cef6", + "task_id": "T7.97", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-eadc49a35e808a77", + "task_id": "T7.98", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-bdcbae59a275ce50", + "task_id": "T7.98", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-5582e7df3dd25730", + "task_id": "T7.98", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-23826be3117b0a5e", + "task_id": "T7.98", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-cac166160ef5ab94", + "task_id": "T7.98", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-6eced00c619f459a", + "task_id": "T7.98", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-a35257b195053d18", + "task_id": "T7.98", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-9fbcc527095ebbbb", + "task_id": "T7.98", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-c263543788ddaa36", + "task_id": "T7.98", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-d06458b2bdfca56d", + "task_id": "T7.98", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-1592d34d4e3dc54c", + "task_id": "T7.98", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-957e3e8e5e143726", + "task_id": "T7.98", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-76ebb6a603073b54", + "task_id": "T7.98", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-2c1116134a2ee5a3", + "task_id": "T7.98", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-0ce2e7833fc885fd", + "task_id": "T7.98", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-4e94aa9ff957dec6", + "task_id": "T7.98", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-f6ddc3b14e23e020", + "task_id": "T7.98", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-a19387fbb98806ae", + "task_id": "T7.99", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-18362aef7fade326", + "task_id": "T7.100", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-eade1f2d38582a47", + "task_id": "T7.100", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-8b074e54e83681ff", + "task_id": "T7.100", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-eb4e649dccdb530f", + "task_id": "T7.101", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-6829e02764d9d278", + "task_id": "T7.102", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-113735d7300e4f01", + "task_id": "T7.102", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-25b00beae5a3f4a8", + "task_id": "T7.102", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-2387b22f15e219d3", + "task_id": "T7.102", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-0818b8d62b6628c5", + "task_id": "T7.103", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-53e88d8983baf290", + "task_id": "T7.104", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-dbd6a5de3a7e191c", + "task_id": "T7.104", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-88f84938e1b8feb0", + "task_id": "T7.105", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-101a7d6e0cfda715", + "task_id": "T7.106", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-c586f58fa85c527e", + "task_id": "T7.106", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-18895086ef6f0ed9", + "task_id": "T7.107", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-6e45cad03ed5a9f3", + "task_id": "T7.108", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-5bcac8af8164c1b0", + "task_id": "T7.109", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-e2b358165654b79e", + "task_id": "T7.109", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-9613b39c2e0a1e4c", + "task_id": "T7.110", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-5f6ae30cde3aaf3d", + "task_id": "T7.111", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-bc48f96894493869", + "task_id": "T7.111", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-01e4c541adfa23e3", + "task_id": "T7.111", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-3abdad2ed8a71fe5", + "task_id": "T7.111", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-09829500c354c2b5", + "task_id": "T7.111", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-661c1d9d010f4873", + "task_id": "T7.111", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-f69ef126d8e55b2b", + "task_id": "T7.111", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-6d1385324d08479d", + "task_id": "T7.111", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-ae25a6959341dd10", + "task_id": "T7.112", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-7bff304a77769e6c", + "task_id": "T7.113", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-4505cfde8bb2e42a", + "task_id": "T7.114", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-ff0e443bb0b29339", + "task_id": "T7.114", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-3a7569f24a5603a4", + "task_id": "T7.115", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-54a9eba3b05f0872", + "task_id": "T7.115", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-a221992baafec96f", + "task_id": "T7.115", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-8e1debc0e42f328a", + "task_id": "T7.116", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-1fb6fbd990b73e55", + "task_id": "T7.116", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-52e7ee5b7b20725e", + "task_id": "T7.116", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-a816d3388754e9a3", + "task_id": "T7.116", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-bdf2049affa5a3fd", + "task_id": "T7.116", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-946781b07a8a19f6", + "task_id": "T7.116", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-39f0ad6017069f02", + "task_id": "T7.117", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-c666354bdbc1df4b", + "task_id": "T7.117", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-c8b906651c5b2c7f", + "task_id": "T7.117", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-8a2d068dc3e8b0c0", + "task_id": "T7.117", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-ad7afdbd70ca0a46", + "task_id": "T7.117", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-48d30c8fb35cc9cd", + "task_id": "T7.118", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-1634947d8289644f", + "task_id": "T7.118", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-cb9a5afe872113f7", + "task_id": "T7.118", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-098d117140abdf3a", + "task_id": "T7.118", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-a89af13dd80ae187", + "task_id": "T7.118", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-30c3f7edea8fbd8d", + "task_id": "T7.119", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-d421e791a6b63cc9", + "task_id": "T7.120", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-c536433a0089e4b9", + "task_id": "T7.121", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-4e34d6b524364f03", + "task_id": "T7.121", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-5dc4623d12ccf5b2", + "task_id": "T7.122", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-1f9c86e17ca383f9", + "task_id": "T7.123", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-316e32d23b15b780", + "task_id": "T7.123", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-7464eb7864628fd1", + "task_id": "T7.123", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-5e2b3b364d163173", + "task_id": "T7.123", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-81fbfb962103b645", + "task_id": "T7.123", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-c41e983019497e88", + "task_id": "T7.123", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-308b0349ef001b56", + "task_id": "T7.123", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-7a3f68ca1e19c9db", + "task_id": "T7.123", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-475d0f82a4e9b764", + "task_id": "T7.123", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-2276a7bff678cf41", + "task_id": "T7.123", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-63c736995704d2d6", + "task_id": "T7.123", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-f5ac788b77f1417a", + "task_id": "T7.123", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-ae6a96ea4d41087d", + "task_id": "T7.123", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-f617ccfb4cfc3cc2", + "task_id": "T7.123", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-169001b0559c7bcb", + "task_id": "T7.123", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-6bce10f282924906", + "task_id": "T7.123", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-0b0bcefaf7a0b24f", + "task_id": "T7.124", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-d8c6998c9398adf1", + "task_id": "T7.124", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-79ebe40a23b7323a", + "task_id": "T7.124", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-6da59a8629d16699", + "task_id": "T7.124", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-773e04e041de5410", + "task_id": "T7.124", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-f12d6e4a615966e9", + "task_id": "T7.124", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-ede4da279d79ec69", + "task_id": "T7.124", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-36c8164a04c2420c", + "task_id": "T7.124", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-4053884d5188ab2f", + "task_id": "T7.124", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-0cc9a9ea64babfdc", + "task_id": "T7.125", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-234cb88ea5651731", + "task_id": "T7.125", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-312e6eafc5ebdca6", + "task_id": "T7.126", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-1985156ff8e5c87d", + "task_id": "T7.126", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-ca7e963b9f3e3214", + "task_id": "T7.126", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-aede9d1024b66426", + "task_id": "T7.126", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-07c63776b48ad48f", + "task_id": "T7.126", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-ea16598ca26b9108", + "task_id": "T7.126", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-ca2f4806dea5f177", + "task_id": "T7.127", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-054f4f2a2583f814", + "task_id": "T7.127", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-dda225859c807d72", + "task_id": "T7.128", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-76e54a4e3ac5efb3", + "task_id": "T7.129", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-84fbbd387f95947a", + "task_id": "T7.129", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-c74d7d04edeb4ee2", + "task_id": "T7.130", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-cb47dbd2bd0937a1", + "task_id": "T7.130", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-6f7bee0a60d5152f", + "task_id": "T7.130", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-e1b115ce18cb0926", + "task_id": "T7.131", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-9bb912a1e3d2bf88", + "task_id": "T7.131", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-6a756d858b2a4590", + "task_id": "T7.132", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-0f6724ca27b42ed9", + "task_id": "T7.132", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-ec3e72154d735330", + "task_id": "T7.132", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-e85c88c08460d2ef", + "task_id": "T7.132", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-9c90ce2f531301e0", + "task_id": "T7.132", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-3e6ff569aac7699e", + "task_id": "T7.132", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-ca4b8a2f2a2f60bf", + "task_id": "T7.132", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-c990523bb862f2b6", + "task_id": "T7.132", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-7a5a584e25342a04", + "task_id": "T7.132", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-8d9dd908cb4d8452", + "task_id": "T7.132", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-cb7511d8b0a3b651", + "task_id": "T7.133", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-d7edea27d80824ed", + "task_id": "T7.134", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-65ab86fae5fd2213", + "task_id": "T7.135", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-709dbb22240f409f", + "task_id": "T7.136", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-d68060f1555ca324", + "task_id": "T7.136", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-b922ced0e34aacea", + "task_id": "T7.136", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-295d32efbfee9145", + "task_id": "T7.136", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-56955e0bf792f087", + "task_id": "T7.137", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-d6379e87cfa699fa", + "task_id": "T7.138", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-789d9f9254afa1b1", + "task_id": "T7.139", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-2f98dec54b741594", + "task_id": "T7.139", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-852f97f8aacc5432", + "task_id": "T7.139", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-ba57287cdb3eb096", + "task_id": "T7.139", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-bfbbf95e2bedfe38", + "task_id": "T7.139", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-65cc9415acf1be4d", + "task_id": "T7.139", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-5561b78de6be772b", + "task_id": "T7.139", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-6b719694dd2640c7", + "task_id": "T7.139", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-6a07b625f331b20e", + "task_id": "T7.140", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-adf6edf7670e9010", + "task_id": "T7.141", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-3a081de1dd30ebb2", + "task_id": "T7.142", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-c52ffccc8c0fb590", + "task_id": "T7.143", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-811ab08155776051", + "task_id": "T7.143", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-11d1a497d98b8490", + "task_id": "T7.144", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-a7a71d348e2c49f5", + "task_id": "T7.145", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-41876b44c3442c4b", + "task_id": "T7.145", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-3a3cc8c9282e0fb5", + "task_id": "T7.145", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-43d0d5170d6a8434", + "task_id": "T7.145", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-a6e1105b549e0cf0", + "task_id": "T7.146", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-ab5e571ba64af645", + "task_id": "T7.147", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-e5ec24184e5b758c", + "task_id": "T7.148", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-0fda904c59353043", + "task_id": "T7.149", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-5c42b38e8a9c25ff", + "task_id": "T7.150", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-1539a5c009afd0df", + "task_id": "T7.151", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-b6947bb24c18c8ac", + "task_id": "T7.152", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-ddf685d0be472b86", + "task_id": "T7.152", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-296d5f7499179bc0", + "task_id": "T7.152", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-4c6957160cb5ae0c", + "task_id": "T7.152", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-fe8af642c27ce051", + "task_id": "T7.153", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-88fbdf8930f67549", + "task_id": "T7.154", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-27ac318897664d8a", + "task_id": "T7.155", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-7d7d3a3c4f1824bd", + "task_id": "T7.156", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-44c350a8b7e2fd4a", + "task_id": "T7.157", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-a7fa9aad275f9425", + "task_id": "T7.157", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CLANGTIDY-cf5f09b5a02a9bca", + "task_id": "T7.158", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-7975c2d572bc32c0", + "task_id": "T7.159", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-291bebc3b95eca4e", + "task_id": "T7.159", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-366138c5d194685c", + "task_id": "T7.160", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-ed278d9594c2abdb", + "task_id": "T7.161", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-67fcff31d1a4cf75", + "task_id": "T7.161", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-a642f51dfd2a124a", + "task_id": "T7.161", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-404de092ea97cc43", + "task_id": "T7.161", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-6243e36ec0fdb5cd", + "task_id": "T7.161", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-5c63d53fbef3ba6d", + "task_id": "T7.161", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-ab2c863c82952346", + "task_id": "T7.162", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-f53a71c368c33ab9", + "task_id": "T7.162", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-45887456841ead8b", + "task_id": "T7.162", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-cb235968867c79e3", + "task_id": "T7.162", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-02418efc105b6ab9", + "task_id": "T7.162", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-4e8530c09d5fd082", + "task_id": "T7.162", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-f16c5e93d86bc6f9", + "task_id": "T7.163", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-41381cd9bd64279e", + "task_id": "T7.163", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-422485a76dc61a9b", + "task_id": "T7.163", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-44ea0e63c82a7151", + "task_id": "T7.163", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-155480cbfd270011", + "task_id": "T7.163", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-79b6e7adf4959fbc", + "task_id": "T7.163", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-0a786d21e1ee7bd2", + "task_id": "T7.164", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-c2dc58af6543d1f5", + "task_id": "T7.164", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-3b71a4c47dfd1075", + "task_id": "T7.164", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-ea11ae604e62541e", + "task_id": "T7.164", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-8d573ae471211e73", + "task_id": "T7.164", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-22666b8c08cd887e", + "task_id": "T7.164", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-9190884804c0c65d", + "task_id": "T7.165", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-e8ce699e42be07b3", + "task_id": "T7.165", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-0f4bbeb4ab715fee", + "task_id": "T7.166", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-ef00a494fd69875c", + "task_id": "T7.166", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-e93ca9cb727a0aee", + "task_id": "T7.166", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-20e1a03b32e40002", + "task_id": "T7.166", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-e7e0cc4f8fd4c513", + "task_id": "T7.166", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-aa839344c6e5b30d", + "task_id": "T7.166", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-ae74d74f4f8f96b4", + "task_id": "T7.167", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-33c31857a85153c5", + "task_id": "T7.167", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-2b401ef7608cff74", + "task_id": "T7.167", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-6b623e0db3f455c7", + "task_id": "T7.167", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-63e9c68b97a2b704", + "task_id": "T7.167", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-3d882f111ea61422", + "task_id": "T7.167", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-ba71da8483425ebf", + "task_id": "T7.168", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-6ffa955639ab6418", + "task_id": "T7.168", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-6faae6bddf434aab", + "task_id": "T7.168", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-9bd9a8994dceced4", + "task_id": "T7.168", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-e845a2e465702318", + "task_id": "T7.168", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-1f35f119bab13f92", + "task_id": "T7.168", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-5088d976b993e707", + "task_id": "T7.169", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-fea403cece7fffa3", + "task_id": "T7.169", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-20d0442e85244a5d", + "task_id": "T7.169", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-03b8b95f3bd44235", + "task_id": "T7.169", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-993ef9a219cc29a2", + "task_id": "T7.169", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-eaa9041228587f50", + "task_id": "T7.169", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-19d5fc636e3f15e6", + "task_id": "T7.170", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-2cdd7ef73529551e", + "task_id": "T7.170", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-5a25b9ace393f230", + "task_id": "T7.170", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-12c7bb31966e53aa", + "task_id": "T7.170", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-274240d1fc0300f7", + "task_id": "T7.170", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-2a20bf23c61a102e", + "task_id": "T7.170", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-bb1a968a245405ec", + "task_id": "T7.171", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-3a6fb0a94ef6ffdf", + "task_id": "T7.171", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-e0e4b387af698b40", + "task_id": "T7.171", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-389226ea0147ea5d", + "task_id": "T7.171", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-aab67d5bbb7b5489", + "task_id": "T7.171", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-f492731b13ec277c", + "task_id": "T7.171", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-d03afa69ead3203e", + "task_id": "T7.172", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-8ce22b0413a485e1", + "task_id": "T7.172", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-40ef7b2f328bb9ef", + "task_id": "T7.172", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-93d2b8db97a42555", + "task_id": "T7.172", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-ea86635ccd79513e", + "task_id": "T7.172", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-5ec0649750441f81", + "task_id": "T7.172", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-fe8c1e237393fb23", + "task_id": "T7.173", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-59e343114dc251b1", + "task_id": "T7.173", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-5a1cbbfddf8f3fcc", + "task_id": "T7.173", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-350da16b1c3b2274", + "task_id": "T7.173", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-44b516dc2eeb97bf", + "task_id": "T7.173", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-5da42ce096a9fa82", + "task_id": "T7.173", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-7b00d558899dd292", + "task_id": "T7.174", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-4e38c49052b49016", + "task_id": "T7.174", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-6af902622576c683", + "task_id": "T7.174", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-098293b0fb5320bb", + "task_id": "T7.174", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-f25f197e02c782fc", + "task_id": "T7.174", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-ccf3e6e7959d2bd7", + "task_id": "T7.174", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-400e44e71536be4e", + "task_id": "T7.175", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-d3aede71a08c3a5f", + "task_id": "T7.175", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-fcf1de019f6b4533", + "task_id": "T7.175", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-3469a0a703cdbc12", + "task_id": "T7.176", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-199d3d91208953b4", + "task_id": "T7.177", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-81a756fe7228ad5b", + "task_id": "T7.177", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-ddc6803a9b16e391", + "task_id": "T7.177", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-7cde28afaa9ffb65", + "task_id": "T7.177", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-7dcecd444f491721", + "task_id": "T7.177", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-9308fe6583bcdce7", + "task_id": "T7.177", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-5e7cfcb56208eaa9", + "task_id": "T7.178", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-e84d458d8fcd3eef", + "task_id": "T7.178", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-cf4b93673820960b", + "task_id": "T7.178", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-00c9eb79387b90d1", + "task_id": "T7.179", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-c603f4c09210c0bd", + "task_id": "T7.179", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-07e48ad6ea9ce45e", + "task_id": "T7.179", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-dfeaa6c4a9abf5fa", + "task_id": "T7.179", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-98f2a6813a7ad225", + "task_id": "T7.179", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-e73c0530b2243573", + "task_id": "T7.179", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-c4c40aa44f4e62e4", + "task_id": "T7.180", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-d900a116e1f06cf4", + "task_id": "T7.180", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-de63541e57266afb", + "task_id": "T7.180", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-e810ef87137eb5d8", + "task_id": "T7.180", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-38ac9714530327f7", + "task_id": "T7.180", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-b1a74f710eb47a22", + "task_id": "T7.180", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-2d6e882afea8fed1", + "task_id": "T7.181", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-f3bd5129ab03f352", + "task_id": "T7.181", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-7ba2e66a4eb3914f", + "task_id": "T7.181", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-05ad31a80cc2b3a2", + "task_id": "T7.181", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-30a2e484727d4a5a", + "task_id": "T7.181", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-b32370126e568d01", + "task_id": "T7.181", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-f77074e66ed65721", + "task_id": "T7.182", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-e26c8068ece9c0e0", + "task_id": "T7.182", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-4246d4277a0b8f04", + "task_id": "T7.182", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-642b5326a1034302", + "task_id": "T7.182", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-c0802f3ddbb20b2e", + "task_id": "T7.182", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-137cbeae12c87193", + "task_id": "T7.182", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-a167dfb879b1b9cf", + "task_id": "T7.183", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-b0e1dbc8e8cc536e", + "task_id": "T7.183", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-50994f387baeaa69", + "task_id": "T7.183", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-dcde47440ba091e3", + "task_id": "T7.183", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-114c375fcc3b4802", + "task_id": "T7.183", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-8b431e9fa35d81ba", + "task_id": "T7.183", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-a4e1217d107c230c", + "task_id": "T7.184", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-4a0d0e1ea3635a24", + "task_id": "T7.184", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-d6ed69efe339ce37", + "task_id": "T7.184", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-61d1473d84fbeea6", + "task_id": "T7.184", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-dd680edebf6809ff", + "task_id": "T7.184", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-e267f8f47c3806d3", + "task_id": "T7.184", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-d5ecbc0292c55216", + "task_id": "T7.185", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-c067bb3093f57d49", + "task_id": "T7.185", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-4e8b56001c3a0722", + "task_id": "T7.185", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-223399111dfd4016", + "task_id": "T7.185", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-7d2f50f4d066f6e4", + "task_id": "T7.185", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-00d366c5691b4bb5", + "task_id": "T7.185", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-7f43090b7b01626a", + "task_id": "T7.186", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-17ad0e14291e8ec3", + "task_id": "T7.186", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-18b7f3add93999e4", + "task_id": "T7.186", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-d3157833e1568912", + "task_id": "T7.186", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-184f5809a1f3d621", + "task_id": "T7.186", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-682efc8151a90daf", + "task_id": "T7.186", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-2e14d60ae388c180", + "task_id": "T7.187", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-9a54a74c58d29d4c", + "task_id": "T7.187", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-165a348ebdcecd71", + "task_id": "T7.188", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-1760eab07e0cce49", + "task_id": "T7.188", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-df0c5f209b6ef6ab", + "task_id": "T7.188", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-c464a6c1e23bf196", + "task_id": "T7.188", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-de50a4c99ae7d421", + "task_id": "T7.188", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-7189b497b5a855df", + "task_id": "T7.188", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-bc4e9a8b10d83163", + "task_id": "T7.189", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-c31a4d9816cac7ce", + "task_id": "T7.189", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-e715a00f3dbe2f4f", + "task_id": "T7.189", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-9a70a1ccf37b9405", + "task_id": "T7.189", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-e876245abbef0a79", + "task_id": "T7.189", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-c811624672d6bfff", + "task_id": "T7.189", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-a4f59c579d19ce1e", + "task_id": "T7.190", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-7a540f91903a1e57", + "task_id": "T7.190", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-dcdb657c2038e332", + "task_id": "T7.190", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-20016996a3c7e096", + "task_id": "T7.191", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-92718cbd3fc79c29", + "task_id": "T7.191", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-71520b6429344586", + "task_id": "T7.191", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-82f90000b805b238", + "task_id": "T7.191", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-2acf09b0886c70c8", + "task_id": "T7.191", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-e6884093b3a77737", + "task_id": "T7.191", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-24d767472f9eac0b", + "task_id": "T7.192", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-6040ad491a730d6d", + "task_id": "T7.192", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-d8c2127f8046b560", + "task_id": "T7.193", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-e4342be069acaf24", + "task_id": "T7.193", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-141e103765b7c505", + "task_id": "T7.193", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-370c727cb2690828", + "task_id": "T7.193", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-bf7012d93c48094c", + "task_id": "T7.193", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-11c6ba5b7bf02e40", + "task_id": "T7.193", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-87cfe9ce5d499faf", + "task_id": "T7.194", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-4d679d89b4da6865", + "task_id": "T7.194", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-d670cad0625d4f2c", + "task_id": "T7.194", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-03caeab009bdc4fd", + "task_id": "T7.194", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-939df4abd7adefdd", + "task_id": "T7.194", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-4cf2eab3dda13b90", + "task_id": "T7.194", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-68103860cfe78d89", + "task_id": "T7.195", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-be996c224380b85e", + "task_id": "T7.195", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-65f403c439392041", + "task_id": "T7.195", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-752682010e0c301c", + "task_id": "T7.195", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-f32c4fd5a51337d3", + "task_id": "T7.196", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-d5958c65428cdc31", + "task_id": "T7.196", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-45ebdb33421d89d5", + "task_id": "T7.197", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-d6af678aacfbb026", + "task_id": "T7.197", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-e48ab90f6d76f69a", + "task_id": "T7.197", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-6cf65d94c0e817c8", + "task_id": "T7.197", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-d0493f3174391c77", + "task_id": "T7.197", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-134e1087e8cda477", + "task_id": "T7.197", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-8a059d804561f236", + "task_id": "T7.198", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-21e6c2fa9c26c964", + "task_id": "T7.198", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-b18881a630321191", + "task_id": "T7.198", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-d9d81163d1e1193d", + "task_id": "T7.198", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-3322f39793a9258c", + "task_id": "T7.198", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-6bdf7c909180cb5e", + "task_id": "T7.198", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-243fa74ece4acc83", + "task_id": "T7.199", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-aa87081e964848f0", + "task_id": "T7.199", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-b9126919c0a748d2", + "task_id": "T7.199", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-ac70bbab0047fa80", + "task_id": "T7.199", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-23073b0c71d7d2e3", + "task_id": "T7.199", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-be705595f12d1850", + "task_id": "T7.199", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-55a74c5d3180cf15", + "task_id": "T7.200", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-fd743aa60d9abb1f", + "task_id": "T7.200", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-fbc7ca1e0083c1d1", + "task_id": "T7.200", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-259ca1824a1d1447", + "task_id": "T7.200", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-c06de8e6c5473e61", + "task_id": "T7.200", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-6bab06cb3c8102a9", + "task_id": "T7.200", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-3ace786e8c2cd1a8", + "task_id": "T7.201", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-08d8785eb7476330", + "task_id": "T7.201", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-51093f104f4e1cbb", + "task_id": "T7.201", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-7c82f257c4fb1103", + "task_id": "T7.201", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-c4dd2be3483455e5", + "task_id": "T7.201", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-5c8c07852ed0b107", + "task_id": "T7.201", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "ESLINT-BUCKET-e046fbe269eed0dc", + "task_id": "T7.202", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-38d664fd8e77f607", + "task_id": "T7.203", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-3d1693ad77a15fa2", + "task_id": "T7.203", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-3508a7db3ef7fc03", + "task_id": "T7.203", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-ca79e52beb5f22bb", + "task_id": "T7.203", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-5941fdb9ccb989f3", + "task_id": "T7.203", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-10a0fa2f24fefc90", + "task_id": "T7.204", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-ffdd97ac6ebb6b4b", + "task_id": "T7.204", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-7dc87bf617f52146", + "task_id": "T7.204", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-347fec696ca3fcab", + "task_id": "T7.204", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-1980a8233237856a", + "task_id": "T7.204", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-e9cd8f29e136cbb8", + "task_id": "T7.205", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-ac6f81ae03a685f3", + "task_id": "T7.206", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-8bb35cef096bd68d", + "task_id": "T7.207", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-7e66ded89b37cb4f", + "task_id": "T7.208", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-c6d1df4e6770f40e", + "task_id": "T7.209", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-fb37582a72f59582", + "task_id": "T7.210", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-c7b3ef530f996e26", + "task_id": "T7.210", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-90ec02278e01bcac", + "task_id": "T7.211", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-6291a48798ed350c", + "task_id": "T7.212", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-681aedac30d87a1e", + "task_id": "T7.213", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-ee781b371da39bf5", + "task_id": "T7.214", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-dc056676c7084f53", + "task_id": "T7.214", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-0130dae8fb623afa", + "task_id": "T7.214", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-365ebbda46eacf74", + "task_id": "T7.215", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-8737ababcc06f484", + "task_id": "T7.216", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-baf28ba17bc25dd0", + "task_id": "T7.217", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-462bf13ae3867115", + "task_id": "T7.218", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-b6f82c4c9b287eba", + "task_id": "T7.219", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-c7a8e9a51802c60d", + "task_id": "T7.220", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-d3985740b2ac6585", + "task_id": "T7.221", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-82a085f0cc04468f", + "task_id": "T7.222", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-27ab7ab1e74c2e72", + "task_id": "T7.222", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-d0de2e4ac47c3191", + "task_id": "T7.223", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-fbb9e9402242eaba", + "task_id": "T7.224", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-fd8d6a4b8cc77400", + "task_id": "T7.225", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-43fcd9340a9e63ed", + "task_id": "T7.226", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-e7f8f80f0cd95f0d", + "task_id": "T7.227", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-70e0496568faa30f", + "task_id": "T7.228", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-5bdf073f41a6c65d", + "task_id": "T7.229", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-527aa4750d3ac84a", + "task_id": "T7.230", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-d9684d3aa203568c", + "task_id": "T7.231", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-e228634622467328", + "task_id": "T7.232", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-bdb708e597b5cade", + "task_id": "T7.233", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-cbab871259b9963d", + "task_id": "T7.234", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-8c644cc847574bfe", + "task_id": "T7.235", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-4c0052bc9de6e496", + "task_id": "T7.236", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-45cfee19afe8668f", + "task_id": "T7.237", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-933d7ae37be3c395", + "task_id": "T7.238", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-b1c0c559c6e17a23", + "task_id": "T7.238", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-8596888f0dd1cc7e", + "task_id": "T7.239", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-298feb4a490d6252", + "task_id": "T7.240", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-a8ce2c3168c021de", + "task_id": "T7.241", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-9575437f939001d5", + "task_id": "T7.242", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-df230b0a5672f192", + "task_id": "T7.242", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-8e110c5360beb299", + "task_id": "T7.243", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-6c5cf9bd3f338f84", + "task_id": "T7.244", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-08f60b7ec76ce9d3", + "task_id": "T7.245", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-7e7f6cc12d937123", + "task_id": "T7.246", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-f21c65912e355ace", + "task_id": "T7.247", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-9f651ab0c8ea6422", + "task_id": "T7.248", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-353deb8bba479029", + "task_id": "T7.249", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-c6ee03168003661f", + "task_id": "T7.250", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-5d8aaf042fefce78", + "task_id": "T7.251", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-b4e128a1af325d4f", + "task_id": "T7.252", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-77479b4ba7ef9849", + "task_id": "T7.253", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-c9404ed2a73b0977", + "task_id": "T7.254", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-e924700b1413accd", + "task_id": "T7.254", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-2ca7413944026780", + "task_id": "T7.254", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-a1edb744b382f8f5", + "task_id": "T7.255", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-4001e3b91223c7ad", + "task_id": "T7.255", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-ae15015525d96c08", + "task_id": "T7.255", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-f3bb2108694b562f", + "task_id": "T7.256", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-57093ce27e4aabc5", + "task_id": "T7.257", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-4dc0544d99c6a120", + "task_id": "T7.258", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-aa0082260172b3b9", + "task_id": "T7.259", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-5f736ad7b9095aea", + "task_id": "T7.260", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-eabea03354c7b4b7", + "task_id": "T7.260", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-e9a38e72fa2e4a7c", + "task_id": "T7.261", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-3ec7089cfaa16e94", + "task_id": "T7.262", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-4ffd5c5d72b2c6a0", + "task_id": "T7.263", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-f4469b09cc19dae9", + "task_id": "T7.264", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-611000c5c122ad1e", + "task_id": "T7.265", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-d41611e4fb1c1abd", + "task_id": "T7.266", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-b14c25475c91b307", + "task_id": "T7.267", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-03f92e362a140589", + "task_id": "T7.268", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-d45c6fa42b05db96", + "task_id": "T7.269", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-9551a431943d8273", + "task_id": "T7.270", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-86335be98f6f2e90", + "task_id": "T7.271", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-f814692d9029a8a1", + "task_id": "T7.272", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CODEQUALITY-941", + "task_id": "T7.273", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-1f586f8741e770e9", + "task_id": "T7.274", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-95058fe138843b1f", + "task_id": "T7.275", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-9c71189558451cd4", + "task_id": "T7.276", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-2f8dc61aeb7cdda6", + "task_id": "T7.277", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-c7e9176ca688d280", + "task_id": "T7.278", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-064299ecf7d09b55", + "task_id": "T7.279", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-28b7ea4b18c686f4", + "task_id": "T7.280", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-1ac7ae81e97d3df2", + "task_id": "T7.281", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-0251d17e5b89df2a", + "task_id": "T7.282", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-eee46ed30daef891", + "task_id": "T7.283", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-dcdbd8e6357d7e12", + "task_id": "T7.284", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-bbeef7abfa51d073", + "task_id": "T7.285", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-0be349a4e3fc0518", + "task_id": "T7.286", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-8f929a70e127f155", + "task_id": "T7.287", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-147fba26f7ae351b", + "task_id": "T7.288", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-05b22ae697eaa4ca", + "task_id": "T7.289", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-9d2c058ee958f85a", + "task_id": "T7.290", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-426773bc9bc5a5d5", + "task_id": "T7.291", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-eda9b7001501e847", + "task_id": "T7.292", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-779ca0994d939da1", + "task_id": "T7.293", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-93112ea9a6a3c10d", + "task_id": "T7.294", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-b1b17a4b9a2646a0", + "task_id": "T7.295", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-a4ae78869ec196b6", + "task_id": "T7.296", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-efd7988ca87c95ed", + "task_id": "T7.297", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-49117790281d294c", + "task_id": "T7.298", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-a12a87ba590d2536", + "task_id": "T7.299", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-56c122b53a2e50cb", + "task_id": "T7.300", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-ae4dbf08b9cfd1fe", + "task_id": "T7.301", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-b9ff6009cfa26f69", + "task_id": "T7.301", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-b614f3b94230fe9a", + "task_id": "T7.302", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-664e70c550c3ef36", + "task_id": "T7.303", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-2afdb0b1f1146eeb", + "task_id": "T7.304", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-96d5b13210206feb", + "task_id": "T7.305", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-50bc6e286ac69abd", + "task_id": "T7.306", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-89a47a59067748c1", + "task_id": "T7.307", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-da5006735d5c5165", + "task_id": "T7.308", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-51dd1a644803f48d", + "task_id": "T7.309", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-a3e8d56a93d61112", + "task_id": "T7.310", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-771b3fde1937be8a", + "task_id": "T7.311", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-e4dae70b5d1bd770", + "task_id": "T7.311", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-9cc73ce911540ad4", + "task_id": "T7.312", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-905555e786df0459", + "task_id": "T7.313", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-5d0aacd6263110c5", + "task_id": "T7.314", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-ec17ee32f6d27cdb", + "task_id": "T7.315", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-d4393cc822a0c2d3", + "task_id": "T7.316", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "F-T11-01", + "task_id": "T7.317", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "F-T11-02", + "task_id": "T7.318", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "F-T11-03", + "task_id": "T7.319", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "F-T11-04", + "task_id": "T7.320", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "F-T11-05", + "task_id": "T7.321", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "F-T11-06", + "task_id": "T7.322", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "F-T11-07", + "task_id": "T7.323", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "F-T11-08", + "task_id": "T7.324", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "F-T11-09", + "task_id": "T7.325", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "F-T11-10", + "task_id": "T7.326", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "F-T11-11", + "task_id": "T7.327", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "F-T11-12", + "task_id": "T7.328", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "F-T11-13", + "task_id": "T7.329", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "F-T11-14", + "task_id": "T7.330", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "F-T11-15", + "task_id": "T7.331", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "F-T11-16", + "task_id": "T7.332", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "F-T11-17", + "task_id": "T7.333", + "resolution": "pending-task", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-1d212665be6abacf", + "task_id": "T14", + "resolution": "scanner-coverage-work", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-bf25cb222c0b2cec", + "task_id": "T14", + "resolution": "scanner-coverage-work", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-3b2a52c560d89f94", + "task_id": "T14", + "resolution": "scanner-coverage-work", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-2ae67633fb74b7c9", + "task_id": "T14", + "resolution": "scanner-coverage-work", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-c606b1ed76e58ccd", + "task_id": "T14", + "resolution": "scanner-coverage-work", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-d095c0f0e6168f4a", + "task_id": "T14", + "resolution": "scanner-coverage-work", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-d17837c5125ba58a", + "task_id": "T14", + "resolution": "scanner-coverage-work", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-8fc3dcb4cfe70835", + "task_id": "T14", + "resolution": "scanner-coverage-work", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-63161c8eafe92ae7", + "task_id": "T14", + "resolution": "scanner-coverage-work", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-b70962cce382071f", + "task_id": "T14", + "resolution": "scanner-coverage-work", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-814033f796b8ad0e", + "task_id": "T14", + "resolution": "scanner-coverage-work", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-01e694ff6fbd689d", + "task_id": "T14", + "resolution": "scanner-coverage-work", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-cc922dd5985313ad", + "task_id": "T14", + "resolution": "scanner-coverage-work", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-3ae8fa421e075d0e", + "task_id": "T14", + "resolution": "scanner-coverage-work", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-d38eb9023c264f0b", + "task_id": "T14", + "resolution": "scanner-coverage-work", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-f275f11a2e762883", + "task_id": "T14", + "resolution": "scanner-coverage-work", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-3d9620f855b0045c", + "task_id": "T14", + "resolution": "scanner-coverage-work", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-ce2eb41d6af3de2c", + "task_id": "T14", + "resolution": "scanner-coverage-work", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-81673e70160cf41d", + "task_id": "T14", + "resolution": "scanner-coverage-work", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-4f5bbc66f323399f", + "task_id": "T14", + "resolution": "scanner-coverage-work", + "approved_exception": false + }, + { + "finding_id": "CPPCHECK-BUCKET-99e8da0855ffc2d5", + "task_id": "T14", + "resolution": "scanner-coverage-work", + "approved_exception": false + } + ], + "coverage_gaps": [ + { + "id": "GAP-secret-scanning-disabled", + "tasks": [ + "T14", + "T38" + ], + "status": "unresolved", + "approved_exception": false + }, + { + "id": "GAP-codeql-not-on-pull-request", + "tasks": [ + "T14" + ], + "status": "unresolved", + "approved_exception": false + }, + { + "id": "GAP-no-js-ts-sast", + "tasks": [ + "T14" + ], + "status": "unresolved", + "approved_exception": false + }, + { + "id": "GAP-scanners-non-blocking", + "tasks": [ + "T14", + "T15", + "T38" + ], + "status": "unresolved", + "approved_exception": false + }, + { + "id": "GAP-sast-optional-feature-scope", + "tasks": [ + "T14" + ], + "status": "unresolved", + "approved_exception": false + }, + { + "id": "GAP-cppcheck-config-coverage", + "tasks": [ + "T14" + ], + "status": "unresolved", + "approved_exception": false + }, + { + "id": "GAP-eslint-no-artifact", + "tasks": [ + "T14" + ], + "status": "unresolved", + "approved_exception": false + }, + { + "id": "GAP-trivy-scope", + "tasks": [ + "T14" + ], + "status": "unresolved", + "approved_exception": false + }, + { + "id": "GAP-dependency-coverage", + "tasks": [ + "T14" + ], + "status": "unresolved", + "approved_exception": false + }, + { + "id": "GAP-no-codeowners", + "tasks": [ + "T7.335" + ], + "status": "unresolved", + "approved_exception": false + } + ], + "gate_dependency_additions": { + "T15": [ + "T7.8", + "T7.9", + "T7.10" + ], + "T21": [ + "T7.161", + "T7.180", + "T7.189", + "T7.193", + "T7.197" + ], + "T22": [ + "T7.161", + "T7.168", + "T7.180", + "T7.189", + "T7.198" + ], + "T20": [ + "T7.167", + "T7.177", + "T7.180", + "T7.198" + ], + "T18": [ + "T7.334" + ], + "T19": [ + "T7.334" + ], + "T14": [ + "T7.1" + ], + "T25": [ + "T7.160", + "T7.161", + "T7.162", + "T7.163", + "T7.164", + "T7.165", + "T7.166", + "T7.167", + "T7.168", + "T7.169", + "T7.170", + "T7.171", + "T7.172", + "T7.173", + "T7.174", + "T7.175", + "T7.176", + "T7.177", + "T7.178", + "T7.179", + "T7.180", + "T7.181", + "T7.182", + "T7.183", + "T7.184", + "T7.185", + "T7.186", + "T7.187", + "T7.188", + "T7.189", + "T7.190", + "T7.191", + "T7.192", + "T7.193", + "T7.194", + "T7.195", + "T7.196", + "T7.197", + "T7.198", + "T7.199", + "T7.200", + "T7.201", + "T7.202", + "T7.273" + ], + "T33": [ + "T7.1", + "T7.2", + "T7.3", + "T7.4", + "T7.5", + "T7.6", + "T7.7", + "T7.8", + "T7.9", + "T7.10", + "T7.11", + "T7.12", + "T7.13", + "T7.14", + "T7.15", + "T7.16", + "T7.17", + "T7.18", + "T7.19", + "T7.20", + "T7.21", + "T7.22", + "T7.23", + "T7.24", + "T7.25", + "T7.26", + "T7.27", + "T7.28", + "T7.29", + "T7.30", + "T7.31", + "T7.32", + "T7.33", + "T7.34", + "T7.35", + "T7.36", + "T7.37", + "T7.38", + "T7.39", + "T7.40", + "T7.41", + "T7.42", + "T7.43", + "T7.44", + "T7.45", + "T7.46", + "T7.47", + "T7.48", + "T7.49", + "T7.50", + "T7.51", + "T7.52", + "T7.53", + "T7.54", + "T7.55", + "T7.56", + "T7.57", + "T7.58", + "T7.59", + "T7.60", + "T7.61", + "T7.62", + "T7.63", + "T7.64", + "T7.65", + "T7.66", + "T7.67", + "T7.68", + "T7.69", + "T7.70", + "T7.71", + "T7.72", + "T7.73", + "T7.74", + "T7.75", + "T7.76", + "T7.77", + "T7.78", + "T7.79", + "T7.80", + "T7.81", + "T7.82", + "T7.83", + "T7.84", + "T7.85", + "T7.86", + "T7.87", + "T7.88", + "T7.89", + "T7.90", + "T7.91", + "T7.92", + "T7.93", + "T7.94", + "T7.95", + "T7.96", + "T7.97", + "T7.98", + "T7.99", + "T7.100", + "T7.101", + "T7.102", + "T7.103", + "T7.104", + "T7.105", + "T7.106", + "T7.107", + "T7.108", + "T7.109", + "T7.110", + "T7.111", + "T7.112", + "T7.113", + "T7.114", + "T7.115", + "T7.116", + "T7.117", + "T7.118", + "T7.119", + "T7.120", + "T7.121", + "T7.122", + "T7.123", + "T7.124", + "T7.125", + "T7.126", + "T7.127", + "T7.128", + "T7.129", + "T7.130", + "T7.131", + "T7.132", + "T7.133", + "T7.134", + "T7.135", + "T7.136", + "T7.137", + "T7.138", + "T7.139", + "T7.140", + "T7.141", + "T7.142", + "T7.143", + "T7.144", + "T7.145", + "T7.146", + "T7.147", + "T7.148", + "T7.149", + "T7.150", + "T7.151", + "T7.152", + "T7.153", + "T7.154", + "T7.155", + "T7.156", + "T7.157", + "T7.158", + "T7.159", + "T7.160", + "T7.161", + "T7.162", + "T7.163", + "T7.164", + "T7.165", + "T7.166", + "T7.167", + "T7.168", + "T7.169", + "T7.170", + "T7.171", + "T7.172", + "T7.173", + "T7.174", + "T7.175", + "T7.176", + "T7.177", + "T7.178", + "T7.179", + "T7.180", + "T7.181", + "T7.182", + "T7.183", + "T7.184", + "T7.185", + "T7.186", + "T7.187", + "T7.188", + "T7.189", + "T7.190", + "T7.191", + "T7.192", + "T7.193", + "T7.194", + "T7.195", + "T7.196", + "T7.197", + "T7.198", + "T7.199", + "T7.200", + "T7.201", + "T7.202", + "T7.203", + "T7.204", + "T7.205", + "T7.206", + "T7.207", + "T7.208", + "T7.209", + "T7.210", + "T7.211", + "T7.212", + "T7.213", + "T7.214", + "T7.215", + "T7.216", + "T7.217", + "T7.218", + "T7.219", + "T7.220", + "T7.221", + "T7.222", + "T7.223", + "T7.224", + "T7.225", + "T7.226", + "T7.227", + "T7.228", + "T7.229", + "T7.230", + "T7.231", + "T7.232", + "T7.233", + "T7.234", + "T7.235", + "T7.236", + "T7.237", + "T7.238", + "T7.239", + "T7.240", + "T7.241", + "T7.242", + "T7.243", + "T7.244", + "T7.245", + "T7.246", + "T7.247", + "T7.248", + "T7.249", + "T7.250", + "T7.251", + "T7.252", + "T7.253", + "T7.254", + "T7.255", + "T7.256", + "T7.257", + "T7.258", + "T7.259", + "T7.260", + "T7.261", + "T7.262", + "T7.263", + "T7.264", + "T7.265", + "T7.266", + "T7.267", + "T7.268", + "T7.269", + "T7.270", + "T7.271", + "T7.272", + "T7.273", + "T7.274", + "T7.275", + "T7.276", + "T7.277", + "T7.278", + "T7.279", + "T7.280", + "T7.281", + "T7.282", + "T7.283", + "T7.284", + "T7.285", + "T7.286", + "T7.287", + "T7.288", + "T7.289", + "T7.290", + "T7.291", + "T7.292", + "T7.293", + "T7.294", + "T7.295", + "T7.296", + "T7.297", + "T7.298", + "T7.299", + "T7.300", + "T7.301", + "T7.302", + "T7.303", + "T7.304", + "T7.305", + "T7.306", + "T7.307", + "T7.308", + "T7.309", + "T7.310", + "T7.311", + "T7.312", + "T7.313", + "T7.314", + "T7.315", + "T7.316", + "T7.317", + "T7.318", + "T7.319", + "T7.320", + "T7.321", + "T7.322", + "T7.323", + "T7.324", + "T7.325", + "T7.326", + "T7.327", + "T7.328", + "T7.329", + "T7.330", + "T7.331", + "T7.332", + "T7.333", + "T7.334", + "T7.335", + "T38" + ] + }, + "shared_resource_contracts": { + "native_test_registration": "T13 must discover sorted tests/unit/cmake/eng/*.cmake fragments; each remediation worker owns its exact fragment. No worker edits shared tests/unit/CMakeLists.txt.", + "native_profiles": "Use T3 coherent system FFmpeg provenance and the required optional production feature profile; lean omission cannot close feature diagnostics. Sanitizer evidence is separate and required for memory/UB fixes.", + "package_leases": "T8 -> dependency tasks -> T15; subsequent T26/T34/T35 remain serial.", + "generation": "T12 -> T7 contract reconciliation -> T18/T19; resolve exact generated output names after T12 before releasing reconciliation.", + "migration": "T25 depends on all first-party web fix tasks; T16/T17/T19/T20/T21/T22 get explicit overlapping path predecessors.", + "policy": "T7.1 follows T6 and precedes T14; T33 integrates dispositions and must reject unresolved proposals.", + "c_boundary": "T31 is read-only selection. Each T31.* child must depend on the last remediation writer of its exact selected source paths, using this map; selection cannot release overlapping writes without those edges." + }, + "discrepancy_map": { + "D-01": [ + "T20", + "T22" + ], + "D-02": [ + "T20", + "T22" + ], + "D-03": [ + "T21" + ], + "D-04": [ + "T19", + "T22" + ], + "D-05": [ + "T20", + "T22" + ], + "D-06": [ + "T25" + ], + "D-07": [ + "T18", + "T27" + ], + "D-08": [ + "T7.324", + "T7.325", + "T18", + "T19" + ], + "D-09": [ + "T25", + "T34" + ], + "D-10": [ + "T13" + ] + }, + "operational_gap_map": { + "real_media_recovery": [ + "T27" + ], + "storage_faults": [ + "T28" + ], + "shutdown_kill_upgrade": [ + "T29" + ], + "repeat_resource_observation": [ + "T30" + ], + "coherent_ffmpeg_and_test_isolation": [ + "T13" + ], + "optional_feature_coverage": [ + "T14", + "T35", + "T36" + ] + }, + "new_observations": [ + { + "id": "T8-root-minimatch-GHSA-g3hv-75wg-m249", + "task_id": "T7.9", + "evidence": "build/eng-artifacts/dependency-review/root-all.json", + "status": "new-unbaselined", + "inventory_owner": "T33", + "note": "Same advisory as web; new root dev dependency path from T8. No approval or baseline mutation." + } + ] +} From f9b2f0cf050f4d78e2f9cefd7e4436e8356bff9a Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Sat, 31 Oct 2026 03:37:50 -0400 Subject: [PATCH 014/230] T7: normalize expansion record whitespace --- quality/evidence/T7-expansion.md | 668 +++++++++++++++---------------- quality/evidence/T7.md | 3 +- 2 files changed, 336 insertions(+), 335 deletions(-) diff --git a/quality/evidence/T7-expansion.md b/quality/evidence/T7-expansion.md index 63b54f36b..0dd626dba 100644 --- a/quality/evidence/T7-expansion.md +++ b/quality/evidence/T7-expansion.md @@ -47,7 +47,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - **validation**: - `python3 -m json.tool quality/reviews/advisory-ghsa-cv53-mq7p-6jp2.json` - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.3: Verify disposition and regression evidence for ADVISORY-repo-advisory-draft-1 @@ -64,7 +64,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - **validation**: - `python3 -m json.tool quality/reviews/advisory-repo-advisory-draft-1.json` - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.4: Verify disposition and regression evidence for ADVISORY-repo-advisory-closed-1 @@ -81,7 +81,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - **validation**: - `python3 -m json.tool quality/reviews/advisory-repo-advisory-closed-1.json` - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.5: Verify disposition and regression evidence for ADVISORY-repo-advisory-draft-2 @@ -98,7 +98,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - **validation**: - `python3 -m json.tool quality/reviews/advisory-repo-advisory-draft-2.json` - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.6: Verify disposition and regression evidence for ADVISORY-GHSA-rqj3-pch5-rq4f @@ -115,7 +115,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - **validation**: - `python3 -m json.tool quality/reviews/advisory-ghsa-rqj3-pch5-rq4f.json` - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.7: Verify disposition and regression evidence for ADVISORY-GHSA-pvw7-7j8c-qx96 @@ -132,7 +132,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - **validation**: - `python3 -m json.tool quality/reviews/advisory-ghsa-pvw7-7j8c-qx96.json` - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.8: Remediate glob dependency advisory GHSA-3g3m-2fjr-6pw4 @@ -153,7 +153,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `npm --prefix web run build` - `LIGHTNVR_WEB_LEGACY=false npm --prefix web run build` - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.9: Remediate minimatch dependency advisory GHSA-g3hv-75wg-m249 @@ -178,7 +178,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `npm audit --json` - `npm audit --omit=dev --json` - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.10: Remediate deepmerge dependency advisory GHSA-gcqx-w48m-w2h4 @@ -199,7 +199,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `npm --prefix web run build` - `LIGHTNVR_WEB_LEGACY=false npm --prefix web run build` - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.11: cpp/cleartext-storage-database in db_event_destinations.c @@ -217,7 +217,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.11 --regex '^test_t7_11$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.11`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.12: cpp/cleartext-storage-database in db_streams.c @@ -235,7 +235,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.12 --regex '^test_t7_12$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.12`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.13: cpp/cleartext-storage-file in config.c @@ -253,7 +253,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.13 --regex '^test_t7_13$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.13`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.14: cpp/cleartext-transmission in hls_unified_thread.c @@ -271,7 +271,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.14 --regex '^test_t7_14$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.14`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.15: cpp/cleartext-transmission in stream_protocol.c @@ -289,7 +289,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.15 --regex '^test_t7_15$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.15`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.16: cpp/integer-multiplication-cast-to-long in mp4_writer_utils.c @@ -307,7 +307,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.16 --regex '^test_t7_16$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.16`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.17: cpp/non-https-url in go2rtc_api.c @@ -325,7 +325,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.17 --regex '^test_t7_17$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.17`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.18: cpp/non-https-url in onvif_detection.c @@ -343,7 +343,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.18 --regex '^test_t7_18$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.18`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.19: cpp/non-https-url in onvif_discovery.c @@ -361,7 +361,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.19 --regex '^test_t7_19$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.19`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.20: cpp/non-https-url in api_handlers_ptz.c @@ -379,7 +379,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.20 --regex '^test_t7_20$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.20`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.21: cpp/path-injection in storage_s3.c @@ -397,7 +397,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.21 --regex '^test_t7_21$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.21`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.22: cpp/path-injection in linux_cgroup.c, linux_network.c @@ -415,7 +415,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.22 --regex '^test_t7_22$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.22`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.23: cpp/sql-injection in sqlite_migrate.c @@ -433,7 +433,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.23 --regex '^test_t7_23$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.23`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.24: cpp/suspicious-pointer-scaling in frame.c @@ -451,7 +451,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_24-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.24`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.25: cpp/toctou-race-condition in db_core.c @@ -469,7 +469,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.25 --regex '^test_t7_25$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.25`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.26: cpp/toctou-race-condition in storage_migration.c @@ -487,7 +487,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.26 --regex '^test_t7_26$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.26`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.27: cpp/toctou-race-condition in api_handlers_operator_floor_plans.c @@ -505,7 +505,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.27 --regex '^test_t7_27$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.27`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.28: cpp/uncontrolled-allocation-size in event_router.c @@ -523,7 +523,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.28 --regex '^test_t7_28$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.28`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.29: cpp/world-writable-file-creation in mqtt_client.c @@ -541,7 +541,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.29 --regex '^test_t7_29$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.29`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.30: arrayIndexOutOfBounds in stream_protocol.c @@ -559,7 +559,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.30 --regex '^test_t7_30$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.30`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.31: clang-analyzer-core.CallAndMessage in system_health_policy.c @@ -577,7 +577,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.31 --regex '^test_t7_31$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.31`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.32: clang-analyzer-core.DivideZero in db_storage_pools.c @@ -595,7 +595,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.32 --regex '^test_t7_32$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.32`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.33: clang-analyzer-core.NonNullParamChecker in camera_collection_filter.c @@ -613,7 +613,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.33 --regex '^test_t7_33$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.33`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.34: clang-analyzer-core.NonNullParamChecker in db_storage_policies.c @@ -631,7 +631,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.34 --regex '^test_t7_34$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.34`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.35: clang-analyzer-core.NonNullParamChecker in storage_s3.c @@ -649,7 +649,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.35 --regex '^test_t7_35$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.35`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.36: clang-analyzer-core.NullDereference in event_envelope.c @@ -667,7 +667,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.36 --regex '^test_t7_36$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.36`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.37: clang-analyzer-core.NullDereference in db_live_saved_layouts.c @@ -685,7 +685,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.37 --regex '^test_t7_37$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.37`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.38: clang-analyzer-core.NullDereference in db_storage_policies.c @@ -703,7 +703,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.38 --regex '^test_t7_38$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.38`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.39: clang-analyzer-core.NullDereference in smartctl_provider.c @@ -721,7 +721,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.39 --regex '^test_t7_39$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.39`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.40: clang-analyzer-core.NullDereference in go2rtc_api.c @@ -739,7 +739,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.40 --regex '^test_t7_40$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.40`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.41: clang-analyzer-core.NullDereference in hls_writer.c @@ -757,7 +757,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.41 --regex '^test_t7_41$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.41`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.42: clang-analyzer-core.NullDereference in api_handlers_authorization.c @@ -775,7 +775,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.42 --regex '^test_t7_42$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.42`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.43: clang-analyzer-core.NullDereference in api_handlers_fleet.c @@ -793,7 +793,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.43 --regex '^test_t7_43$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.43`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.44: clang-analyzer-core.NullDereference in api_handlers_health.c @@ -811,7 +811,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.44 --regex '^test_t7_44$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.44`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.45: clang-analyzer-core.NullDereference in api_handlers_lpr.c @@ -829,7 +829,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.45 --regex '^test_t7_45$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.45`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.46: clang-analyzer-core.NullDereference in api_handlers_recording_control.c @@ -847,7 +847,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.46 --regex '^test_t7_46$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.46`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.47: clang-analyzer-core.NullDereference in api_handlers_retention.c @@ -865,7 +865,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.47 --regex '^test_t7_47$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.47`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.48: clang-analyzer-core.NullDereference in api_handlers_storage_migrations.c @@ -883,7 +883,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.48 --regex '^test_t7_48$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.48`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.49: clang-analyzer-core.NullDereference in api_handlers_streams_get.c @@ -901,7 +901,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.49 --regex '^test_t7_49$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.49`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.50: clang-analyzer-core.NullDereference in api_handlers_streams_modify.c @@ -919,7 +919,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.50 --regex '^test_t7_50$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.50`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.51: clang-analyzer-core.NullDereference in api_handlers_system_health.c @@ -937,7 +937,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.51 --regex '^test_t7_51$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.51`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.52: clang-analyzer-core.UndefinedBinaryOperatorResult in path_utils.c @@ -955,7 +955,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.52 --regex '^test_t7_52$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.52`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.53: clang-analyzer-security.ArrayBound in authorization.c @@ -973,7 +973,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.53 --regex '^test_t7_53$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.53`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.54: clang-analyzer-security.ArrayBound in logger_json.c @@ -991,7 +991,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.54 --regex '^test_t7_54$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.54`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.55: clang-analyzer-security.ArrayBound in main.c @@ -1009,7 +1009,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.55 --regex '^test_t7_55$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.55`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.56: clang-analyzer-security.ArrayBound in sqlite_migrate.c @@ -1027,7 +1027,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.56 --regex '^test_t7_56$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.56`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.57: clang-analyzer-security.ArrayBound in linux_network.c, linux_process.c, linux_restart.c, linux_thermal.c @@ -1045,7 +1045,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.57 --regex '^test_t7_57$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.57`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.58: clang-analyzer-security.ArrayBound in linux_hardware.c @@ -1063,7 +1063,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.58 --regex '^test_t7_58$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.58`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.59: clang-analyzer-security.ArrayBound in system_health.c @@ -1081,7 +1081,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.59 --regex '^test_t7_59$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.59`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.60: clang-analyzer-security.ArrayBound in go2rtc_process.c @@ -1099,7 +1099,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.60 --regex '^test_t7_60$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.60`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.61: clang-analyzer-security.ArrayBound in hls_cache_cleanup.c @@ -1117,7 +1117,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.61 --regex '^test_t7_61$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.61`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.62: clang-analyzer-security.ArrayBound in stream_manager.c @@ -1135,7 +1135,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.62 --regex '^test_t7_62$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.62`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.63: clang-analyzer-security.ArrayBound in api_handlers_fleet.c @@ -1153,7 +1153,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.63 --regex '^test_t7_63$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.63`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.64: clang-analyzer-security.ArrayBound in api_handlers_streams_get.c @@ -1171,7 +1171,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.64 --regex '^test_t7_64$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.64`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.65: clang-analyzer-security.ArrayBound in api_handlers_system.c @@ -1189,7 +1189,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.65 --regex '^test_t7_65$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.65`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.66: clang-analyzer-security.insecureAPI.strcpy in recording_transcode.c @@ -1207,7 +1207,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.66 --regex '^test_t7_66$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.66`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.67: clang-analyzer-security.insecureAPI.strcpy in api_handlers_go2rtc_proxy.c @@ -1225,7 +1225,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.67 --regex '^test_t7_67$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.67`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.68: clang-analyzer-unix.BlockInCriticalSection in health_helper_runner.c @@ -1243,7 +1243,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.68 --regex '^test_t7_68$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.68`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.69: clang-analyzer-unix.BlockInCriticalSection in hls_unified_thread.c @@ -1261,7 +1261,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.69 --regex '^test_t7_69$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.69`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.70: clang-analyzer-unix.Errno in storage_migration.c @@ -1279,7 +1279,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.70 --regex '^test_t7_70$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.70`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.71: clang-analyzer-unix.StdCLibraryFunctions in hls_cache_cleanup.c @@ -1297,7 +1297,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.71 --regex '^test_t7_71$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.71`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.72: clang-analyzer-unix.Stream in linux_network.c @@ -1315,7 +1315,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.72 --regex '^test_t7_72$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.72`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.73: integerOverflow in config.c @@ -1333,7 +1333,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.73 --regex '^test_t7_73$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.73`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.74: memleak in sod_img_writer.h @@ -1351,7 +1351,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_74-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.74`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.75: memleak in sod.c @@ -1369,7 +1369,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_75-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.75`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.76: preprocessorErrorDirective in nvme_provider.c @@ -1387,7 +1387,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.76 --regex '^test_t7_76$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.76`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.77: preprocessorErrorDirective in mp4_writer_utils.c @@ -1405,7 +1405,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.77 --regex '^test_t7_77$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.77`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.78: arrayIndexOutOfBoundsCond in stream_protocol.c @@ -1423,7 +1423,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.78 --regex '^test_t7_78$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.78`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.79: bugprone-assignment-in-if-condition in db_system_health_incidents.c @@ -1441,7 +1441,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.79 --regex '^test_t7_79$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.79`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.80: bugprone-assignment-in-if-condition in api_detection.c @@ -1459,7 +1459,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.80 --regex '^test_t7_80$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.80`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.81: bugprone-assignment-in-if-condition in api_handlers_metrics.c @@ -1477,7 +1477,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.81 --regex '^test_t7_81$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.81`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.82: bugprone-assignment-in-if-condition in go2rtc_websocket.c @@ -1495,7 +1495,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.82 --regex '^test_t7_82$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.82`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.83: bugprone-branch-clone in linux_cgroup.c @@ -1513,7 +1513,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.83 --regex '^test_t7_83$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.83`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.84: bugprone-branch-clone in api_handlers_authorization.c @@ -1531,7 +1531,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.84 --regex '^test_t7_84$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.84`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.85: bugprone-branch-clone in api_handlers_timeline.c @@ -1549,7 +1549,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.85 --regex '^test_t7_85$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.85`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.86: bugprone-branch-clone in audit_log.c @@ -1567,7 +1567,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.86 --regex '^test_t7_86$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.86`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.87: bugprone-branch-clone in thumbnail_thread.c @@ -1585,7 +1585,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.87 --regex '^test_t7_87$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.87`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.88: bugprone-implicit-widening-of-multiplication-result in event_bus.c @@ -1603,7 +1603,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.88 --regex '^test_t7_88$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.88`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.89: bugprone-implicit-widening-of-multiplication-result in event_envelope.c @@ -1621,7 +1621,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.89 --regex '^test_t7_89$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.89`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.90: bugprone-implicit-widening-of-multiplication-result in event_router.c @@ -1639,7 +1639,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.90 --regex '^test_t7_90$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.90`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.91: bugprone-implicit-widening-of-multiplication-result in mqtt_delivery_worker.c @@ -1657,7 +1657,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.91 --regex '^test_t7_91$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.91`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.92: bugprone-implicit-widening-of-multiplication-result in db_operator_floor_plans.c @@ -1675,7 +1675,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.92 --regex '^test_t7_92$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.92`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.93: bugprone-implicit-widening-of-multiplication-result in storage_migration.c @@ -1693,7 +1693,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.93 --regex '^test_t7_93$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.93`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.94: bugprone-implicit-widening-of-multiplication-result in storage_s3.c @@ -1711,7 +1711,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.94 --regex '^test_t7_94$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.94`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.95: bugprone-implicit-widening-of-multiplication-result in linux_network.c, linux_process.c, linux_thermal.c @@ -1729,7 +1729,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.95 --regex '^test_t7_95$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.95`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.96: bugprone-implicit-widening-of-multiplication-result in ffmpeg_rss_guard.c @@ -1747,7 +1747,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.96 --regex '^test_t7_96$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.96`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.97: bugprone-implicit-widening-of-multiplication-result in lpr_crypto.c @@ -1765,7 +1765,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.97 --regex '^test_t7_97$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.97`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.98: bugprone-implicit-widening-of-multiplication-result in go2rtc_api.c, go2rtc_consumer.c, go2rtc_integration.c, go2rtc_snapshot.c, go2rtc_stream.c @@ -1783,7 +1783,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.98 --regex '^test_t7_98$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.98`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.99: bugprone-implicit-widening-of-multiplication-result in mp4_writer_utils.c @@ -1801,7 +1801,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.99 --regex '^test_t7_99$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.99`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.100: bugprone-implicit-widening-of-multiplication-result in onvif_detection.c @@ -1819,7 +1819,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.100 --regex '^test_t7_100$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.100`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.101: bugprone-implicit-widening-of-multiplication-result in onvif_event.c @@ -1837,7 +1837,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.101 --regex '^test_t7_101$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.101`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.102: bugprone-implicit-widening-of-multiplication-result in api_handlers_investigations.c @@ -1855,7 +1855,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.102 --regex '^test_t7_102$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.102`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.103: bugprone-implicit-widening-of-multiplication-result in api_handlers_lpr.c @@ -1873,7 +1873,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.103 --regex '^test_t7_103$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.103`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.104: bugprone-implicit-widening-of-multiplication-result in api_handlers_operator_floor_plans.c @@ -1891,7 +1891,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.104 --regex '^test_t7_104$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.104`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.105: bugprone-implicit-widening-of-multiplication-result in api_handlers_storage.c @@ -1909,7 +1909,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.105 --regex '^test_t7_105$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.105`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.106: bugprone-implicit-widening-of-multiplication-result in api_handlers_system_go2rtc.c @@ -1927,7 +1927,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.106 --regex '^test_t7_106$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.106`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.107: bugprone-implicit-widening-of-multiplication-result in api_handlers_timeline.c @@ -1945,7 +1945,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.107 --regex '^test_t7_107$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.107`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.108: bugprone-implicit-widening-of-multiplication-result in go2rtc_websocket.c @@ -1963,7 +1963,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.108 --regex '^test_t7_108$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.108`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.109: bugprone-implicit-widening-of-multiplication-result in recording_archive.c @@ -1981,7 +1981,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.109 --regex '^test_t7_109$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.109`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.110: bugprone-inc-dec-in-conditions in storage_source.c @@ -1999,7 +1999,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.110 --regex '^test_t7_110$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.110`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.111: bugprone-macro-parentheses in cJSON.h @@ -2017,7 +2017,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_111-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.111`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.112: bugprone-macro-parentheses in api_detection.c @@ -2035,7 +2035,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.112 --regex '^test_t7_112$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.112`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.113: bugprone-misplaced-widening-cast in db_fleet_query.c @@ -2053,7 +2053,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.113 --regex '^test_t7_113$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.113`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.114: bugprone-multi-level-implicit-pointer-conversion in authorization.c @@ -2071,7 +2071,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.114 --regex '^test_t7_114$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.114`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.115: bugprone-multi-level-implicit-pointer-conversion in camera_collection_filter.c @@ -2089,7 +2089,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.115 --regex '^test_t7_115$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.115`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.116: bugprone-multi-level-implicit-pointer-conversion in camera_selector.c @@ -2107,7 +2107,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.116 --regex '^test_t7_116$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.116`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.117: bugprone-multi-level-implicit-pointer-conversion in db_storage_lifecycle.c @@ -2125,7 +2125,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.117 --regex '^test_t7_117$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.117`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.118: bugprone-multi-level-implicit-pointer-conversion in hls_cache_cleanup.c @@ -2143,7 +2143,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.118 --regex '^test_t7_118$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.118`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.119: bugprone-multi-level-implicit-pointer-conversion in mp4_segment_recorder.c @@ -2161,7 +2161,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.119 --regex '^test_t7_119$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.119`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.120: bugprone-multi-level-implicit-pointer-conversion in mp4_writer_core.c @@ -2179,7 +2179,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.120 --regex '^test_t7_120$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.120`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.121: bugprone-multi-level-implicit-pointer-conversion in mp4_writer_utils.c @@ -2197,7 +2197,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.121 --regex '^test_t7_121$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.121`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.122: bugprone-multi-level-implicit-pointer-conversion in unified_detection_thread.c @@ -2215,7 +2215,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.122 --regex '^test_t7_122$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.122`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.123: bugprone-multi-level-implicit-pointer-conversion in api_handlers_camera_collections.c @@ -2233,7 +2233,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.123 --regex '^test_t7_123$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.123`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.124: bugprone-multi-level-implicit-pointer-conversion in api_handlers_fleet.c @@ -2251,7 +2251,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.124 --regex '^test_t7_124$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.124`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.125: bugprone-multi-level-implicit-pointer-conversion in api_handlers_retention.c @@ -2269,7 +2269,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.125 --regex '^test_t7_125$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.125`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.126: bugprone-multi-level-implicit-pointer-conversion in api_handlers_storage_policies.c @@ -2287,7 +2287,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.126 --regex '^test_t7_126$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.126`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.127: bugprone-narrowing-conversions in api_timing.h @@ -2305,7 +2305,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.127 --regex '^test_t7_127$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.127`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.128: bugprone-narrowing-conversions in path_utils.c @@ -2323,7 +2323,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.128 --regex '^test_t7_128$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.128`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.129: bugprone-narrowing-conversions in db_storage_lifecycle.c @@ -2341,7 +2341,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.129 --regex '^test_t7_129$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.129`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.130: bugprone-narrowing-conversions in mp4_writer_utils.c @@ -2359,7 +2359,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.130 --regex '^test_t7_130$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.130`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.131: bugprone-narrowing-conversions in stream_frame_rate.c @@ -2377,7 +2377,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.131 --regex '^test_t7_131$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.131`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.132: bugprone-narrowing-conversions in api_handlers_storage_compliance.c @@ -2395,7 +2395,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.132 --regex '^test_t7_132$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.132`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.133: bugprone-narrowing-conversions in httpd_utils.c @@ -2413,7 +2413,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.133 --regex '^test_t7_133$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.133`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.134: bugprone-not-null-terminated-result in mqtt_destination_client.c @@ -2431,7 +2431,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.134 --regex '^test_t7_134$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.134`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.135: bugprone-not-null-terminated-result in linux_hardware.c @@ -2449,7 +2449,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.135 --regex '^test_t7_135$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.135`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.136: bugprone-suspicious-string-compare in db_storage_targets.c @@ -2467,7 +2467,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.136 --regex '^test_t7_136$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.136`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.137: bugprone-suspicious-string-compare in storage_deletion.c @@ -2485,7 +2485,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.137 --regex '^test_t7_137$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.137`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.138: bugprone-suspicious-string-compare in storage_migration.c @@ -2503,7 +2503,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.138 --regex '^test_t7_138$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.138`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.139: bugprone-suspicious-string-compare in storage_s3.c @@ -2521,7 +2521,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.139 --regex '^test_t7_139$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.139`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.140: bugprone-suspicious-string-compare in storage_source.c @@ -2539,7 +2539,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.140 --regex '^test_t7_140$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.140`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.141: bugprone-suspicious-string-compare in recording_archive.c @@ -2557,7 +2557,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.141 --regex '^test_t7_141$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.141`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.142: bugprone-unsafe-functions,cert-msc24-c,cert-msc33-c in storage_s3.c @@ -2575,7 +2575,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.142 --regex '^test_t7_142$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.142`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.143: cert-err34-c in linux_device_map.c, linux_hardware.c @@ -2593,7 +2593,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.143 --regex '^test_t7_143$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.143`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.144: cert-err34-c in ffmpeg_rss_guard.c @@ -2611,7 +2611,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.144 --regex '^test_t7_144$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.144`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.145: cert-err34-c in go2rtc_integration.c, go2rtc_process.c @@ -2629,7 +2629,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.145 --regex '^test_t7_145$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.145`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.146: cert-err34-c in onvif_detection.c @@ -2647,7 +2647,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.146 --regex '^test_t7_146$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.146`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.147: cert-err34-c in api_handlers_go2rtc_proxy.c @@ -2665,7 +2665,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.147 --regex '^test_t7_147$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.147`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.148: cert-err34-c in api_handlers_investigations.c @@ -2683,7 +2683,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.148 --regex '^test_t7_148$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.148`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.149: cert-err34-c in api_handlers_system_logs.c @@ -2701,7 +2701,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.149 --regex '^test_t7_149$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.149`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.150: cert-err34-c in go2rtc_websocket.c @@ -2719,7 +2719,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.150 --regex '^test_t7_150$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.150`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.151: cert-int09-c in authorization.h @@ -2737,7 +2737,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.151 --regex '^test_t7_151$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.151`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.152: cert-int09-c in faac.h @@ -2755,7 +2755,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_152-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.152`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.153: clang-analyzer-deadcode.DeadStores in db_system_health_incidents.c @@ -2773,7 +2773,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.153 --regex '^test_t7_153$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.153`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.154: clang-analyzer-deadcode.DeadStores in go2rtc_integration.c @@ -2791,7 +2791,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.154 --regex '^test_t7_154$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.154`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.155: clang-analyzer-deadcode.DeadStores in mp4_segment_recorder.c @@ -2809,7 +2809,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.155 --regex '^test_t7_155$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.155`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.156: clang-analyzer-deadcode.DeadStores in onvif_ptz.c @@ -2827,7 +2827,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.156 --regex '^test_t7_156$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.156`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.157: clang-analyzer-deadcode.DeadStores in recording_path.c @@ -2845,7 +2845,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.157 --regex '^test_t7_157$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.157`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.158: clang-analyzer-deadcode.DeadStores in api_handlers_health.c @@ -2863,7 +2863,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.158 --regex '^test_t7_158$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.158`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.159: invalidPointerCast in sod.c @@ -2881,7 +2881,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_159-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.159`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.160: jsx-a11y/anchor-is-valid in Header.jsx @@ -2902,7 +2902,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.160/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/anchor-is-valid'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.160`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.161: jsx-a11y/click-events-have-key-events in GridPicker.jsx, HLSVideoCell.jsx, HealthView.jsx, MSEVideoCell.jsx, StreamCard.jsx, StreamsView.jsx @@ -2923,7 +2923,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.161/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/click-events-have-key-events'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.161`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.162: jsx-a11y/click-events-have-key-events in ToastContainer.jsx, UI.jsx, WebRTCVideoCell.jsx, ZoneEditor.jsx, LanguageSelector.jsx, ModalDialog.jsx @@ -2944,7 +2944,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.162/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/click-events-have-key-events'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.162`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.163: jsx-a11y/click-events-have-key-events in LiveOperatorNavigator.jsx, RecordingsGrid.jsx, Go2rtcTab.jsx, ClearLogsModal.jsx, RestartModal.jsx, TimelinePlayer.jsx @@ -2965,7 +2965,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.163/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/click-events-have-key-events'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.163`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.164: jsx-a11y/click-events-have-key-events in AccessPolicyModal.jsx, AddUserModal.jsx, ApiKeyModal.jsx, AuditHistoryModal.jsx, DeleteUserModal.jsx, EditUserModal.jsx @@ -2986,7 +2986,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.164/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/click-events-have-key-events'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.164`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.165: jsx-a11y/click-events-have-key-events in RoleManagerModal.jsx, TotpSetupModal.jsx @@ -3007,7 +3007,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.165/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/click-events-have-key-events'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.165`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.166: jsx-a11y/control-has-associated-label in AuthGate.jsx, BatchDownloadModal.jsx, DetectionOverlay.jsx, FleetView.jsx, FullscreenManager.jsx, HLSVideoCell.jsx @@ -3028,7 +3028,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.166/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/control-has-associated-label'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.166`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.167: jsx-a11y/control-has-associated-label in LiveView.jsx, LoginView.jsx, MSEVideoCell.jsx, SetupWizard.jsx, SnapshotManager.jsx, StreamConfigModal.jsx @@ -3049,7 +3049,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.167/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/control-has-associated-label'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.167`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.168: jsx-a11y/control-has-associated-label in StreamsView.jsx, ThemeCustomizer.jsx, UI.jsx, WebRTCVideoCell.jsx, ZoneEditor.jsx, ModalDialog.jsx @@ -3070,7 +3070,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.168/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/control-has-associated-label'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.168`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.169: jsx-a11y/control-has-associated-label in EventDestinationEditor.jsx, EventRouteEditor.jsx, BulkOrganizeModal.jsx, CollectionManager.jsx, CollectionSelectorBuilder.jsx, FleetFilters.jsx @@ -3091,7 +3091,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.169/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/control-has-associated-label'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.169`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.170: jsx-a11y/control-has-associated-label in OrganizationManager.jsx, SavedViewsBar.jsx, StaticCollectionMembers.jsx, InvestigationActions.jsx, InvestigationBookmarks.jsx, InvestigationView.jsx @@ -3112,7 +3112,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.170/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/control-has-associated-label'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.170`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.171: jsx-a11y/control-has-associated-label in LiveBuildingPlan.jsx, LiveOperatorNavigator.jsx, PlanSketchControls.jsx, FiltersSidebar.jsx, RecordingsGrid.jsx, RecordingsTable.jsx @@ -3133,7 +3133,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.171/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/control-has-associated-label'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.171`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.172: jsx-a11y/control-has-associated-label in TagsOverlay.jsx, AdvancedTab.jsx, AuthTab.jsx, DetectionTab.jsx, GeneralTab.jsx, Go2rtcTab.jsx @@ -3154,7 +3154,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.172/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/control-has-associated-label'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.172`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.173: jsx-a11y/control-has-associated-label in HealthTab.jsx, MqttTab.jsx, StorageTab.jsx, StreamsDefaultsTab.jsx, StreamStorage.jsx, CalendarPicker.jsx @@ -3175,7 +3175,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.173/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/control-has-associated-label'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.173`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.174: jsx-a11y/control-has-associated-label in TimelineControls.jsx, TimelinePlayer.jsx, AddUserModal.jsx, ApiKeyModal.jsx, AuditHistoryModal.jsx, EditUserModal.jsx @@ -3196,7 +3196,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.174/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/control-has-associated-label'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.174`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.175: jsx-a11y/control-has-associated-label in RoleManagerModal.jsx, TotpSetupModal.jsx, UsersTable.jsx @@ -3217,7 +3217,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.175/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/control-has-associated-label'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.175`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.176: jsx-a11y/interactive-supports-focus in MobileTileGestures.jsx @@ -3238,7 +3238,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.176/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/interactive-supports-focus'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.176`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.177: jsx-a11y/label-has-associated-control in BatchDownloadModal.jsx, StreamConfigModal.jsx, EventDestinationEditor.jsx, EventRouteEditor.jsx, CollectionManager.jsx, StaticCollectionMembers.jsx @@ -3259,7 +3259,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.177/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/label-has-associated-control'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.177`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.178: jsx-a11y/label-has-associated-control in HealthTab.jsx, StorageTab.jsx, ApiKeyModal.jsx @@ -3280,7 +3280,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.178/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/label-has-associated-control'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.178`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.179: jsx-a11y/label-has-for in AuthGate.jsx, BatchDownloadModal.jsx, FleetView.jsx, LiveView.jsx, LoginView.jsx, SetupWizard.jsx @@ -3301,7 +3301,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.179/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/label-has-for'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.179`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.180: jsx-a11y/label-has-for in StreamCard.jsx, StreamConfigModal.jsx, StreamsView.jsx, UI.jsx, ZoneEditor.jsx, ModalDialog.jsx @@ -3322,7 +3322,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.180/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/label-has-for'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.180`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.181: jsx-a11y/label-has-for in EventDestinationEditor.jsx, EventRouteEditor.jsx, BulkOrganizeModal.jsx, CollectionManager.jsx, CollectionSelectorBuilder.jsx, FleetTable.jsx @@ -3343,7 +3343,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.181/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/label-has-for'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.181`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.182: jsx-a11y/label-has-for in OrganizationManager.jsx, SavedViewsBar.jsx, StaticCollectionMembers.jsx, InvestigationActions.jsx, InvestigationBookmarks.jsx, InvestigationView.jsx @@ -3364,7 +3364,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.182/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/label-has-for'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.182`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.183: jsx-a11y/label-has-for in LiveBuildingPlan.jsx, LiveOperatorNavigator.jsx, FiltersSidebar.jsx, RecordingsGrid.jsx, RecordingsTable.jsx, TagsOverlay.jsx @@ -3385,7 +3385,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.183/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/label-has-for'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.183`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.184: jsx-a11y/label-has-for in AdvancedTab.jsx, AuthTab.jsx, DetectionTab.jsx, GeneralTab.jsx, Go2rtcTab.jsx, HealthTab.jsx @@ -3406,7 +3406,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.184/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/label-has-for'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.184`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.185: jsx-a11y/label-has-for in MqttTab.jsx, StorageTab.jsx, StreamsDefaultsTab.jsx, WorkspacesTab.jsx, TimelinePage.jsx, TimelinePlayer.jsx @@ -3427,7 +3427,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.185/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/label-has-for'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.185`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.186: jsx-a11y/label-has-for in AccessPolicyModal.jsx, AddUserModal.jsx, ApiKeyModal.jsx, AuditDecisionModes.jsx, AuditHistoryModal.jsx, EditUserModal.jsx @@ -3448,7 +3448,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.186/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/label-has-for'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.186`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.187: jsx-a11y/label-has-for in RoleManagerModal.jsx, TotpSetupModal.jsx @@ -3469,7 +3469,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.187/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/label-has-for'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.187`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.188: jsx-a11y/media-has-caption in HLSVideoCell.jsx, MSEVideoCell.jsx, UI.jsx, WebRTCVideoCell.jsx, InvestigationView.jsx, TimelinePlayer.jsx @@ -3490,7 +3490,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.188/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/media-has-caption'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.188`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.189: jsx-a11y/mouse-events-have-key-events in DayNightControl.jsx, HLSVideoCell.jsx, SnapshotManager.jsx, StreamCard.jsx, StreamsView.jsx, Toast.jsx @@ -3511,7 +3511,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.189/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/mouse-events-have-key-events'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.189`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.190: jsx-a11y/mouse-events-have-key-events in WebRTCVideoCell.jsx, RecordingsTable.jsx, TimelinePage.jsx @@ -3532,7 +3532,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.190/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/mouse-events-have-key-events'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.190`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.191: jsx-a11y/no-autofocus in AuthGate.jsx, LoginView.jsx, EventDestinationEditor.jsx, EventRouteEditor.jsx, CollectionManager.jsx, OrganizationManager.jsx @@ -3553,7 +3553,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.191/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-autofocus'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.191`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.192: jsx-a11y/no-autofocus in InvestigationBookmarks.jsx, TotpSetupModal.jsx @@ -3574,7 +3574,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.192/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-autofocus'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.192`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.193: jsx-a11y/no-noninteractive-element-interactions in FisheyeEptzCanvas.jsx, StreamCard.jsx, ZoneEditor.jsx, LanguageSelector.jsx, InvestigationView.jsx, LiveBuildingPlan.jsx @@ -3595,7 +3595,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.193/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-noninteractive-element-interactions'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.193`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.194: jsx-a11y/no-noninteractive-element-interactions in LiveOperatorNavigator.jsx, RecordingsGrid.jsx, TimelineCursor.jsx, TimelineSegments.jsx, AccessPolicyModal.jsx, AddUserModal.jsx @@ -3616,7 +3616,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.194/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-noninteractive-element-interactions'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.194`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.195: jsx-a11y/no-noninteractive-element-interactions in ApiKeyModal.jsx, AuditHistoryModal.jsx, EditUserModal.jsx, RoleManagerModal.jsx @@ -3637,7 +3637,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.195/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-noninteractive-element-interactions'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.195`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.196: jsx-a11y/no-noninteractive-tabindex in FisheyeEptzCanvas.jsx, LanguageSelector.jsx @@ -3658,7 +3658,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.196/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-noninteractive-tabindex'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.196`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.197: jsx-a11y/no-static-element-interactions in GridPicker.jsx, HLSVideoCell.jsx, HealthView.jsx, LiveView.jsx, MSEVideoCell.jsx, StreamCard.jsx @@ -3679,7 +3679,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.197/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-static-element-interactions'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.197`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.198: jsx-a11y/no-static-element-interactions in StreamConfigModal.jsx, StreamsView.jsx, ToastContainer.jsx, UI.jsx, WebRTCVideoCell.jsx, ZoneEditor.jsx @@ -3700,7 +3700,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.198/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-static-element-interactions'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.198`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.199: jsx-a11y/no-static-element-interactions in ModalDialog.jsx, BulkOrganizeModal.jsx, CollectionManager.jsx, OrganizationManager.jsx, LiveBuildingPlan.jsx, LiveOperatorNavigator.jsx @@ -3721,7 +3721,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.199/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-static-element-interactions'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.199`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.200: jsx-a11y/no-static-element-interactions in RecordingsGrid.jsx, Go2rtcTab.jsx, ClearLogsModal.jsx, RestartModal.jsx, TimelinePlayer.jsx, AccessPolicyModal.jsx @@ -3742,7 +3742,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.200/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-static-element-interactions'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.200`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.201: jsx-a11y/no-static-element-interactions in AddUserModal.jsx, ApiKeyModal.jsx, AuditHistoryModal.jsx, DeleteUserModal.jsx, EditUserModal.jsx, RoleManagerModal.jsx @@ -3763,7 +3763,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.201/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-static-element-interactions'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.201`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.202: jsx-a11y/no-static-element-interactions in TotpSetupModal.jsx @@ -3784,7 +3784,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.202/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-static-element-interactions'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.202`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.203: nullPointerArithmeticRedundantCheck in sod_img_writer.h @@ -3802,7 +3802,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_203-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.203`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.204: nullPointerRedundantCheck in sod_img_writer.h @@ -3820,7 +3820,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_204-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.204`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.205: wrongPrintfScanfArgNum in linux_thermal.c @@ -3838,7 +3838,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.205 --regex '^test_t7_205$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.205`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.206: zerodivcond in sod_img_reader.h @@ -3856,7 +3856,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_206-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.206`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.207: arrayIndexThenCheck in sod_img_writer.h @@ -3874,7 +3874,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_207-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.207`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.208: constParameter in linux_network.c @@ -3892,7 +3892,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.208 --regex '^test_t7_208$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.208`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.209: constParameter in api_handlers_investigations.c @@ -3910,7 +3910,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.209 --regex '^test_t7_209$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.209`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.210: constParameterCallback in sod_img_reader.h, sod_img_writer.h @@ -3928,7 +3928,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_210-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.210`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.211: constParameterCallback in storage_migration.c @@ -3946,7 +3946,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.211 --regex '^test_t7_211$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.211`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.212: constParameterCallback in yaml_redact.c @@ -3964,7 +3964,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.212 --regex '^test_t7_212$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.212`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.213: constParameterCallback in api_detection.c @@ -3982,7 +3982,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.213 --regex '^test_t7_213$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.213`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.214: constParameterCallback in go2rtc_api.c, go2rtc_integration.c, go2rtc_snapshot.c @@ -4000,7 +4000,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.214 --regex '^test_t7_214$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.214`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.215: constParameterCallback in onvif_detection.c @@ -4018,7 +4018,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.215 --regex '^test_t7_215$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.215`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.216: constParameterCallback in onvif_device_management.c @@ -4036,7 +4036,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.216 --regex '^test_t7_216$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.216`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.217: constParameterCallback in onvif_imaging.c @@ -4054,7 +4054,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.217 --regex '^test_t7_217$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.217`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.218: constParameterCallback in onvif_ptz.c @@ -4072,7 +4072,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.218 --regex '^test_t7_218$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.218`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.219: constParameterCallback in api_handlers_go2rtc_proxy.c @@ -4090,7 +4090,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.219 --regex '^test_t7_219$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.219`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.220: constParameterCallback in api_handlers_health.c @@ -4108,7 +4108,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.220 --regex '^test_t7_220$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.220`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.221: constParameterCallback in go2rtc_proxy_thread.c @@ -4126,7 +4126,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.221 --regex '^test_t7_221$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.221`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.222: constParameterPointer in sod_img_reader.h, sod_img_writer.h @@ -4144,7 +4144,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_222-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.222`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.223: constParameterPointer in authorization.c @@ -4162,7 +4162,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.223 --regex '^test_t7_223$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.223`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.224: constParameterPointer in mqtt_destination_client.c @@ -4180,7 +4180,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.224 --regex '^test_t7_224$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.224`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.225: constParameterPointer in db_camera_collections.c @@ -4198,7 +4198,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.225 --regex '^test_t7_225$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.225`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.226: constParameterPointer in ezxml.c @@ -4216,7 +4216,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_226-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.226`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.227: constParameterPointer in sod.c @@ -4234,7 +4234,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_227-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.227`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.228: constParameterPointer in linux_cgroup.c @@ -4252,7 +4252,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.228 --regex '^test_t7_228$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.228`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.229: constParameterPointer in nvme_provider.c @@ -4270,7 +4270,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.229 --regex '^test_t7_229$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.229`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.230: constParameterPointer in system_health_evaluator.c @@ -4288,7 +4288,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.230 --regex '^test_t7_230$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.230`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.231: constParameterPointer in go2rtc_base_path.c @@ -4306,7 +4306,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.231 --regex '^test_t7_231$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.231`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.232: constParameterPointer in strings.c @@ -4324,7 +4324,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.232 --regex '^test_t7_232$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.232`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.233: constParameterPointer in faac_encoder.c @@ -4342,7 +4342,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.233 --regex '^test_t7_233$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.233`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.234: constParameterPointer in hls_unified_thread.c @@ -4360,7 +4360,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.234 --regex '^test_t7_234$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.234`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.235: constParameterPointer in unified_detection_thread.c @@ -4378,7 +4378,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.235 --regex '^test_t7_235$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.235`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.236: constParameterPointer in go2rtc_websocket.c @@ -4396,7 +4396,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.236 --regex '^test_t7_236$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.236`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.237: constParameterPointer in recording_archive.c @@ -4414,7 +4414,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.237 --regex '^test_t7_237$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.237`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.238: constVariable in sod_img_reader.h, sod_img_writer.h @@ -4432,7 +4432,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_238-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.238`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.239: constVariable in mqtt_delivery_worker.c @@ -4450,7 +4450,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.239 --regex '^test_t7_239$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.239`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.240: constVariable in sod.c @@ -4468,7 +4468,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_240-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.240`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.241: constVariable in sod_ingenic_mxu.c @@ -4486,7 +4486,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_241-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.241`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.242: constVariablePointer in sod_img_reader.h, sod_img_writer.h @@ -4504,7 +4504,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_242-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.242`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.243: constVariablePointer in path_utils.c @@ -4522,7 +4522,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.243 --regex '^test_t7_243$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.243`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.244: constVariablePointer in db_auth.c @@ -4540,7 +4540,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.244 --regex '^test_t7_244$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.244`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.245: constVariablePointer in db_authorization.c @@ -4558,7 +4558,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.245 --regex '^test_t7_245$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.245`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.246: constVariablePointer in db_camera_tags.c @@ -4576,7 +4576,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.246 --regex '^test_t7_246$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.246`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.247: constVariablePointer in db_core.c @@ -4594,7 +4594,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.247 --regex '^test_t7_247$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.247`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.248: constVariablePointer in db_fleet_query.c @@ -4612,7 +4612,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.248 --regex '^test_t7_248$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.248`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.249: constVariablePointer in db_storage_lifecycle.c @@ -4630,7 +4630,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.249 --regex '^test_t7_249$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.249`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.250: constVariablePointer in ezxml.c @@ -4648,7 +4648,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_250-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.250`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.251: constVariablePointer in sod.c @@ -4666,7 +4666,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_251-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.251`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.252: constVariablePointer in storage_deletion.c @@ -4684,7 +4684,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.252 --regex '^test_t7_252$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.252`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.253: constVariablePointer in storage_source.c @@ -4702,7 +4702,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.253 --regex '^test_t7_253$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.253`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.254: constVariablePointer in linux_network.c, linux_process.c, linux_thermal.c @@ -4720,7 +4720,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.254 --regex '^test_t7_254$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.254`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.255: constVariablePointer in linux_device_map.c, linux_hardware.c, nvme_provider.c @@ -4738,7 +4738,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.255 --regex '^test_t7_255$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.255`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.256: constVariablePointer in system_health.c @@ -4756,7 +4756,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.256 --regex '^test_t7_256$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.256`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.257: constVariablePointer in system_health_evaluator.c @@ -4774,7 +4774,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.257 --regex '^test_t7_257$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.257`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.258: constVariablePointer in go2rtc_base_path.c @@ -4792,7 +4792,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.258 --regex '^test_t7_258$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.258`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.259: constVariablePointer in detection_model.c @@ -4810,7 +4810,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.259 --regex '^test_t7_259$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.259`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.260: constVariablePointer in go2rtc_integration.c, go2rtc_process.c @@ -4828,7 +4828,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.260 --regex '^test_t7_260$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.260`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.261: constVariablePointer in mp4_recording_core.c @@ -4846,7 +4846,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.261 --regex '^test_t7_261$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.261`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.262: constVariablePointer in mp4_recording_writer.c @@ -4864,7 +4864,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.262 --regex '^test_t7_262$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.262`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.263: constVariablePointer in stream_state_adapter.c @@ -4882,7 +4882,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.263 --regex '^test_t7_263$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.263`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.264: constVariablePointer in api_handlers_go2rtc_proxy.c @@ -4900,7 +4900,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.264 --regex '^test_t7_264$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.264`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.265: constVariablePointer in api_handlers_recordings_list.c @@ -4918,7 +4918,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.265 --regex '^test_t7_265$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.265`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.266: constVariablePointer in api_handlers_recordings_thumbnail.c @@ -4936,7 +4936,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.266 --regex '^test_t7_266$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.266`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.267: constVariablePointer in api_handlers_system_logs.c @@ -4954,7 +4954,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.267 --regex '^test_t7_267$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.267`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.268: constVariablePointer in api_handlers_timeline.c @@ -4972,7 +4972,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.268 --regex '^test_t7_268$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.268`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.269: constVariablePointer in api_handlers_users_backend_agnostic.c @@ -4990,7 +4990,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.269 --regex '^test_t7_269$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.269`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.270: constVariablePointer in httpd_utils.c @@ -5008,7 +5008,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.270 --regex '^test_t7_270$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.270`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.271: duplicateAssignExpression in sod.c @@ -5026,7 +5026,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_271-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.271`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.272: duplicateCondition in motion_detection.c @@ -5044,7 +5044,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.272 --regex '^test_t7_272$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.272`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.273: js/unused-local-variable in LanguageSelector.jsx @@ -5065,7 +5065,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.273/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'js/unused-local-variable'"'"'], "targeted diagnostic remains"'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.273`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.274: knownConditionTrueFalse in sod_img_reader.h @@ -5083,7 +5083,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_274-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.274`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.275: knownConditionTrueFalse in event_router.c @@ -5101,7 +5101,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.275 --regex '^test_t7_275$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.275`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.276: knownConditionTrueFalse in mqtt_event_adapter.c @@ -5119,7 +5119,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.276 --regex '^test_t7_276$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.276`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.277: knownConditionTrueFalse in db_storage_targets.c @@ -5137,7 +5137,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.277 --regex '^test_t7_277$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.277`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.278: knownConditionTrueFalse in ezxml.c @@ -5155,7 +5155,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_278-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.278`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.279: knownConditionTrueFalse in sod.c @@ -5173,7 +5173,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_279-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.279`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.280: knownConditionTrueFalse in linux_process.c @@ -5191,7 +5191,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.280 --regex '^test_t7_280$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.280`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.281: knownConditionTrueFalse in health_helper_runner.c @@ -5209,7 +5209,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.281 --regex '^test_t7_281$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.281`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.282: knownConditionTrueFalse in api_handlers_imaging.c @@ -5227,7 +5227,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.282 --regex '^test_t7_282$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.282`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.283: redundantCondition in sod_img_reader.h @@ -5245,7 +5245,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_283-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.283`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.284: redundantInitialization in sod_img_reader.h @@ -5263,7 +5263,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_284-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.284`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.285: redundantInitialization in db_authorization.c @@ -5281,7 +5281,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.285 --regex '^test_t7_285$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.285`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.286: redundantInitialization in recording_path.c @@ -5299,7 +5299,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.286 --regex '^test_t7_286$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.286`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.287: redundantPointerOp in sod.c @@ -5317,7 +5317,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_287-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.287`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.288: shadowFunction in db_storage_targets.c @@ -5335,7 +5335,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.288 --regex '^test_t7_288$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.288`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.289: shadowFunction in stream_manager.c @@ -5353,7 +5353,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.289 --regex '^test_t7_289$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.289`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.290: shadowVariable in config.h @@ -5371,7 +5371,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.290 --regex '^test_t7_290$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.290`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.291: unpreciseMathCall in sod.c @@ -5389,7 +5389,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_291-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.291`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.292: unreadVariable in sod_img_reader.h @@ -5407,7 +5407,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_292-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.292`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.293: unreadVariable in mqtt_client.c @@ -5425,7 +5425,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.293 --regex '^test_t7_293$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.293`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.294: unreadVariable in sod.c @@ -5443,7 +5443,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_294-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.294`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.295: unreadVariable in onvif_ptz.c @@ -5461,7 +5461,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.295 --regex '^test_t7_295$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.295`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.296: unsignedLessThanZero in sod.c @@ -5479,7 +5479,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_296-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.296`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.297: unusedStructMember in mqtt_destination_client.c @@ -5497,7 +5497,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.297 --regex '^test_t7_297$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.297`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.298: unusedStructMember in sod.c @@ -5515,7 +5515,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_298-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.298`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.299: unusedStructMember in sod_detection.c @@ -5533,7 +5533,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.299 --regex '^test_t7_299$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.299`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.300: uselessAssignmentArg in sod.c @@ -5551,7 +5551,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_300-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.300`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.301: variableScope in sod_img_reader.h, sod_img_writer.h @@ -5569,7 +5569,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_301-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.301`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.302: variableScope in db_detection_engines.c @@ -5587,7 +5587,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.302 --regex '^test_t7_302$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.302`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.303: variableScope in db_lpr_reads.c @@ -5605,7 +5605,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.303 --regex '^test_t7_303$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.303`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.304: variableScope in db_recordings.c @@ -5623,7 +5623,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.304 --regex '^test_t7_304$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.304`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.305: variableScope in ezxml.c @@ -5641,7 +5641,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_305-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.305`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.306: variableScope in sod.c @@ -5659,7 +5659,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 -m json.tool quality/reviews/t7_306-upstream.json` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.306`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.307: variableScope in storage_deletion.c @@ -5677,7 +5677,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.307 --regex '^test_t7_307$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.307`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.308: variableScope in storage_migration.c @@ -5695,7 +5695,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.308 --regex '^test_t7_308$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.308`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.309: variableScope in storage_placement.c @@ -5713,7 +5713,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.309 --regex '^test_t7_309$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.309`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.310: variableScope in storage_s3.c @@ -5731,7 +5731,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.310 --regex '^test_t7_310$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.310`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.311: variableScope in linux_cgroup.c, linux_thermal.c @@ -5749,7 +5749,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.311 --regex '^test_t7_311$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.311`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.312: variableScope in stream_metrics.c @@ -5767,7 +5767,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.312 --regex '^test_t7_312$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.312`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.313: variableScope in api_detection.c @@ -5785,7 +5785,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.313 --regex '^test_t7_313$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.313`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.314: variableScope in hls_directory.c @@ -5803,7 +5803,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.314 --regex '^test_t7_314$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.314`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.315: variableScope in recording_transcode.c @@ -5821,7 +5821,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.315 --regex '^test_t7_315$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.315`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.316: variableScope in unified_detection_thread.c @@ -5839,7 +5839,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `python3 scripts/quality/run-native.py --task T7.316 --regex '^test_t7_316$'` - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.316`; inspect the raw T1 report and trace the caller. - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.317: Authenticate before exposing stream existence @@ -5856,7 +5856,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `node scripts/quality/run-integration.mjs --task T7.317 --project api --grep @t7_317` - `npm run typecheck:tests` - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.318: Correct documented Streams wire examples @@ -5872,7 +5872,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - **validation**: - `python3 scripts/check_docs_links.py` - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.319: Remove query credentials from viewer URLs @@ -5889,7 +5889,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `node scripts/quality/run-integration.mjs --task T7.319 --project api --grep @t7_319` - `npm run typecheck:tests` - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.320: Reject non-object stream updates @@ -5906,7 +5906,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `node scripts/quality/run-integration.mjs --task T7.320 --project api --grep @t7_320` - `npm run typecheck:tests` - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.321: Reject wrong-typed stream fields @@ -5923,7 +5923,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `node scripts/quality/run-integration.mjs --task T7.321 --project api --grep @t7_321` - `npm run typecheck:tests` - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.322: Validate bounded stream numeric fields @@ -5940,7 +5940,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `node scripts/quality/run-integration.mjs --task T7.322 --project api --grep @t7_322` - `npm run typecheck:tests` - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.323: Validate complete boolean schedules @@ -5957,7 +5957,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `node scripts/quality/run-integration.mjs --task T7.323 --project api --grep @t7_323` - `npm run typecheck:tests` - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.324: Address encoded slash names without aliasing @@ -5974,7 +5974,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `node scripts/quality/run-integration.mjs --task T7.324 --project api --grep @t7_324` - `npm run typecheck:tests` - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.325: Enforce decoded stream name limits consistently @@ -5991,7 +5991,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `node scripts/quality/run-integration.mjs --task T7.325 --project api --grep @t7_325` - `npm run typecheck:tests` - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.326: Handle missing fleet inventory rows consistently @@ -6008,7 +6008,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `node scripts/quality/run-integration.mjs --task T7.326 --project api --grep @t7_326` - `npm run typecheck:tests` - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.327: Preserve omitted ONVIF update state @@ -6025,7 +6025,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `node scripts/quality/run-integration.mjs --task T7.327 --project api --grep @t7_327` - `npm run typecheck:tests` - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.328: Make privacy mutations atomic and report failure @@ -6042,7 +6042,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `node scripts/quality/run-integration.mjs --task T7.328 --project api --grep @t7_328` - `npm run typecheck:tests` - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.329: Expose demo mode for authenticated users @@ -6059,7 +6059,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `node scripts/quality/run-integration.mjs --task T7.329 --project api --grep @t7_329` - `npm run typecheck:tests` - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.330: Reject overlong stream strings without truncation @@ -6076,7 +6076,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `node scripts/quality/run-integration.mjs --task T7.330 --project api --grep @t7_330` - `npm run typecheck:tests` - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.331: Bound ONVIF edit validation latency @@ -6093,7 +6093,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `node scripts/quality/run-integration.mjs --task T7.331 --project api --grep @t7_331` - `npm run typecheck:tests` - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.332: Preserve detection threshold round trips @@ -6110,7 +6110,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `node scripts/quality/run-integration.mjs --task T7.332 --project api --grep @t7_332` - `npm run typecheck:tests` - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.333: Specify password omission and explicit clear semantics @@ -6127,7 +6127,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `node scripts/quality/run-integration.mjs --task T7.333 --project api --grep @t7_333` - `npm run typecheck:tests` - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.334: Reconcile Streams contracts after behavioral fixes @@ -6146,7 +6146,7 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - `node --test tests/quality/contracts.test.mjs` - `npm --prefix web run typecheck` - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: ### T7.335: Resolve proposed ownership and exception review records @@ -6162,5 +6162,5 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 - **validation**: - `python3 -m json.tool quality/reviews/exception-ownership.json` - **status**: Not Completed -- **log**: +- **log**: - **files edited/created**: diff --git a/quality/evidence/T7.md b/quality/evidence/T7.md index eceb36f25..c01ebb4d8 100644 --- a/quality/evidence/T7.md +++ b/quality/evidence/T7.md @@ -92,7 +92,8 @@ explicit T33 fence pass. No production fixes are attributed to this check. Eight temporary corrupted-map controls were all rejected: missing finding, duplicate finding, unknown dependency, cycle, missing closure dependency, unordered writer, broad ownership, and invented approval. Temporary files were -removed. JSON parse and staged whitespace checks also pass. +removed. JSON parse passed. The initial staged whitespace check found blank-log +trailing spaces; these were removed and the final whitespace check passed. The coordinator must rerun this check after insertion and inspect newly added cross-task edges. Future inventory edits intentionally require reconciliation From 4a390c02e0c65375cac936ba62fdfa4d6d26395c Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Sat, 31 Oct 2026 03:38:02 -0400 Subject: [PATCH 015/230] T7: verify inserted plan dependencies against remediation map --- quality/evidence/T7-check.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/quality/evidence/T7-check.py b/quality/evidence/T7-check.py index ed5fbf39f..9168fde74 100644 --- a/quality/evidence/T7-check.py +++ b/quality/evidence/T7-check.py @@ -10,6 +10,7 @@ parser = argparse.ArgumentParser() parser.add_argument('--map', default='quality/remediation-map.json') parser.add_argument('--plan', default='engineering-foundation-plan.md') +parser.add_argument('--require-integrated', action='store_true') args = parser.parse_args() data = json.loads(pathlib.Path(args.map).read_text()) invpath = pathlib.Path('quality/findings.json') @@ -29,6 +30,15 @@ records = re.findall(r'^### (T[\d.]+):[^\n]*\n- \*\*depends_on\*\*: \[([^\]]*)\]', text, re.M) assert len(records) == len({r[0] for r in records}), 'duplicate plan IDs' graph = {name: [v.strip() for v in deps.split(',') if v.strip()] for name, deps in records} +integrated = any(name.startswith('T7.') for name in graph) +if args.require_integrated: + assert integrated, 'remediation records not inserted into plan' +if integrated: + assert set(tasks).issubset(graph), 'partially inserted remediation expansion' + for name, task in tasks.items(): + assert set(graph[name]) == set(task['depends_on']), ('plan/map dependency mismatch', name) + for name, dependencies in data['gate_dependency_additions'].items(): + assert set(dependencies).issubset(graph[name]), ('gate additions not inserted', name) for task in tasks.values(): graph[task['id']] = task['depends_on'][:] assert len(task['source_paths']) <= 6, (task['id'], 'implementation cluster too large') From 56f730043b874ba2e03fe3d5e2abf05ef8c748fe Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Sat, 31 Oct 2026 03:38:53 -0400 Subject: [PATCH 016/230] T9: establish strict test compiler and bounded repair tasks --- quality/evidence/T9-expansion.md | 55 ++++++++++++++++++++++++++++++++ quality/evidence/T9.md | 21 ++++++++++++ tests/tsconfig.json | 18 +++++++++++ 3 files changed, 94 insertions(+) create mode 100644 quality/evidence/T9-expansion.md create mode 100644 quality/evidence/T9.md create mode 100644 tests/tsconfig.json diff --git a/quality/evidence/T9-expansion.md b/quality/evidence/T9-expansion.md new file mode 100644 index 000000000..18386806d --- /dev/null +++ b/quality/evidence/T9-expansion.md @@ -0,0 +1,55 @@ +# T9 expansion proposal + +Compiler RED at `17de8155`: `npm run typecheck:tests` exits 2 with 38 +diagnostics in 12 files (`build/eng-artifacts/T9/red.log`). Playwright discovery +before repairs: 213 tests in 28 files, exit 0. No server or load started. + +T9 provides `tests/tsconfig.json` with strict, noUncheckedIndexedAccess, +isolatedModules, noEmit, ES2022/DOM and explicit Node types. It includes all +integration/load TS and the Playwright configuration. No error-bearing file is +excluded. Compiler diagnostics serve as the RED verification contract; existing +runtime assertions are preserved. These are type repairs, not an application +migration. Existing legacy `any` uses are not claimed eliminated globally. + +Insert the following task records into the plan; add **T9.4** to both T13 and +T15 dependencies. Graph: `T9 -> T9.1 -> T9.2 -> T9.3 -> T9.4`. This serial chain +reserves one root-typecheck validation lease and gives an integrated final gate. +No schema/package/native/shared setup ownership overlaps are introduced. + +### T9.1: Repair load-test and page-helper type boundaries +- **depends_on**: [T9] +- **agent_type**: worker +- **ownership**: `tests/load/config.ts`, `tests/load/reporter.ts`, `tests/load/runner.ts`, `tests/integration/pages/StreamsPage.ts`, `tests/integration/pages/TimelinePage.ts`, `quality/evidence/T9.1.md`. +- **description**: Repair three array-index return types, two unknown caught errors, and date extraction. Use checked existence/narrowing, preserve behavior for valid inputs, and reject impossible empty selections explicitly. No load execution or test removal. +- **acceptance_criteria**: All six initial diagnostics in these five files disappear without broad declarations, ts-ignore, or new `any`; valid CLI/scenario/report/page behavior stays intact. +- **validation**: `npm run typecheck:tests` (initial 38 diagnostics; this cluster must reach zero while unrelated clusters remain RED); Node assertions for parseArgs valid/missing values and zero-request runLoadTest without network; final whole-config GREEN owned by T9.4. +- **status**: Not Completed + +### T9.2: Type media DOM and mocked routes +- **depends_on**: [T9.1] +- **agent_type**: worker +- **ownership**: `tests/integration/specs/investigation.ui.spec.ts`, `tests/integration/specs/recordings.ui.spec.ts`, `tests/integration/specs/streams.ui.spec.ts`, `tests/integration/specs/timeline.ui.spec.ts`, `quality/evidence/T9.2.md`. +- **description**: Narrow selected video elements to the HTMLVideoElement contract; retain controls/readyState/play/pause assertions. Type mocked route setup parameters as Playwright Page so handlers infer Route. Use fixed ISO date slicing for non-optional date strings. Handle controlsList as a narrow browser capability (DOMTokenList) because it is not part of TypeScript's portable HTMLMediaElement interface. +- **acceptance_criteria**: All 23 original diagnostics across these four files disappear; all runtime test definitions/assertions remain present; no ambient browser-wide `any` added. +- **validation**: `npm run typecheck:tests` with zero cluster errors; compare Playwright --list test identities to baseline (ignore moved line numbers); final full GREEN in T9.4. +- **status**: Not Completed + +### T9.3: Preserve timeline/snapshot fixture bounds +- **depends_on**: [T9.2] +- **agent_type**: worker +- **ownership**: `tests/integration/specs/timeline-boundary.ui.spec.ts`, `tests/integration/specs/stream-snapshot-requests.ui.spec.ts`, `quality/evidence/T9.3.md`. +- **description**: Validate parsed local date/time components and nonempty segment fixtures; narrow fixed fixture entries and captured URLs through explicit checks or known tuple definitions. Preserve existing route responses and snapshot/timeline assertions, rejecting malformed fixture setup instead of changing tests to pass. +- **acceptance_criteria**: All eight original diagnostics in these two files disappear without optional-default values hiding missing test data; test identities remain unchanged. +- **validation**: `npm run typecheck:tests` with zero cluster errors; Playwright --list identities unchanged; final full GREEN in T9.4. +- **status**: Not Completed + +### T9.4: Integrate the legacy JS test boundary and verify coverage +- **depends_on**: [T9.3] +- **agent_type**: local +- **ownership**: `tests/tsconfig.json`, `tests/integration/recordings-url-utils.ui.spec.ts`, optional narrowly scoped test interop helper under `tests/integration/fixtures/`, `quality/evidence/T9.4.md`, `quality/evidence/T9.md`. +- **description**: Resolve the existing recordings JS import without wildcard-any modules or hiding test files. Keep the exact legacy JS boundary explicit and runtime-checked where values cross into the test. Any incremental allowJs/checkJs setting must inventory the exact imported application files as still unchecked and assign retirement to T34; it is not migration completion. Preserve the four existing URL utility test definitions and assertions. Reconcile compiler coverage and discovery across all clusters. +- **acceptance_criteria**: Root typecheck is GREEN for all existing integration/load TS and configuration; no unchecked test file/excluded diagnostic; 213 Playwright tests in 28 files remain discovered; no load traffic sent. Legacy application JS remains explicitly accounted for in evidence. +- **validation**: `npm run typecheck:tests`; `npx playwright test --list --reporter=list`; inspect `tsc --listFilesOnly -p tests/tsconfig.json` against `rg --files tests/integration tests/load`; run the four URL utility tests with a temporary isolated Playwright config disabling global setup/teardown (they need neither browser launch nor server); all results captured under `build/eng-artifacts/T9/`. +- **status**: Not Completed + +Expansion is pending coordinator graph/ownership approval before child edits. diff --git a/quality/evidence/T9.md b/quality/evidence/T9.md new file mode 100644 index 000000000..0b46590b9 --- /dev/null +++ b/quality/evidence/T9.md @@ -0,0 +1,21 @@ +# T9 — Strict integration/load test compiler and bounded repairs + +At `17de8155`, added `tests/tsconfig.json` with strict, +noUncheckedIndexedAccess, isolatedModules and noEmit. All existing integration +and load TypeScript plus playwright.config.ts are included, independently of +Playwright transpilation and Node type stripping. No packages changed. + +RED: `npm run typecheck:tests` exited 2 with 38 diagnostics across 12 files. +Raw output: `build/eng-artifacts/T9/red.log`. Discovery before changes: +`npx playwright test --list --reporter=list` exited 0, **213 tests in 28 files**. +No server setup or load traffic ran. + +The compiler errors exceed one bounded cluster. The coordinator validated and +inserted the `T9 -> T9.1 -> T9.2 -> T9.3 -> T9.4` expansion from +`quality/evidence/T9-expansion.md`, with T9.4 fencing T13 and T15. The compiler +errors are the RED contract; child task evidence records repairs. T9 establishes +configuration and inventory; full GREEN is required at T9.4, not claimed here. + +Existing explicit `any` annotations elsewhere in the legacy test suite are not +claimed removed; no broad ambient declaration, ignored diagnostic or excluded +test is added to make the compiler pass. diff --git a/tests/tsconfig.json b/tests/tsconfig.json new file mode 100644 index 000000000..090f53934 --- /dev/null +++ b/tests/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "moduleResolution": "Bundler", + "allowImportingTsExtensions": true, + "strict": true, + "noUncheckedIndexedAccess": true, + "isolatedModules": true, + "noEmit": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "types": ["node"] + }, + "include": ["integration/**/*.ts", "load/**/*.ts", "../playwright.config.ts"], + "exclude": ["../node_modules", "../web/node_modules", "../build"] +} From d36e4e6510ea72320d4c0e520841bdbeb8608ba6 Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Sat, 31 Oct 2026 03:39:28 -0400 Subject: [PATCH 017/230] T9.1: check load and page-helper type boundaries --- quality/evidence/T9.1.md | 26 +++++++++++++++++++++++++ tests/integration/pages/StreamsPage.ts | 4 ++-- tests/integration/pages/TimelinePage.ts | 2 +- tests/load/config.ts | 6 ++++-- tests/load/reporter.ts | 4 +++- tests/load/runner.ts | 6 ++++-- 6 files changed, 40 insertions(+), 8 deletions(-) create mode 100644 quality/evidence/T9.1.md diff --git a/quality/evidence/T9.1.md b/quality/evidence/T9.1.md new file mode 100644 index 000000000..5d2d5e21b --- /dev/null +++ b/quality/evidence/T9.1.md @@ -0,0 +1,26 @@ +# T9.1 — Load and page-helper type boundaries + +RED: six diagnostics across five owned files in `T9/red.log`. GREEN for this +cluster: zero diagnostics; the full compiler still exits 2 for 32 errors in +later clusters (`T9/after-T9.1.log`). All logs are under +`build/eng-artifacts/`. + +- CLI argument reading checks the actual indexed value before returning it. +- Percentile selection and weighted-scenario fallback check indexed values + instead of claiming they can never be undefined. Existing empty-report and + empty-scenario behavior is retained. +- `Error.cause` uses ES2022's native type; no `any` cast is needed. +- Stream save retry diagnostics narrow caught values to Error or stringify them. +- ISO date extraction uses the guaranteed first ten characters. + +Validation: `npm run typecheck:tests`; inspect the resulting diagnostic file for +all five owned paths (zero). A Node strip-types assertion script imported +`parseArgs`, `runLoadTest` and `printReport` and checked valid CLI values, missing +value rejection, a preserved empty-string CLI value, empty scenario rejection, +zero-request execution, and empty/singleton reporting. `globalThis.fetch` was +replaced with a throwing sentinel during the zero-request/report checks, so no +load/network requests were sent. The script passed. Node emitted its existing +MODULE_TYPELESS_PACKAGE_JSON warning; package module mode was not changed. + +No test definition/assertion was removed. Final discovery and whole-config GREEN +belong to T9.4. No server/browser/media run was performed for this cluster. diff --git a/tests/integration/pages/StreamsPage.ts b/tests/integration/pages/StreamsPage.ts index 35ccd9257..6aa743a0d 100644 --- a/tests/integration/pages/StreamsPage.ts +++ b/tests/integration/pages/StreamsPage.ts @@ -223,7 +223,7 @@ export class StreamsPage extends BasePage { console.log(`Received response with status: ${response.status()}`); } catch (e) { // First attempt failed - retry the click once in case it didn't register - console.warn(`First save attempt failed for ${config.name}, retrying: ${e.message}`); + console.warn(`First save attempt failed for ${config.name}, retrying: ${e instanceof Error ? e.message : String(e)}`); try { await this.saveButton.scrollIntoViewIfNeeded(); [response] = await Promise.all([ @@ -245,7 +245,7 @@ export class StreamsPage extends BasePage { }).catch(() => 'Unable to capture logs'); console.log('Browser console logs:', logs); - throw new Error(`Failed to create stream: ${retryError.message}`); + throw new Error(`Failed to create stream: ${retryError instanceof Error ? retryError.message : String(retryError)}`); } } diff --git a/tests/integration/pages/TimelinePage.ts b/tests/integration/pages/TimelinePage.ts index 752385d58..23834834c 100644 --- a/tests/integration/pages/TimelinePage.ts +++ b/tests/integration/pages/TimelinePage.ts @@ -205,7 +205,7 @@ export class TimelinePage extends BasePage { * Get today's date in YYYY-MM-DD format */ static getTodayDate(): string { - return new Date().toISOString().split('T')[0]; + return new Date().toISOString().slice(0, 10); } /** diff --git a/tests/load/config.ts b/tests/load/config.ts index 9bb681d09..df77dd273 100644 --- a/tests/load/config.ts +++ b/tests/load/config.ts @@ -93,8 +93,10 @@ export function parseArgs(argv: string[]): LoadTestConfig { for (let i = 2; i < argv.length; i++) { const arg = argv[i]; const next = (): string => { - if (i + 1 >= argv.length) throw new Error(`Missing value for ${arg}`); - return argv[++i]; + const value = argv[i + 1]; + if (value === undefined) throw new Error(`Missing value for ${arg}`); + i++; + return value; }; switch (arg) { diff --git a/tests/load/reporter.ts b/tests/load/reporter.ts index 8c3f52d24..b28abafd2 100644 --- a/tests/load/reporter.ts +++ b/tests/load/reporter.ts @@ -15,7 +15,9 @@ import type { LoadTestConfig, RequestResult } from './config.ts'; function percentile(sorted: number[], p: number): number { if (sorted.length === 0) return 0; const idx = Math.ceil((p / 100) * sorted.length) - 1; - return sorted[Math.max(0, idx)]; + const value = sorted[Math.max(0, idx)]; + if (value === undefined) throw new RangeError(`Percentile ${p} is outside the sample range`); + return value; } function fmt(ms: number): string { diff --git a/tests/load/runner.ts b/tests/load/runner.ts index 41ea98fd8..9119a2edf 100644 --- a/tests/load/runner.ts +++ b/tests/load/runner.ts @@ -24,7 +24,9 @@ function pickScenario(scenarios: Scenario[]): Scenario { r -= sc.weight ?? 1; if (r <= 0) return sc; } - return scenarios[scenarios.length - 1]; + const lastScenario = scenarios[scenarios.length - 1]; + if (!lastScenario) throw new Error('Cannot select from an empty scenario list'); + return lastScenario; } // --------------------------------------------------------------------------- @@ -78,7 +80,7 @@ async function executeRequest( }; } catch (err: unknown) { const latencyMs = performance.now() - start; - const message = err instanceof Error ? `${err.message} [${(err as any).cause ?? ''}]` : String(err); + const message = err instanceof Error ? `${err.message} [${err.cause ?? ''}]` : String(err); return { scenario: scenario.name, method: scenario.method, From 713b30255405a07f8d3c8cce6f99e2f12feaedbf Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Sat, 31 Oct 2026 03:39:31 -0400 Subject: [PATCH 018/230] docs(quality): prepare concrete dependency and exception reviews --- quality/evidence/T7.10.md | 30 + quality/evidence/T7.335.md | 18 + quality/evidence/T7.8.md | 30 + quality/evidence/T7.9.md | 30 + quality/reviews/exception-ownership.json | 7014 ++++++++++++++++++++++ 5 files changed, 7122 insertions(+) create mode 100644 quality/evidence/T7.10.md create mode 100644 quality/evidence/T7.335.md create mode 100644 quality/evidence/T7.8.md create mode 100644 quality/evidence/T7.9.md create mode 100644 quality/reviews/exception-ownership.json diff --git a/quality/evidence/T7.10.md b/quality/evidence/T7.10.md new file mode 100644 index 000000000..abcc7c71c --- /dev/null +++ b/quality/evidence/T7.10.md @@ -0,0 +1,30 @@ +# T7.10: deepmerge dependency review + +Status: blocked on compatible upstream release or explicit risk acceptance. +No package override, downgrade, production disposition or approval was applied. + +The live npm registry and [upstream advisory](https://github.com/advisories/GHSA-gcqx-w48m-w2h4) +were checked on 2026-10-31. Current published version 4.3.1 is vulnerable; no patched release. Jest 30.5.2 still requests ^4.3.1. + +Current audit reports are retained under `build/eng-artifacts/dependency-review/`. +The web production audit returns zero findings; the web development audit has +32 affected dependency nodes (31 moderate, one low), representing three direct +advisories plus propagated parent exposure. Root development tooling reports +three moderate nodes, from the same minimatch advisory via openapi-typescript. +Counts are not substituted for finding identity. The root occurrence is new +since T1 and must be reconciled explicitly by T33. + +`npm explain` established the parent ranges. npm's proposed forced downgrades +would violate the preserved toolchain scope and do not provide an appropriate +compatible fix. No mutation was made merely to reduce warning counts. + +A proposed owner/mitigation/review date is in +`quality/reviews/exception-ownership.json`; the proposed expiry is 2026-11-30. +It is not effective until explicitly approved. T15 remains blocked on these +remediation tasks until a compatible fix or reviewed exception is recorded. + +`reason_not_testable`: upstream version/exposure investigation; no behavioral +implementation. Validation: live registry versions, advisory affected/patched +ranges, installed dependency tree and full/production npm audit JSON parsing. +Existing T8 validation already covers 571 tests and both builds on this graph; +those passes do not resolve the vulnerability. diff --git a/quality/evidence/T7.335.md b/quality/evidence/T7.335.md new file mode 100644 index 000000000..c13c232dc --- /dev/null +++ b/quality/evidence/T7.335.md @@ -0,0 +1,18 @@ +# T7.335: Exception review packet + +Status: pending maintainer decisions. This task is not complete. + +`quality/reviews/exception-ownership.json` lists all 575 proposed inventory +exceptions, four proposed scanner gaps, and three reviewed development-tool +advisories. Each record preserves identity, proposed owner/reason/date, and an +explicit pending state. No approvals or findings dispositions were invented. + +The three dependency proposals were checked against current npm metadata and +upstream advisories on 2026-10-31. Compatible patched versions are unavailable +in the existing parent ranges; deepmerge has no published patched release. +Proposed mitigation and 2026-11-30 expiry are concrete review inputs, not +accepted risk. The broader 575 proposals still need site-specific review. + +Verification: JSON parse and count/identity reconciliation against +quality/findings.json and quality/findings-policy.json. No approval is inferred +from the user's authorization to implement the plan or physical-test deferral. diff --git a/quality/evidence/T7.8.md b/quality/evidence/T7.8.md new file mode 100644 index 000000000..42fc8c47b --- /dev/null +++ b/quality/evidence/T7.8.md @@ -0,0 +1,30 @@ +# T7.8: glob dependency review + +Status: blocked on compatible upstream release or explicit risk acceptance. +No package override, downgrade, production disposition or approval was applied. + +The live npm registry and [upstream advisory](https://github.com/advisories/GHSA-3g3m-2fjr-6pw4) +were checked on 2026-10-31. Jest currently requests ^10.5.0 and Sentry bundler ^13.0.6; even Jest 30.5.2 requests ^13.0.6. Patched 14.0.2 is outside these ranges. + +Current audit reports are retained under `build/eng-artifacts/dependency-review/`. +The web production audit returns zero findings; the web development audit has +32 affected dependency nodes (31 moderate, one low), representing three direct +advisories plus propagated parent exposure. Root development tooling reports +three moderate nodes, from the same minimatch advisory via openapi-typescript. +Counts are not substituted for finding identity. The root occurrence is new +since T1 and must be reconciled explicitly by T33. + +`npm explain` established the parent ranges. npm's proposed forced downgrades +would violate the preserved toolchain scope and do not provide an appropriate +compatible fix. No mutation was made merely to reduce warning counts. + +A proposed owner/mitigation/review date is in +`quality/reviews/exception-ownership.json`; the proposed expiry is 2026-11-30. +It is not effective until explicitly approved. T15 remains blocked on these +remediation tasks until a compatible fix or reviewed exception is recorded. + +`reason_not_testable`: upstream version/exposure investigation; no behavioral +implementation. Validation: live registry versions, advisory affected/patched +ranges, installed dependency tree and full/production npm audit JSON parsing. +Existing T8 validation already covers 571 tests and both builds on this graph; +those passes do not resolve the vulnerability. diff --git a/quality/evidence/T7.9.md b/quality/evidence/T7.9.md new file mode 100644 index 000000000..4148aa40e --- /dev/null +++ b/quality/evidence/T7.9.md @@ -0,0 +1,30 @@ +# T7.9: minimatch dependency review + +Status: blocked on compatible upstream release or explicit risk acceptance. +No package override, downgrade, production disposition or approval was applied. + +The live npm registry and [upstream advisory](https://github.com/advisories/GHSA-g3hv-75wg-m249) +were checked on 2026-10-31. Web lint/test/build parents and root openapi-typescript generator request older major ranges. Current ESLint 9.39.5 still requests ^3.1.5; openapi-typescript 7.13.0 is current. + +Current audit reports are retained under `build/eng-artifacts/dependency-review/`. +The web production audit returns zero findings; the web development audit has +32 affected dependency nodes (31 moderate, one low), representing three direct +advisories plus propagated parent exposure. Root development tooling reports +three moderate nodes, from the same minimatch advisory via openapi-typescript. +Counts are not substituted for finding identity. The root occurrence is new +since T1 and must be reconciled explicitly by T33. + +`npm explain` established the parent ranges. npm's proposed forced downgrades +would violate the preserved toolchain scope and do not provide an appropriate +compatible fix. No mutation was made merely to reduce warning counts. + +A proposed owner/mitigation/review date is in +`quality/reviews/exception-ownership.json`; the proposed expiry is 2026-11-30. +It is not effective until explicitly approved. T15 remains blocked on these +remediation tasks until a compatible fix or reviewed exception is recorded. + +`reason_not_testable`: upstream version/exposure investigation; no behavioral +implementation. Validation: live registry versions, advisory affected/patched +ranges, installed dependency tree and full/production npm audit JSON parsing. +Existing T8 validation already covers 571 tests and both builds on this graph; +those passes do not resolve the vulnerability. diff --git a/quality/reviews/exception-ownership.json b/quality/reviews/exception-ownership.json new file mode 100644 index 000000000..76ec6539c --- /dev/null +++ b/quality/reviews/exception-ownership.json @@ -0,0 +1,7014 @@ +{ + "schema_version": 1, + "producer": "T7.335", + "reviewed_on": "2026-10-31", + "status": "awaiting_maintainer_review", + "scope": "Proposals only. No production policy/inventory approvals changed.", + "counts": { + "inventory_exceptions": 575, + "scanner_gaps": 4, + "dependency_advisories": 3 + }, + "records": [ + { + "kind": "finding", + "id": "CODEQL-78", + "fingerprint": "codeql-alert:78", + "requested_owner": "maintainers/video", + "disposition": "exception-dismissed-false-positive", + "exposure": "network: camera/media input path", + "reason_proposed": "dismissed 2026-03-02 as 'false positive' (maintainer rationale: plain HTTP is intended for local/container go2rtc/camera endpoints); NOT in current analysis: path not compiled in CodeQL build (ENABLE_GO2RTC=OFF) or code changed; re-verify when scope widens", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CODEQL-77", + "fingerprint": "codeql-alert:77", + "requested_owner": "maintainers/video", + "disposition": "exception-dismissed-false-positive", + "exposure": "network: camera/media input path", + "reason_proposed": "dismissed 2026-03-02 as 'false positive' (maintainer rationale: plain HTTP is intended for local/container go2rtc/camera endpoints); NOT in current analysis: path not compiled in CodeQL build (ENABLE_GO2RTC=OFF) or code changed; re-verify when scope widens", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CODEQL-76", + "fingerprint": "codeql-alert:76", + "requested_owner": "maintainers/video", + "disposition": "exception-dismissed-false-positive", + "exposure": "network: camera/media input path", + "reason_proposed": "dismissed 2026-03-02 as 'false positive' (maintainer rationale: plain HTTP is intended for local/container go2rtc/camera endpoints); NOT in current analysis: path not compiled in CodeQL build (ENABLE_GO2RTC=OFF) or code changed; re-verify when scope widens", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CODEQL-75", + "fingerprint": "codeql-alert:75", + "requested_owner": "maintainers/video", + "disposition": "exception-dismissed-false-positive", + "exposure": "network: camera/media input path", + "reason_proposed": "dismissed 2026-03-02 as 'false positive' (maintainer rationale: plain HTTP is intended for local/container go2rtc/camera endpoints); NOT in current analysis: path not compiled in CodeQL build (ENABLE_GO2RTC=OFF) or code changed; re-verify when scope widens", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CODEQL-73", + "fingerprint": "codeql-alert:73", + "requested_owner": "maintainers/web", + "disposition": "exception-dismissed-false-positive", + "exposure": "network: HTTP API / web server", + "reason_proposed": "dismissed 2026-03-02 as 'false positive' (maintainer rationale: plain HTTP is intended for local/container go2rtc/camera endpoints); NOT in current analysis: path not compiled in CodeQL build (ENABLE_GO2RTC=OFF) or code changed; re-verify when scope widens", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CODEQL-71", + "fingerprint": "codeql-alert:71", + "requested_owner": "maintainers/video", + "disposition": "exception-dismissed-false-positive", + "exposure": "network: camera/media input path", + "reason_proposed": "dismissed 2026-03-02 as 'false positive' (maintainer rationale: plain HTTP is intended for local/container go2rtc/camera endpoints); NOT in current analysis: path not compiled in CodeQL build (ENABLE_GO2RTC=OFF) or code changed; re-verify when scope widens", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CODEQL-70", + "fingerprint": "codeql-alert:70", + "requested_owner": "maintainers/video", + "disposition": "exception-dismissed-false-positive", + "exposure": "network: camera/media input path", + "reason_proposed": "dismissed 2026-03-02 as 'false positive' (maintainer rationale: plain HTTP is intended for local/container go2rtc/camera endpoints); NOT in current analysis: path not compiled in CodeQL build (ENABLE_GO2RTC=OFF) or code changed; re-verify when scope widens", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CODEQL-69", + "fingerprint": "codeql-alert:69", + "requested_owner": "maintainers/video", + "disposition": "exception-dismissed-false-positive", + "exposure": "network: camera/media input path", + "reason_proposed": "dismissed 2026-03-02 as 'false positive' (maintainer rationale: plain HTTP is intended for local/container go2rtc/camera endpoints); NOT in current analysis: path not compiled in CodeQL build (ENABLE_GO2RTC=OFF) or code changed; re-verify when scope widens", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CODEQL-59", + "fingerprint": "codeql:cpp/non-https-url:src/video/onvif_discovery.c:366d15987af98d51:1", + "requested_owner": "maintainers/video", + "disposition": "exception-dismissed-false-positive", + "exposure": "network: camera/media input path", + "reason_proposed": "dismissed 2026-03-02 as 'false positive' (maintainer rationale: plain HTTP is intended for local/container go2rtc/camera endpoints); still reported by current analysis", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CODEQL-20", + "fingerprint": "codeql-alert:20", + "requested_owner": "maintainers/video", + "disposition": "exception-dismissed-false-positive", + "exposure": "network: camera/media input path", + "reason_proposed": "dismissed 2026-03-02 as 'false positive' (maintainer rationale: plain HTTP is intended for local/container go2rtc/camera endpoints); NOT in current analysis: path not compiled in CodeQL build (ENABLE_GO2RTC=OFF) or code changed; re-verify when scope widens", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CODEQL-19", + "fingerprint": "codeql-alert:19", + "requested_owner": "maintainers/video", + "disposition": "exception-dismissed-false-positive", + "exposure": "network: camera/media input path", + "reason_proposed": "dismissed 2026-03-02 as 'false positive' (maintainer rationale: plain HTTP is intended for local/container go2rtc/camera endpoints); NOT in current analysis: path not compiled in CodeQL build (ENABLE_GO2RTC=OFF) or code changed; re-verify when scope widens", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-5f6ae30cde3aaf3d", + "fingerprint": "clang-tidy:bugprone-macro-parentheses:/usr/include/cjson/cJSON.h:5f6ae30cde3aaf3d", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party code linked into binary", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-bc48f96894493869", + "fingerprint": "clang-tidy:bugprone-macro-parentheses:/usr/include/cjson/cJSON.h:bc48f96894493869", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party code linked into binary", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-01e4c541adfa23e3", + "fingerprint": "clang-tidy:bugprone-macro-parentheses:/usr/include/cjson/cJSON.h:01e4c541adfa23e3", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party code linked into binary", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-3abdad2ed8a71fe5", + "fingerprint": "clang-tidy:bugprone-macro-parentheses:/usr/include/cjson/cJSON.h:3abdad2ed8a71fe5", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party code linked into binary", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-09829500c354c2b5", + "fingerprint": "clang-tidy:bugprone-macro-parentheses:/usr/include/cjson/cJSON.h:09829500c354c2b5", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party code linked into binary", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-661c1d9d010f4873", + "fingerprint": "clang-tidy:bugprone-macro-parentheses:/usr/include/cjson/cJSON.h:661c1d9d010f4873", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party code linked into binary", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-f69ef126d8e55b2b", + "fingerprint": "clang-tidy:bugprone-macro-parentheses:/usr/include/cjson/cJSON.h:f69ef126d8e55b2b", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party code linked into binary", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-6d1385324d08479d", + "fingerprint": "clang-tidy:bugprone-macro-parentheses:/usr/include/cjson/cJSON.h:6d1385324d08479d", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party code linked into binary", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-1539a5c009afd0df", + "fingerprint": "clang-tidy:cert-int09-c:include/core/authorization.h:1539a5c009afd0df", + "requested_owner": "maintainers/core", + "disposition": "baseline-debt", + "exposure": "internal", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-ca2f4806dea5f177", + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:include/web/api_timing.h:ca2f4806dea5f177", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-054f4f2a2583f814", + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:include/web/api_timing.h:054f4f2a2583f814", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-4505cfde8bb2e42a", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/core/authorization.c:4505cfde8bb2e42a", + "requested_owner": "maintainers/core", + "disposition": "baseline-debt", + "exposure": "internal", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-ff0e443bb0b29339", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/core/authorization.c:ff0e443bb0b29339", + "requested_owner": "maintainers/core", + "disposition": "baseline-debt", + "exposure": "internal", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-3a7569f24a5603a4", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/core/camera_collection_filter.c:3a7569f24a5603a4", + "requested_owner": "maintainers/core", + "disposition": "baseline-debt", + "exposure": "internal", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-54a9eba3b05f0872", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/core/camera_collection_filter.c:54a9eba3b05f0872", + "requested_owner": "maintainers/core", + "disposition": "baseline-debt", + "exposure": "internal", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-a221992baafec96f", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/core/camera_collection_filter.c:a221992baafec96f", + "requested_owner": "maintainers/core", + "disposition": "baseline-debt", + "exposure": "internal", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-8e1debc0e42f328a", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/core/camera_selector.c:8e1debc0e42f328a", + "requested_owner": "maintainers/core", + "disposition": "baseline-debt", + "exposure": "internal", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-1fb6fbd990b73e55", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/core/camera_selector.c:1fb6fbd990b73e55", + "requested_owner": "maintainers/core", + "disposition": "baseline-debt", + "exposure": "internal", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-52e7ee5b7b20725e", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/core/camera_selector.c:52e7ee5b7b20725e", + "requested_owner": "maintainers/core", + "disposition": "baseline-debt", + "exposure": "internal", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-a816d3388754e9a3", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/core/camera_selector.c:a816d3388754e9a3", + "requested_owner": "maintainers/core", + "disposition": "baseline-debt", + "exposure": "internal", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-bdf2049affa5a3fd", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/core/camera_selector.c:bdf2049affa5a3fd", + "requested_owner": "maintainers/core", + "disposition": "baseline-debt", + "exposure": "internal", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-946781b07a8a19f6", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/core/camera_selector.c:946781b07a8a19f6", + "requested_owner": "maintainers/core", + "disposition": "baseline-debt", + "exposure": "internal", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-73322317a31f8bcc", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/core/event_bus.c:73322317a31f8bcc", + "requested_owner": "maintainers/core", + "disposition": "baseline-debt", + "exposure": "internal", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-dbe8bf00e4b146ee", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/core/event_bus.c:dbe8bf00e4b146ee", + "requested_owner": "maintainers/core", + "disposition": "baseline-debt", + "exposure": "internal", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-2fcad01867c4b146", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/core/event_envelope.c:2fcad01867c4b146", + "requested_owner": "maintainers/core", + "disposition": "baseline-debt", + "exposure": "internal", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-51ab98673b990b2c", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/core/event_envelope.c:51ab98673b990b2c", + "requested_owner": "maintainers/core", + "disposition": "baseline-debt", + "exposure": "internal", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-a48d8d980b8dbfcc", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/core/event_envelope.c:a48d8d980b8dbfcc", + "requested_owner": "maintainers/core", + "disposition": "baseline-debt", + "exposure": "internal", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-767515747827ef14", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/core/event_router.c:767515747827ef14", + "requested_owner": "maintainers/core", + "disposition": "baseline-debt", + "exposure": "internal", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-ced78137a6871fda", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/core/mqtt_delivery_worker.c:ced78137a6871fda", + "requested_owner": "maintainers/core", + "disposition": "baseline-debt", + "exposure": "network: outbound MQTT", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-d7edea27d80824ed", + "fingerprint": "clang-tidy:bugprone-not-null-terminated-result:src/core/mqtt_destination_client.c:d7edea27d80824ed", + "requested_owner": "maintainers/core", + "disposition": "baseline-debt", + "exposure": "network: outbound MQTT", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-dda225859c807d72", + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/core/path_utils.c:dda225859c807d72", + "requested_owner": "maintainers/core", + "disposition": "baseline-debt", + "exposure": "internal", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-7bff304a77769e6c", + "fingerprint": "clang-tidy:bugprone-misplaced-widening-cast:src/database/db_fleet_query.c:7bff304a77769e6c", + "requested_owner": "maintainers/database", + "disposition": "baseline-debt", + "exposure": "local: persistence/config", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-4ce72e7a43d0bcce", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/database/db_operator_floor_plans.c:4ce72e7a43d0bcce", + "requested_owner": "maintainers/database", + "disposition": "baseline-debt", + "exposure": "local: persistence/config", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-39f0ad6017069f02", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/database/db_storage_lifecycle.c:39f0ad6017069f02", + "requested_owner": "maintainers/database", + "disposition": "baseline-debt", + "exposure": "local: persistence/config", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-c666354bdbc1df4b", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/database/db_storage_lifecycle.c:c666354bdbc1df4b", + "requested_owner": "maintainers/database", + "disposition": "baseline-debt", + "exposure": "local: persistence/config", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-c8b906651c5b2c7f", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/database/db_storage_lifecycle.c:c8b906651c5b2c7f", + "requested_owner": "maintainers/database", + "disposition": "baseline-debt", + "exposure": "local: persistence/config", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-8a2d068dc3e8b0c0", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/database/db_storage_lifecycle.c:8a2d068dc3e8b0c0", + "requested_owner": "maintainers/database", + "disposition": "baseline-debt", + "exposure": "local: persistence/config", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-ad7afdbd70ca0a46", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/database/db_storage_lifecycle.c:ad7afdbd70ca0a46", + "requested_owner": "maintainers/database", + "disposition": "baseline-debt", + "exposure": "local: persistence/config", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-76e54a4e3ac5efb3", + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/database/db_storage_lifecycle.c:76e54a4e3ac5efb3", + "requested_owner": "maintainers/database", + "disposition": "baseline-debt", + "exposure": "local: persistence/config", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-84fbbd387f95947a", + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/database/db_storage_lifecycle.c:84fbbd387f95947a", + "requested_owner": "maintainers/database", + "disposition": "baseline-debt", + "exposure": "local: persistence/config", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-709dbb22240f409f", + "fingerprint": "clang-tidy:bugprone-suspicious-string-compare:src/database/db_storage_targets.c:709dbb22240f409f", + "requested_owner": "maintainers/database", + "disposition": "baseline-debt", + "exposure": "local: persistence/config", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-d68060f1555ca324", + "fingerprint": "clang-tidy:bugprone-suspicious-string-compare:src/database/db_storage_targets.c:d68060f1555ca324", + "requested_owner": "maintainers/database", + "disposition": "baseline-debt", + "exposure": "local: persistence/config", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-b922ced0e34aacea", + "fingerprint": "clang-tidy:bugprone-suspicious-string-compare:src/database/db_storage_targets.c:b922ced0e34aacea", + "requested_owner": "maintainers/database", + "disposition": "baseline-debt", + "exposure": "local: persistence/config", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-295d32efbfee9145", + "fingerprint": "clang-tidy:bugprone-suspicious-string-compare:src/database/db_storage_targets.c:295d32efbfee9145", + "requested_owner": "maintainers/database", + "disposition": "baseline-debt", + "exposure": "local: persistence/config", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-808f26556ac98110", + "fingerprint": "clang-tidy:bugprone-assignment-in-if-condition:src/database/db_system_health_incidents.c:808f26556ac98110", + "requested_owner": "maintainers/database", + "disposition": "baseline-debt", + "exposure": "local: persistence/config", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-7e1ce15fe947a21d", + "fingerprint": "clang-tidy:bugprone-assignment-in-if-condition:src/database/db_system_health_incidents.c:7e1ce15fe947a21d", + "requested_owner": "maintainers/database", + "disposition": "baseline-debt", + "exposure": "local: persistence/config", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-fe8af642c27ce051", + "fingerprint": "clang-tidy:clang-analyzer-deadcode.DeadStores:src/database/db_system_health_incidents.c:fe8af642c27ce051", + "requested_owner": "maintainers/database", + "disposition": "baseline-debt", + "exposure": "local: persistence/config", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-56955e0bf792f087", + "fingerprint": "clang-tidy:bugprone-suspicious-string-compare:src/storage/storage_deletion.c:56955e0bf792f087", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "local: persistence/config", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-50703d3018f9bed5", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_migration.c:50703d3018f9bed5", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "local: persistence/config", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-15fa53ad8b574808", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_migration.c:15fa53ad8b574808", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "local: persistence/config", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-e5960a2d15356c27", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_migration.c:e5960a2d15356c27", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "local: persistence/config", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-1fac122c6010eb36", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_migration.c:1fac122c6010eb36", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "local: persistence/config", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-d6379e87cfa699fa", + "fingerprint": "clang-tidy:bugprone-suspicious-string-compare:src/storage/storage_migration.c:d6379e87cfa699fa", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "local: persistence/config", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-789d9f9254afa1b1", + "fingerprint": "clang-tidy:bugprone-suspicious-string-compare:src/storage/storage_s3.c:789d9f9254afa1b1", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "network: outbound S3", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-612c846365824225", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:612c846365824225", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "network: outbound S3", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-1e0ea76108754cd5", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:1e0ea76108754cd5", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "network: outbound S3", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-2f98dec54b741594", + "fingerprint": "clang-tidy:bugprone-suspicious-string-compare:src/storage/storage_s3.c:2f98dec54b741594", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "network: outbound S3", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-ab4dc4b3768799ca", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:ab4dc4b3768799ca", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "network: outbound S3", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-14f55668eaa243b0", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:14f55668eaa243b0", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "network: outbound S3", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-852f97f8aacc5432", + "fingerprint": "clang-tidy:bugprone-suspicious-string-compare:src/storage/storage_s3.c:852f97f8aacc5432", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "network: outbound S3", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-fbf040917d8b6cf7", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:fbf040917d8b6cf7", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "network: outbound S3", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-52dada64b4a6e625", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:52dada64b4a6e625", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "network: outbound S3", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-d1d1cf8dcb7070f8", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:d1d1cf8dcb7070f8", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "network: outbound S3", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-bfb7d2825452ce0c", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:bfb7d2825452ce0c", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "network: outbound S3", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-842c6bb171a64e75", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:842c6bb171a64e75", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "network: outbound S3", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-4a2a60d787933d7d", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:4a2a60d787933d7d", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "network: outbound S3", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-ba57287cdb3eb096", + "fingerprint": "clang-tidy:bugprone-suspicious-string-compare:src/storage/storage_s3.c:ba57287cdb3eb096", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "network: outbound S3", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-a145bd05b0189193", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:a145bd05b0189193", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "network: outbound S3", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-bfbbf95e2bedfe38", + "fingerprint": "clang-tidy:bugprone-suspicious-string-compare:src/storage/storage_s3.c:bfbbf95e2bedfe38", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "network: outbound S3", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-65cc9415acf1be4d", + "fingerprint": "clang-tidy:bugprone-suspicious-string-compare:src/storage/storage_s3.c:65cc9415acf1be4d", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "network: outbound S3", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-5561b78de6be772b", + "fingerprint": "clang-tidy:bugprone-suspicious-string-compare:src/storage/storage_s3.c:5561b78de6be772b", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "network: outbound S3", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-6b719694dd2640c7", + "fingerprint": "clang-tidy:bugprone-suspicious-string-compare:src/storage/storage_s3.c:6b719694dd2640c7", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "network: outbound S3", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-f72760acc6c09e16", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:f72760acc6c09e16", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "network: outbound S3", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-0866b8e57f533141", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:0866b8e57f533141", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "network: outbound S3", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-3a081de1dd30ebb2", + "fingerprint": "clang-tidy:bugprone-unsafe-functions,cert-msc24-c,cert-msc33-c:src/storage/storage_s3.c:3a081de1dd30ebb2", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "network: outbound S3", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-d08422316656b39c", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:d08422316656b39c", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "network: outbound S3", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-d7c0ab1bf29a42a3", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/storage/storage_s3.c:d7c0ab1bf29a42a3", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "network: outbound S3", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-9613b39c2e0a1e4c", + "fingerprint": "clang-tidy:bugprone-inc-dec-in-conditions:src/storage/storage_source.c:9613b39c2e0a1e4c", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "local: persistence/config", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-6a07b625f331b20e", + "fingerprint": "clang-tidy:bugprone-suspicious-string-compare:src/storage/storage_source.c:6a07b625f331b20e", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "local: persistence/config", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-eac1097bd3780c16", + "fingerprint": "clang-tidy:bugprone-branch-clone:src/telemetry/collectors/linux_cgroup.c:eac1097bd3780c16", + "requested_owner": "maintainers/telemetry", + "disposition": "baseline-debt", + "exposure": "local: host procfs/sysfs/cgroup", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-8d33cee7806f5d43", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/telemetry/collectors/linux_network.c:8d33cee7806f5d43", + "requested_owner": "maintainers/telemetry", + "disposition": "baseline-debt", + "exposure": "local: host procfs/sysfs/cgroup", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-02b18b5e0f4e3b93", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/telemetry/collectors/linux_network.c:02b18b5e0f4e3b93", + "requested_owner": "maintainers/telemetry", + "disposition": "baseline-debt", + "exposure": "local: host procfs/sysfs/cgroup", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-b84c577b6e369ac3", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/telemetry/collectors/linux_process.c:b84c577b6e369ac3", + "requested_owner": "maintainers/telemetry", + "disposition": "baseline-debt", + "exposure": "local: host procfs/sysfs/cgroup", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-8b66085f0250d8e1", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/telemetry/collectors/linux_process.c:8b66085f0250d8e1", + "requested_owner": "maintainers/telemetry", + "disposition": "baseline-debt", + "exposure": "local: host procfs/sysfs/cgroup", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-15838d8765a7623e", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/telemetry/collectors/linux_thermal.c:15838d8765a7623e", + "requested_owner": "maintainers/telemetry", + "disposition": "baseline-debt", + "exposure": "local: host procfs/sysfs/cgroup", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-df8a271dac7dc00c", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/telemetry/collectors/linux_thermal.c:df8a271dac7dc00c", + "requested_owner": "maintainers/telemetry", + "disposition": "baseline-debt", + "exposure": "local: host procfs/sysfs/cgroup", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-c52ffccc8c0fb590", + "fingerprint": "clang-tidy:cert-err34-c:src/telemetry/providers/linux_device_map.c:c52ffccc8c0fb590", + "requested_owner": "maintainers/telemetry", + "disposition": "baseline-debt", + "exposure": "local: host procfs/sysfs/cgroup", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-65ab86fae5fd2213", + "fingerprint": "clang-tidy:bugprone-not-null-terminated-result:src/telemetry/providers/linux_hardware.c:65ab86fae5fd2213", + "requested_owner": "maintainers/telemetry", + "disposition": "baseline-debt", + "exposure": "local: host procfs/sysfs/cgroup", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-811ab08155776051", + "fingerprint": "clang-tidy:cert-err34-c:src/telemetry/providers/linux_hardware.c:811ab08155776051", + "requested_owner": "maintainers/telemetry", + "disposition": "baseline-debt", + "exposure": "local: host procfs/sysfs/cgroup", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-11d1a497d98b8490", + "fingerprint": "clang-tidy:cert-err34-c:src/tools/ffmpeg_rss_guard.c:11d1a497d98b8490", + "requested_owner": "maintainers/tools", + "disposition": "baseline-debt", + "exposure": "local: CLI tool", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-802a0570e39a96a6", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/tools/ffmpeg_rss_guard.c:802a0570e39a96a6", + "requested_owner": "maintainers/tools", + "disposition": "baseline-debt", + "exposure": "local: CLI tool", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-a072eb98578bd9cf", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/tools/ffmpeg_rss_guard.c:a072eb98578bd9cf", + "requested_owner": "maintainers/tools", + "disposition": "baseline-debt", + "exposure": "local: CLI tool", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-576d7acbaee5cef6", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/utils/lpr_crypto.c:576d7acbaee5cef6", + "requested_owner": "maintainers/utils", + "disposition": "baseline-debt", + "exposure": "internal", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-ae25a6959341dd10", + "fingerprint": "clang-tidy:bugprone-macro-parentheses:src/video/api_detection.c:ae25a6959341dd10", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-c34509f97f5eb3bf", + "fingerprint": "clang-tidy:bugprone-assignment-in-if-condition:src/video/api_detection.c:c34509f97f5eb3bf", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-6ac00b1420332d40", + "fingerprint": "clang-tidy:bugprone-assignment-in-if-condition:src/video/api_detection.c:6ac00b1420332d40", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-1848d1ca57216f44", + "fingerprint": "clang-tidy:bugprone-assignment-in-if-condition:src/video/api_detection.c:1848d1ca57216f44", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-be52eb80a1a9b4e2", + "fingerprint": "clang-tidy:bugprone-assignment-in-if-condition:src/video/api_detection.c:be52eb80a1a9b4e2", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-eadc49a35e808a77", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_api.c:eadc49a35e808a77", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-bdcbae59a275ce50", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_api.c:bdcbae59a275ce50", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-5582e7df3dd25730", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_api.c:5582e7df3dd25730", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-23826be3117b0a5e", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_api.c:23826be3117b0a5e", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-cac166160ef5ab94", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_api.c:cac166160ef5ab94", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-6eced00c619f459a", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_api.c:6eced00c619f459a", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-a35257b195053d18", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_api.c:a35257b195053d18", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-9fbcc527095ebbbb", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_api.c:9fbcc527095ebbbb", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-c263543788ddaa36", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_api.c:c263543788ddaa36", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-d06458b2bdfca56d", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_consumer.c:d06458b2bdfca56d", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-1592d34d4e3dc54c", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_integration.c:1592d34d4e3dc54c", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-957e3e8e5e143726", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_integration.c:957e3e8e5e143726", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-a7a71d348e2c49f5", + "fingerprint": "clang-tidy:cert-err34-c:src/video/go2rtc/go2rtc_integration.c:a7a71d348e2c49f5", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-76ebb6a603073b54", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_integration.c:76ebb6a603073b54", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-2c1116134a2ee5a3", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_integration.c:2c1116134a2ee5a3", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-88fbdf8930f67549", + "fingerprint": "clang-tidy:clang-analyzer-deadcode.DeadStores:src/video/go2rtc/go2rtc_integration.c:88fbdf8930f67549", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-0ce2e7833fc885fd", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_integration.c:0ce2e7833fc885fd", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-41876b44c3442c4b", + "fingerprint": "clang-tidy:cert-err34-c:src/video/go2rtc/go2rtc_process.c:41876b44c3442c4b", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-3a3cc8c9282e0fb5", + "fingerprint": "clang-tidy:cert-err34-c:src/video/go2rtc/go2rtc_process.c:3a3cc8c9282e0fb5", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-43d0d5170d6a8434", + "fingerprint": "clang-tidy:cert-err34-c:src/video/go2rtc/go2rtc_process.c:43d0d5170d6a8434", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-4e94aa9ff957dec6", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_snapshot.c:4e94aa9ff957dec6", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-f6ddc3b14e23e020", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/go2rtc/go2rtc_stream.c:f6ddc3b14e23e020", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-48d30c8fb35cc9cd", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/video/hls/hls_cache_cleanup.c:48d30c8fb35cc9cd", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-1634947d8289644f", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/video/hls/hls_cache_cleanup.c:1634947d8289644f", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-cb9a5afe872113f7", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/video/hls/hls_cache_cleanup.c:cb9a5afe872113f7", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-098d117140abdf3a", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/video/hls/hls_cache_cleanup.c:098d117140abdf3a", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-a89af13dd80ae187", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/video/hls/hls_cache_cleanup.c:a89af13dd80ae187", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-27ac318897664d8a", + "fingerprint": "clang-tidy:clang-analyzer-deadcode.DeadStores:src/video/mp4_segment_recorder.c:27ac318897664d8a", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-30c3f7edea8fbd8d", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/video/mp4_segment_recorder.c:30c3f7edea8fbd8d", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-d421e791a6b63cc9", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/video/mp4_writer_core.c:d421e791a6b63cc9", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-c74d7d04edeb4ee2", + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/video/mp4_writer_utils.c:c74d7d04edeb4ee2", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-c536433a0089e4b9", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/video/mp4_writer_utils.c:c536433a0089e4b9", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-4e34d6b524364f03", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/video/mp4_writer_utils.c:4e34d6b524364f03", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-a19387fbb98806ae", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/mp4_writer_utils.c:a19387fbb98806ae", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-cb47dbd2bd0937a1", + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/video/mp4_writer_utils.c:cb47dbd2bd0937a1", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-6f7bee0a60d5152f", + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/video/mp4_writer_utils.c:6f7bee0a60d5152f", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-18362aef7fade326", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/onvif_detection.c:18362aef7fade326", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-eade1f2d38582a47", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/onvif_detection.c:eade1f2d38582a47", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-a6e1105b549e0cf0", + "fingerprint": "clang-tidy:cert-err34-c:src/video/onvif_detection.c:a6e1105b549e0cf0", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-8b074e54e83681ff", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/onvif_detection.c:8b074e54e83681ff", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-eb4e649dccdb530f", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/video/onvif_event.c:eb4e649dccdb530f", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-7d7d3a3c4f1824bd", + "fingerprint": "clang-tidy:clang-analyzer-deadcode.DeadStores:src/video/onvif_ptz.c:7d7d3a3c4f1824bd", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-44c350a8b7e2fd4a", + "fingerprint": "clang-tidy:clang-analyzer-deadcode.DeadStores:src/video/recording_path.c:44c350a8b7e2fd4a", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-a7fa9aad275f9425", + "fingerprint": "clang-tidy:clang-analyzer-deadcode.DeadStores:src/video/recording_path.c:a7fa9aad275f9425", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-e1b115ce18cb0926", + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/video/stream_frame_rate.c:e1b115ce18cb0926", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-9bb912a1e3d2bf88", + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/video/stream_frame_rate.c:9bb912a1e3d2bf88", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-5dc4623d12ccf5b2", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/video/unified_detection_thread.c:5dc4623d12ccf5b2", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "network: camera/media input path", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-a03bd79d6040e625", + "fingerprint": "clang-tidy:bugprone-branch-clone:src/web/api_handlers_authorization.c:a03bd79d6040e625", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-1f9c86e17ca383f9", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:1f9c86e17ca383f9", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-316e32d23b15b780", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:316e32d23b15b780", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-7464eb7864628fd1", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:7464eb7864628fd1", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-5e2b3b364d163173", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:5e2b3b364d163173", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-81fbfb962103b645", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:81fbfb962103b645", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-c41e983019497e88", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:c41e983019497e88", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-308b0349ef001b56", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:308b0349ef001b56", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-7a3f68ca1e19c9db", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:7a3f68ca1e19c9db", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-475d0f82a4e9b764", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:475d0f82a4e9b764", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-2276a7bff678cf41", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:2276a7bff678cf41", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-63c736995704d2d6", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:63c736995704d2d6", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-f5ac788b77f1417a", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:f5ac788b77f1417a", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-ae6a96ea4d41087d", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:ae6a96ea4d41087d", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-f617ccfb4cfc3cc2", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:f617ccfb4cfc3cc2", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-169001b0559c7bcb", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:169001b0559c7bcb", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-6bce10f282924906", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_camera_collections.c:6bce10f282924906", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-0b0bcefaf7a0b24f", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_fleet.c:0b0bcefaf7a0b24f", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-d8c6998c9398adf1", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_fleet.c:d8c6998c9398adf1", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-79ebe40a23b7323a", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_fleet.c:79ebe40a23b7323a", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-6da59a8629d16699", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_fleet.c:6da59a8629d16699", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-773e04e041de5410", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_fleet.c:773e04e041de5410", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-f12d6e4a615966e9", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_fleet.c:f12d6e4a615966e9", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-ede4da279d79ec69", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_fleet.c:ede4da279d79ec69", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-36c8164a04c2420c", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_fleet.c:36c8164a04c2420c", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-4053884d5188ab2f", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_fleet.c:4053884d5188ab2f", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-ab5e571ba64af645", + "fingerprint": "clang-tidy:cert-err34-c:src/web/api_handlers_go2rtc_proxy.c:ab5e571ba64af645", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-cf5f09b5a02a9bca", + "fingerprint": "clang-tidy:clang-analyzer-deadcode.DeadStores:src/web/api_handlers_health.c:cf5f09b5a02a9bca", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-6829e02764d9d278", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/api_handlers_investigations.c:6829e02764d9d278", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-113735d7300e4f01", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/api_handlers_investigations.c:113735d7300e4f01", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-25b00beae5a3f4a8", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/api_handlers_investigations.c:25b00beae5a3f4a8", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-e5ec24184e5b758c", + "fingerprint": "clang-tidy:cert-err34-c:src/web/api_handlers_investigations.c:e5ec24184e5b758c", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-2387b22f15e219d3", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/api_handlers_investigations.c:2387b22f15e219d3", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-0818b8d62b6628c5", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/api_handlers_lpr.c:0818b8d62b6628c5", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-02365646d53a2c50", + "fingerprint": "clang-tidy:bugprone-assignment-in-if-condition:src/web/api_handlers_metrics.c:02365646d53a2c50", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-a219d74f760de10e", + "fingerprint": "clang-tidy:bugprone-assignment-in-if-condition:src/web/api_handlers_metrics.c:a219d74f760de10e", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-96f8eef93ec11127", + "fingerprint": "clang-tidy:bugprone-assignment-in-if-condition:src/web/api_handlers_metrics.c:96f8eef93ec11127", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-221d97bd8b8ca157", + "fingerprint": "clang-tidy:bugprone-assignment-in-if-condition:src/web/api_handlers_metrics.c:221d97bd8b8ca157", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-b6b7c0de32a0c6b7", + "fingerprint": "clang-tidy:bugprone-assignment-in-if-condition:src/web/api_handlers_metrics.c:b6b7c0de32a0c6b7", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-4edbb01e2c9075ed", + "fingerprint": "clang-tidy:bugprone-assignment-in-if-condition:src/web/api_handlers_metrics.c:4edbb01e2c9075ed", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-ec9cd5d6ab7a3d6e", + "fingerprint": "clang-tidy:bugprone-assignment-in-if-condition:src/web/api_handlers_metrics.c:ec9cd5d6ab7a3d6e", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-2f30db61a3888f56", + "fingerprint": "clang-tidy:bugprone-assignment-in-if-condition:src/web/api_handlers_metrics.c:2f30db61a3888f56", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-53e88d8983baf290", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/api_handlers_operator_floor_plans.c:53e88d8983baf290", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-dbd6a5de3a7e191c", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/api_handlers_operator_floor_plans.c:dbd6a5de3a7e191c", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-0cc9a9ea64babfdc", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_retention.c:0cc9a9ea64babfdc", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-234cb88ea5651731", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_retention.c:234cb88ea5651731", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-88f84938e1b8feb0", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/api_handlers_storage.c:88f84938e1b8feb0", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-6a756d858b2a4590", + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/web/api_handlers_storage_compliance.c:6a756d858b2a4590", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-0f6724ca27b42ed9", + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/web/api_handlers_storage_compliance.c:0f6724ca27b42ed9", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-ec3e72154d735330", + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/web/api_handlers_storage_compliance.c:ec3e72154d735330", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-e85c88c08460d2ef", + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/web/api_handlers_storage_compliance.c:e85c88c08460d2ef", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-9c90ce2f531301e0", + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/web/api_handlers_storage_compliance.c:9c90ce2f531301e0", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-3e6ff569aac7699e", + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/web/api_handlers_storage_compliance.c:3e6ff569aac7699e", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-ca4b8a2f2a2f60bf", + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/web/api_handlers_storage_compliance.c:ca4b8a2f2a2f60bf", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-c990523bb862f2b6", + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/web/api_handlers_storage_compliance.c:c990523bb862f2b6", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-7a5a584e25342a04", + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/web/api_handlers_storage_compliance.c:7a5a584e25342a04", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-8d9dd908cb4d8452", + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/web/api_handlers_storage_compliance.c:8d9dd908cb4d8452", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-312e6eafc5ebdca6", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_storage_policies.c:312e6eafc5ebdca6", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-1985156ff8e5c87d", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_storage_policies.c:1985156ff8e5c87d", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-ca7e963b9f3e3214", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_storage_policies.c:ca7e963b9f3e3214", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-aede9d1024b66426", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_storage_policies.c:aede9d1024b66426", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-07c63776b48ad48f", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_storage_policies.c:07c63776b48ad48f", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-ea16598ca26b9108", + "fingerprint": "clang-tidy:bugprone-multi-level-implicit-pointer-conversion:src/web/api_handlers_storage_policies.c:ea16598ca26b9108", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-101a7d6e0cfda715", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/api_handlers_system_go2rtc.c:101a7d6e0cfda715", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-c586f58fa85c527e", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/api_handlers_system_go2rtc.c:c586f58fa85c527e", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-0fda904c59353043", + "fingerprint": "clang-tidy:cert-err34-c:src/web/api_handlers_system_logs.c:0fda904c59353043", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-18895086ef6f0ed9", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/api_handlers_timeline.c:18895086ef6f0ed9", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-f1f70f55c95dfbaf", + "fingerprint": "clang-tidy:bugprone-branch-clone:src/web/api_handlers_timeline.c:f1f70f55c95dfbaf", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-5bdf00371aedee4a", + "fingerprint": "clang-tidy:bugprone-branch-clone:src/web/audit_log.c:5bdf00371aedee4a", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-6e45cad03ed5a9f3", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/go2rtc_websocket.c:6e45cad03ed5a9f3", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-82315a3f137f4aff", + "fingerprint": "clang-tidy:bugprone-assignment-in-if-condition:src/web/go2rtc_websocket.c:82315a3f137f4aff", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-5c42b38e8a9c25ff", + "fingerprint": "clang-tidy:cert-err34-c:src/web/go2rtc_websocket.c:5c42b38e8a9c25ff", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-cb7511d8b0a3b651", + "fingerprint": "clang-tidy:bugprone-narrowing-conversions:src/web/httpd_utils.c:cb7511d8b0a3b651", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-5bcac8af8164c1b0", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/recording_archive.c:5bcac8af8164c1b0", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-e2b358165654b79e", + "fingerprint": "clang-tidy:bugprone-implicit-widening-of-multiplication-result:src/web/recording_archive.c:e2b358165654b79e", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-adf6edf7670e9010", + "fingerprint": "clang-tidy:bugprone-suspicious-string-compare:src/web/recording_archive.c:adf6edf7670e9010", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-ccff9a5b097b862e", + "fingerprint": "clang-tidy:bugprone-branch-clone:src/web/thumbnail_thread.c:ccff9a5b097b862e", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "network: HTTP API / web server", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-b6947bb24c18c8ac", + "fingerprint": "clang-tidy:cert-int09-c:third_party/faac/include/faac.h:b6947bb24c18c8ac", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party code linked into binary", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-ddf685d0be472b86", + "fingerprint": "clang-tidy:cert-int09-c:third_party/faac/include/faac.h:ddf685d0be472b86", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party code linked into binary", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-296d5f7499179bc0", + "fingerprint": "clang-tidy:cert-int09-c:third_party/faac/include/faac.h:296d5f7499179bc0", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party code linked into binary", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CLANGTIDY-4c6957160cb5ae0c", + "fingerprint": "clang-tidy:cert-int09-c:third_party/faac/include/faac.h:4c6957160cb5ae0c", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party code linked into binary", + "reason_proposed": "clang-tidy-report.txt from Static Analysis run 41176542849 @1b8d4332", + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-8bb35cef096bd68d", + "fingerprint": "cppcheck-bucket:arrayIndexThenCheck:include/sod/sod_img_writer.h", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-7e66ded89b37cb4f", + "fingerprint": "cppcheck-bucket:constParameter:src/telemetry/collectors/linux_network.c", + "requested_owner": "maintainers/telemetry", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-c6d1df4e6770f40e", + "fingerprint": "cppcheck-bucket:constParameter:src/web/api_handlers_investigations.c", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-fb37582a72f59582", + "fingerprint": "cppcheck-bucket:constParameterCallback:include/sod/sod_img_reader.h", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-c7b3ef530f996e26", + "fingerprint": "cppcheck-bucket:constParameterCallback:include/sod/sod_img_writer.h", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-90ec02278e01bcac", + "fingerprint": "cppcheck-bucket:constParameterCallback:src/storage/storage_migration.c", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-6291a48798ed350c", + "fingerprint": "cppcheck-bucket:constParameterCallback:src/utils/yaml_redact.c", + "requested_owner": "maintainers/utils", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-681aedac30d87a1e", + "fingerprint": "cppcheck-bucket:constParameterCallback:src/video/api_detection.c", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-ee781b371da39bf5", + "fingerprint": "cppcheck-bucket:constParameterCallback:src/video/go2rtc/go2rtc_api.c", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "optional-feature", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-dc056676c7084f53", + "fingerprint": "cppcheck-bucket:constParameterCallback:src/video/go2rtc/go2rtc_integration.c", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "optional-feature", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-0130dae8fb623afa", + "fingerprint": "cppcheck-bucket:constParameterCallback:src/video/go2rtc/go2rtc_snapshot.c", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "optional-feature", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-365ebbda46eacf74", + "fingerprint": "cppcheck-bucket:constParameterCallback:src/video/onvif_detection.c", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-8737ababcc06f484", + "fingerprint": "cppcheck-bucket:constParameterCallback:src/video/onvif_device_management.c", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-baf28ba17bc25dd0", + "fingerprint": "cppcheck-bucket:constParameterCallback:src/video/onvif_imaging.c", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-462bf13ae3867115", + "fingerprint": "cppcheck-bucket:constParameterCallback:src/video/onvif_ptz.c", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-b6f82c4c9b287eba", + "fingerprint": "cppcheck-bucket:constParameterCallback:src/web/api_handlers_go2rtc_proxy.c", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-c7a8e9a51802c60d", + "fingerprint": "cppcheck-bucket:constParameterCallback:src/web/api_handlers_health.c", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-d3985740b2ac6585", + "fingerprint": "cppcheck-bucket:constParameterCallback:src/web/go2rtc_proxy_thread.c", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-82a085f0cc04468f", + "fingerprint": "cppcheck-bucket:constParameterPointer:include/sod/sod_img_reader.h", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-27ab7ab1e74c2e72", + "fingerprint": "cppcheck-bucket:constParameterPointer:include/sod/sod_img_writer.h", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-d0de2e4ac47c3191", + "fingerprint": "cppcheck-bucket:constParameterPointer:src/core/authorization.c", + "requested_owner": "maintainers/core", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-fbb9e9402242eaba", + "fingerprint": "cppcheck-bucket:constParameterPointer:src/core/mqtt_destination_client.c", + "requested_owner": "maintainers/core", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-fd8d6a4b8cc77400", + "fingerprint": "cppcheck-bucket:constParameterPointer:src/database/db_camera_collections.c", + "requested_owner": "maintainers/database", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-43fcd9340a9e63ed", + "fingerprint": "cppcheck-bucket:constParameterPointer:src/ezxml/ezxml.c", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-e7f8f80f0cd95f0d", + "fingerprint": "cppcheck-bucket:constParameterPointer:src/sod/sod.c", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-70e0496568faa30f", + "fingerprint": "cppcheck-bucket:constParameterPointer:src/telemetry/collectors/linux_cgroup.c", + "requested_owner": "maintainers/telemetry", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-5bdf073f41a6c65d", + "fingerprint": "cppcheck-bucket:constParameterPointer:src/telemetry/providers/nvme_provider.c", + "requested_owner": "maintainers/telemetry", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-527aa4750d3ac84a", + "fingerprint": "cppcheck-bucket:constParameterPointer:src/telemetry/system_health_evaluator.c", + "requested_owner": "maintainers/telemetry", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-d9684d3aa203568c", + "fingerprint": "cppcheck-bucket:constParameterPointer:src/utils/go2rtc_base_path.c", + "requested_owner": "maintainers/utils", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-e228634622467328", + "fingerprint": "cppcheck-bucket:constParameterPointer:src/utils/strings.c", + "requested_owner": "maintainers/utils", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-bdb708e597b5cade", + "fingerprint": "cppcheck-bucket:constParameterPointer:src/video/faac_encoder.c", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-cbab871259b9963d", + "fingerprint": "cppcheck-bucket:constParameterPointer:src/video/hls/hls_unified_thread.c", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-8c644cc847574bfe", + "fingerprint": "cppcheck-bucket:constParameterPointer:src/video/unified_detection_thread.c", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-4c0052bc9de6e496", + "fingerprint": "cppcheck-bucket:constParameterPointer:src/web/go2rtc_websocket.c", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-45cfee19afe8668f", + "fingerprint": "cppcheck-bucket:constParameterPointer:src/web/recording_archive.c", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-933d7ae37be3c395", + "fingerprint": "cppcheck-bucket:constVariable:include/sod/sod_img_reader.h", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-b1c0c559c6e17a23", + "fingerprint": "cppcheck-bucket:constVariable:include/sod/sod_img_writer.h", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-8596888f0dd1cc7e", + "fingerprint": "cppcheck-bucket:constVariable:src/core/mqtt_delivery_worker.c", + "requested_owner": "maintainers/core", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-298feb4a490d6252", + "fingerprint": "cppcheck-bucket:constVariable:src/sod/sod.c", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-a8ce2c3168c021de", + "fingerprint": "cppcheck-bucket:constVariable:src/sod/sod_ingenic_mxu.c", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-9575437f939001d5", + "fingerprint": "cppcheck-bucket:constVariablePointer:include/sod/sod_img_reader.h", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-df230b0a5672f192", + "fingerprint": "cppcheck-bucket:constVariablePointer:include/sod/sod_img_writer.h", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-8e110c5360beb299", + "fingerprint": "cppcheck-bucket:constVariablePointer:src/core/path_utils.c", + "requested_owner": "maintainers/core", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-6c5cf9bd3f338f84", + "fingerprint": "cppcheck-bucket:constVariablePointer:src/database/db_auth.c", + "requested_owner": "maintainers/database", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-08f60b7ec76ce9d3", + "fingerprint": "cppcheck-bucket:constVariablePointer:src/database/db_authorization.c", + "requested_owner": "maintainers/database", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-7e7f6cc12d937123", + "fingerprint": "cppcheck-bucket:constVariablePointer:src/database/db_camera_tags.c", + "requested_owner": "maintainers/database", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-f21c65912e355ace", + "fingerprint": "cppcheck-bucket:constVariablePointer:src/database/db_core.c", + "requested_owner": "maintainers/database", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-9f651ab0c8ea6422", + "fingerprint": "cppcheck-bucket:constVariablePointer:src/database/db_fleet_query.c", + "requested_owner": "maintainers/database", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-353deb8bba479029", + "fingerprint": "cppcheck-bucket:constVariablePointer:src/database/db_storage_lifecycle.c", + "requested_owner": "maintainers/database", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-c6ee03168003661f", + "fingerprint": "cppcheck-bucket:constVariablePointer:src/ezxml/ezxml.c", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-5d8aaf042fefce78", + "fingerprint": "cppcheck-bucket:constVariablePointer:src/sod/sod.c", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-b4e128a1af325d4f", + "fingerprint": "cppcheck-bucket:constVariablePointer:src/storage/storage_deletion.c", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-77479b4ba7ef9849", + "fingerprint": "cppcheck-bucket:constVariablePointer:src/storage/storage_source.c", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-c9404ed2a73b0977", + "fingerprint": "cppcheck-bucket:constVariablePointer:src/telemetry/collectors/linux_network.c", + "requested_owner": "maintainers/telemetry", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-e924700b1413accd", + "fingerprint": "cppcheck-bucket:constVariablePointer:src/telemetry/collectors/linux_process.c", + "requested_owner": "maintainers/telemetry", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-2ca7413944026780", + "fingerprint": "cppcheck-bucket:constVariablePointer:src/telemetry/collectors/linux_thermal.c", + "requested_owner": "maintainers/telemetry", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-a1edb744b382f8f5", + "fingerprint": "cppcheck-bucket:constVariablePointer:src/telemetry/providers/linux_device_map.c", + "requested_owner": "maintainers/telemetry", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-4001e3b91223c7ad", + "fingerprint": "cppcheck-bucket:constVariablePointer:src/telemetry/providers/linux_hardware.c", + "requested_owner": "maintainers/telemetry", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-ae15015525d96c08", + "fingerprint": "cppcheck-bucket:constVariablePointer:src/telemetry/providers/nvme_provider.c", + "requested_owner": "maintainers/telemetry", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-f3bb2108694b562f", + "fingerprint": "cppcheck-bucket:constVariablePointer:src/telemetry/system_health.c", + "requested_owner": "maintainers/telemetry", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-57093ce27e4aabc5", + "fingerprint": "cppcheck-bucket:constVariablePointer:src/telemetry/system_health_evaluator.c", + "requested_owner": "maintainers/telemetry", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-4dc0544d99c6a120", + "fingerprint": "cppcheck-bucket:constVariablePointer:src/utils/go2rtc_base_path.c", + "requested_owner": "maintainers/utils", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-aa0082260172b3b9", + "fingerprint": "cppcheck-bucket:constVariablePointer:src/video/detection_model.c", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-5f736ad7b9095aea", + "fingerprint": "cppcheck-bucket:constVariablePointer:src/video/go2rtc/go2rtc_integration.c", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "optional-feature", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-eabea03354c7b4b7", + "fingerprint": "cppcheck-bucket:constVariablePointer:src/video/go2rtc/go2rtc_process.c", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "optional-feature", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-e9a38e72fa2e4a7c", + "fingerprint": "cppcheck-bucket:constVariablePointer:src/video/mp4_recording_core.c", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-3ec7089cfaa16e94", + "fingerprint": "cppcheck-bucket:constVariablePointer:src/video/mp4_recording_writer.c", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-4ffd5c5d72b2c6a0", + "fingerprint": "cppcheck-bucket:constVariablePointer:src/video/stream_state_adapter.c", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-f4469b09cc19dae9", + "fingerprint": "cppcheck-bucket:constVariablePointer:src/web/api_handlers_go2rtc_proxy.c", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-611000c5c122ad1e", + "fingerprint": "cppcheck-bucket:constVariablePointer:src/web/api_handlers_recordings_list.c", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-d41611e4fb1c1abd", + "fingerprint": "cppcheck-bucket:constVariablePointer:src/web/api_handlers_recordings_thumbnail.c", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-b14c25475c91b307", + "fingerprint": "cppcheck-bucket:constVariablePointer:src/web/api_handlers_system_logs.c", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-03f92e362a140589", + "fingerprint": "cppcheck-bucket:constVariablePointer:src/web/api_handlers_timeline.c", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-d45c6fa42b05db96", + "fingerprint": "cppcheck-bucket:constVariablePointer:src/web/api_handlers_users_backend_agnostic.c", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-9551a431943d8273", + "fingerprint": "cppcheck-bucket:constVariablePointer:src/web/httpd_utils.c", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-86335be98f6f2e90", + "fingerprint": "cppcheck-bucket:duplicateAssignExpression:src/sod/sod.c", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-f814692d9029a8a1", + "fingerprint": "cppcheck-bucket:duplicateCondition:src/video/motion_detection.c", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-1f586f8741e770e9", + "fingerprint": "cppcheck-bucket:knownConditionTrueFalse:include/sod/sod_img_reader.h", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-95058fe138843b1f", + "fingerprint": "cppcheck-bucket:knownConditionTrueFalse:src/core/event_router.c", + "requested_owner": "maintainers/core", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-9c71189558451cd4", + "fingerprint": "cppcheck-bucket:knownConditionTrueFalse:src/core/mqtt_event_adapter.c", + "requested_owner": "maintainers/core", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-2f8dc61aeb7cdda6", + "fingerprint": "cppcheck-bucket:knownConditionTrueFalse:src/database/db_storage_targets.c", + "requested_owner": "maintainers/database", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-c7e9176ca688d280", + "fingerprint": "cppcheck-bucket:knownConditionTrueFalse:src/ezxml/ezxml.c", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-064299ecf7d09b55", + "fingerprint": "cppcheck-bucket:knownConditionTrueFalse:src/sod/sod.c", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-28b7ea4b18c686f4", + "fingerprint": "cppcheck-bucket:knownConditionTrueFalse:src/telemetry/collectors/linux_process.c", + "requested_owner": "maintainers/telemetry", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-1ac7ae81e97d3df2", + "fingerprint": "cppcheck-bucket:knownConditionTrueFalse:src/telemetry/health_helper_runner.c", + "requested_owner": "maintainers/telemetry", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-0251d17e5b89df2a", + "fingerprint": "cppcheck-bucket:knownConditionTrueFalse:src/web/api_handlers_imaging.c", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-eee46ed30daef891", + "fingerprint": "cppcheck-bucket:redundantCondition:include/sod/sod_img_reader.h", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-dcdbd8e6357d7e12", + "fingerprint": "cppcheck-bucket:redundantInitialization:include/sod/sod_img_reader.h", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-bbeef7abfa51d073", + "fingerprint": "cppcheck-bucket:redundantInitialization:src/database/db_authorization.c", + "requested_owner": "maintainers/database", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-0be349a4e3fc0518", + "fingerprint": "cppcheck-bucket:redundantInitialization:src/video/recording_path.c", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-8f929a70e127f155", + "fingerprint": "cppcheck-bucket:redundantPointerOp:src/sod/sod.c", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-147fba26f7ae351b", + "fingerprint": "cppcheck-bucket:shadowFunction:src/database/db_storage_targets.c", + "requested_owner": "maintainers/database", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-05b22ae697eaa4ca", + "fingerprint": "cppcheck-bucket:shadowFunction:src/video/stream_manager.c", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-9d2c058ee958f85a", + "fingerprint": "cppcheck-bucket:shadowVariable:include/core/config.h", + "requested_owner": "maintainers/core", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-426773bc9bc5a5d5", + "fingerprint": "cppcheck-bucket:unpreciseMathCall:src/sod/sod.c", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-eda9b7001501e847", + "fingerprint": "cppcheck-bucket:unreadVariable:include/sod/sod_img_reader.h", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-779ca0994d939da1", + "fingerprint": "cppcheck-bucket:unreadVariable:src/core/mqtt_client.c", + "requested_owner": "maintainers/core", + "disposition": "baseline-debt", + "exposure": "optional-feature", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-93112ea9a6a3c10d", + "fingerprint": "cppcheck-bucket:unreadVariable:src/sod/sod.c", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-b1b17a4b9a2646a0", + "fingerprint": "cppcheck-bucket:unreadVariable:src/video/onvif_ptz.c", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-a4ae78869ec196b6", + "fingerprint": "cppcheck-bucket:unsignedLessThanZero:src/sod/sod.c", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-efd7988ca87c95ed", + "fingerprint": "cppcheck-bucket:unusedStructMember:src/core/mqtt_destination_client.c", + "requested_owner": "maintainers/core", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-49117790281d294c", + "fingerprint": "cppcheck-bucket:unusedStructMember:src/sod/sod.c", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-a12a87ba590d2536", + "fingerprint": "cppcheck-bucket:unusedStructMember:src/video/sod_detection.c", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-56c122b53a2e50cb", + "fingerprint": "cppcheck-bucket:uselessAssignmentArg:src/sod/sod.c", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-ae4dbf08b9cfd1fe", + "fingerprint": "cppcheck-bucket:variableScope:include/sod/sod_img_reader.h", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-b9ff6009cfa26f69", + "fingerprint": "cppcheck-bucket:variableScope:include/sod/sod_img_writer.h", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-b614f3b94230fe9a", + "fingerprint": "cppcheck-bucket:variableScope:src/database/db_detection_engines.c", + "requested_owner": "maintainers/database", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-664e70c550c3ef36", + "fingerprint": "cppcheck-bucket:variableScope:src/database/db_lpr_reads.c", + "requested_owner": "maintainers/database", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-2afdb0b1f1146eeb", + "fingerprint": "cppcheck-bucket:variableScope:src/database/db_recordings.c", + "requested_owner": "maintainers/database", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-96d5b13210206feb", + "fingerprint": "cppcheck-bucket:variableScope:src/ezxml/ezxml.c", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-50bc6e286ac69abd", + "fingerprint": "cppcheck-bucket:variableScope:src/sod/sod.c", + "requested_owner": "maintainers/third-party-integration", + "disposition": "baseline-debt", + "exposure": "third-party", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-89a47a59067748c1", + "fingerprint": "cppcheck-bucket:variableScope:src/storage/storage_deletion.c", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-da5006735d5c5165", + "fingerprint": "cppcheck-bucket:variableScope:src/storage/storage_migration.c", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-51dd1a644803f48d", + "fingerprint": "cppcheck-bucket:variableScope:src/storage/storage_placement.c", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-a3e8d56a93d61112", + "fingerprint": "cppcheck-bucket:variableScope:src/storage/storage_s3.c", + "requested_owner": "maintainers/storage", + "disposition": "baseline-debt", + "exposure": "optional-feature", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-771b3fde1937be8a", + "fingerprint": "cppcheck-bucket:variableScope:src/telemetry/collectors/linux_cgroup.c", + "requested_owner": "maintainers/telemetry", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-e4dae70b5d1bd770", + "fingerprint": "cppcheck-bucket:variableScope:src/telemetry/collectors/linux_thermal.c", + "requested_owner": "maintainers/telemetry", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-9cc73ce911540ad4", + "fingerprint": "cppcheck-bucket:variableScope:src/telemetry/stream_metrics.c", + "requested_owner": "maintainers/telemetry", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-905555e786df0459", + "fingerprint": "cppcheck-bucket:variableScope:src/video/api_detection.c", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-5d0aacd6263110c5", + "fingerprint": "cppcheck-bucket:variableScope:src/video/hls/hls_directory.c", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-ec17ee32f6d27cdb", + "fingerprint": "cppcheck-bucket:variableScope:src/video/recording_transcode.c", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "CPPCHECK-BUCKET-d4393cc822a0c2d3", + "fingerprint": "cppcheck-bucket:variableScope:src/video/unified_detection_thread.c", + "requested_owner": "maintainers/video", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-366138c5d194685c", + "fingerprint": "eslint-bucket:jsx-a11y/anchor-is-valid:web/js/components/preact/Header.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-ed278d9594c2abdb", + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/GridPicker.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-67fcff31d1a4cf75", + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/HLSVideoCell.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-a642f51dfd2a124a", + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/HealthView.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-404de092ea97cc43", + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/MSEVideoCell.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-6243e36ec0fdb5cd", + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/StreamCard.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-5c63d53fbef3ba6d", + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/StreamsView.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-ab2c863c82952346", + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/ToastContainer.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-f53a71c368c33ab9", + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/UI.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-45887456841ead8b", + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/WebRTCVideoCell.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-cb235968867c79e3", + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/ZoneEditor.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-02418efc105b6ab9", + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/common/LanguageSelector.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-4e8530c09d5fd082", + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/common/ModalDialog.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-f16c5e93d86bc6f9", + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/live/LiveOperatorNavigator.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-41381cd9bd64279e", + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/recordings/RecordingsGrid.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-422485a76dc61a9b", + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/settings/Go2rtcTab.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-44ea0e63c82a7151", + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/system/ClearLogsModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-155480cbfd270011", + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/system/RestartModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-79b6e7adf4959fbc", + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/timeline/TimelinePlayer.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-0a786d21e1ee7bd2", + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/users/AccessPolicyModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-c2dc58af6543d1f5", + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/users/AddUserModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-3b71a4c47dfd1075", + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/users/ApiKeyModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-ea11ae604e62541e", + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/users/AuditHistoryModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-8d573ae471211e73", + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/users/DeleteUserModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-22666b8c08cd887e", + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/users/EditUserModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-9190884804c0c65d", + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/users/RoleManagerModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-e8ce699e42be07b3", + "fingerprint": "eslint-bucket:jsx-a11y/click-events-have-key-events:web/js/components/preact/users/TotpSetupModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-0f4bbeb4ab715fee", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/AuthGate.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-ef00a494fd69875c", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/BatchDownloadModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-e93ca9cb727a0aee", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/DetectionOverlay.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-20e1a03b32e40002", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/FleetView.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-e7e0cc4f8fd4c513", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/FullscreenManager.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-aa839344c6e5b30d", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/HLSVideoCell.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-ae74d74f4f8f96b4", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/LiveView.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-33c31857a85153c5", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/LoginView.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-2b401ef7608cff74", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/MSEVideoCell.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-6b623e0db3f455c7", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/SetupWizard.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-63e9c68b97a2b704", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/SnapshotManager.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-3d882f111ea61422", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/StreamConfigModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-ba71da8483425ebf", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/StreamsView.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-6ffa955639ab6418", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/ThemeCustomizer.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-6faae6bddf434aab", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/UI.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-9bd9a8994dceced4", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/WebRTCVideoCell.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-e845a2e465702318", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/ZoneEditor.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-1f35f119bab13f92", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/common/ModalDialog.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-5088d976b993e707", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/events/EventDestinationEditor.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-fea403cece7fffa3", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/events/EventRouteEditor.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-20d0442e85244a5d", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/fleet/BulkOrganizeModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-03b8b95f3bd44235", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/fleet/CollectionManager.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-993ef9a219cc29a2", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/fleet/CollectionSelectorBuilder.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-eaa9041228587f50", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/fleet/FleetFilters.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-19d5fc636e3f15e6", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/fleet/OrganizationManager.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-2cdd7ef73529551e", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/fleet/SavedViewsBar.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-5a25b9ace393f230", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/fleet/StaticCollectionMembers.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-12c7bb31966e53aa", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/investigation/InvestigationActions.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-274240d1fc0300f7", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/investigation/InvestigationBookmarks.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-2a20bf23c61a102e", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/investigation/InvestigationView.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-bb1a968a245405ec", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/live/LiveBuildingPlan.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-3a6fb0a94ef6ffdf", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/live/LiveOperatorNavigator.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-e0e4b387af698b40", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/live/PlanSketchControls.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-389226ea0147ea5d", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/recordings/FiltersSidebar.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-aab67d5bbb7b5489", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/recordings/RecordingsGrid.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-f492731b13ec277c", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/recordings/RecordingsTable.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-d03afa69ead3203e", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/recordings/TagsOverlay.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-8ce22b0413a485e1", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/settings/AdvancedTab.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-40ef7b2f328bb9ef", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/settings/AuthTab.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-93d2b8db97a42555", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/settings/DetectionTab.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-ea86635ccd79513e", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/settings/GeneralTab.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-5ec0649750441f81", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/settings/Go2rtcTab.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-fe8c1e237393fb23", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/settings/HealthTab.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-59e343114dc251b1", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/settings/MqttTab.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-5a1cbbfddf8f3fcc", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/settings/StorageTab.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-350da16b1c3b2274", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/settings/StreamsDefaultsTab.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-44b516dc2eeb97bf", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/system/StreamStorage.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-5da42ce096a9fa82", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/timeline/CalendarPicker.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-7b00d558899dd292", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/timeline/TimelineControls.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-4e38c49052b49016", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/timeline/TimelinePlayer.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-6af902622576c683", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/users/AddUserModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-098293b0fb5320bb", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/users/ApiKeyModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-f25f197e02c782fc", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/users/AuditHistoryModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-ccf3e6e7959d2bd7", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/users/EditUserModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-400e44e71536be4e", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/users/RoleManagerModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-d3aede71a08c3a5f", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/users/TotpSetupModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-fcf1de019f6b4533", + "fingerprint": "eslint-bucket:jsx-a11y/control-has-associated-label:web/js/components/preact/users/UsersTable.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-3469a0a703cdbc12", + "fingerprint": "eslint-bucket:jsx-a11y/interactive-supports-focus:web/js/components/preact/MobileTileGestures.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-199d3d91208953b4", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-associated-control:web/js/components/preact/BatchDownloadModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-81a756fe7228ad5b", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-associated-control:web/js/components/preact/StreamConfigModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-ddc6803a9b16e391", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-associated-control:web/js/components/preact/events/EventDestinationEditor.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-7cde28afaa9ffb65", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-associated-control:web/js/components/preact/events/EventRouteEditor.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-7dcecd444f491721", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-associated-control:web/js/components/preact/fleet/CollectionManager.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-9308fe6583bcdce7", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-associated-control:web/js/components/preact/fleet/StaticCollectionMembers.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-5e7cfcb56208eaa9", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-associated-control:web/js/components/preact/settings/HealthTab.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-e84d458d8fcd3eef", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-associated-control:web/js/components/preact/settings/StorageTab.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-cf4b93673820960b", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-associated-control:web/js/components/preact/users/ApiKeyModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-00c9eb79387b90d1", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/AuthGate.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-c603f4c09210c0bd", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/BatchDownloadModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-07e48ad6ea9ce45e", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/FleetView.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-dfeaa6c4a9abf5fa", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/LiveView.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-98f2a6813a7ad225", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/LoginView.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-e73c0530b2243573", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/SetupWizard.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-c4c40aa44f4e62e4", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/StreamCard.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-d900a116e1f06cf4", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/StreamConfigModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-de63541e57266afb", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/StreamsView.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-e810ef87137eb5d8", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/UI.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-38ac9714530327f7", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/ZoneEditor.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-b1a74f710eb47a22", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/common/ModalDialog.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-2d6e882afea8fed1", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/events/EventDestinationEditor.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-f3bd5129ab03f352", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/events/EventRouteEditor.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-7ba2e66a4eb3914f", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/fleet/BulkOrganizeModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-05ad31a80cc2b3a2", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/fleet/CollectionManager.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-30a2e484727d4a5a", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/fleet/CollectionSelectorBuilder.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-b32370126e568d01", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/fleet/FleetTable.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-f77074e66ed65721", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/fleet/OrganizationManager.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-e26c8068ece9c0e0", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/fleet/SavedViewsBar.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-4246d4277a0b8f04", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/fleet/StaticCollectionMembers.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-642b5326a1034302", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/investigation/InvestigationActions.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-c0802f3ddbb20b2e", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/investigation/InvestigationBookmarks.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-137cbeae12c87193", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/investigation/InvestigationView.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-a167dfb879b1b9cf", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/live/LiveBuildingPlan.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-b0e1dbc8e8cc536e", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/live/LiveOperatorNavigator.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-50994f387baeaa69", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/recordings/FiltersSidebar.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-dcde47440ba091e3", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/recordings/RecordingsGrid.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-114c375fcc3b4802", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/recordings/RecordingsTable.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-8b431e9fa35d81ba", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/recordings/TagsOverlay.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-a4e1217d107c230c", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/settings/AdvancedTab.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-4a0d0e1ea3635a24", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/settings/AuthTab.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-d6ed69efe339ce37", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/settings/DetectionTab.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-61d1473d84fbeea6", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/settings/GeneralTab.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-dd680edebf6809ff", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/settings/Go2rtcTab.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-e267f8f47c3806d3", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/settings/HealthTab.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-d5ecbc0292c55216", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/settings/MqttTab.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-c067bb3093f57d49", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/settings/StorageTab.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-4e8b56001c3a0722", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/settings/StreamsDefaultsTab.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-223399111dfd4016", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/settings/WorkspacesTab.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-7d2f50f4d066f6e4", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/timeline/TimelinePage.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-00d366c5691b4bb5", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/timeline/TimelinePlayer.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-7f43090b7b01626a", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/users/AccessPolicyModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-17ad0e14291e8ec3", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/users/AddUserModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-18b7f3add93999e4", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/users/ApiKeyModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-d3157833e1568912", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/users/AuditDecisionModes.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-184f5809a1f3d621", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/users/AuditHistoryModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-682efc8151a90daf", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/users/EditUserModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-2e14d60ae388c180", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/users/RoleManagerModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-9a54a74c58d29d4c", + "fingerprint": "eslint-bucket:jsx-a11y/label-has-for:web/js/components/preact/users/TotpSetupModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-165a348ebdcecd71", + "fingerprint": "eslint-bucket:jsx-a11y/media-has-caption:web/js/components/preact/HLSVideoCell.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-1760eab07e0cce49", + "fingerprint": "eslint-bucket:jsx-a11y/media-has-caption:web/js/components/preact/MSEVideoCell.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-df0c5f209b6ef6ab", + "fingerprint": "eslint-bucket:jsx-a11y/media-has-caption:web/js/components/preact/UI.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-c464a6c1e23bf196", + "fingerprint": "eslint-bucket:jsx-a11y/media-has-caption:web/js/components/preact/WebRTCVideoCell.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-de50a4c99ae7d421", + "fingerprint": "eslint-bucket:jsx-a11y/media-has-caption:web/js/components/preact/investigation/InvestigationView.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-7189b497b5a855df", + "fingerprint": "eslint-bucket:jsx-a11y/media-has-caption:web/js/components/preact/timeline/TimelinePlayer.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-bc4e9a8b10d83163", + "fingerprint": "eslint-bucket:jsx-a11y/mouse-events-have-key-events:web/js/components/preact/DayNightControl.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-c31a4d9816cac7ce", + "fingerprint": "eslint-bucket:jsx-a11y/mouse-events-have-key-events:web/js/components/preact/HLSVideoCell.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-e715a00f3dbe2f4f", + "fingerprint": "eslint-bucket:jsx-a11y/mouse-events-have-key-events:web/js/components/preact/SnapshotManager.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-9a70a1ccf37b9405", + "fingerprint": "eslint-bucket:jsx-a11y/mouse-events-have-key-events:web/js/components/preact/StreamCard.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-e876245abbef0a79", + "fingerprint": "eslint-bucket:jsx-a11y/mouse-events-have-key-events:web/js/components/preact/StreamsView.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-c811624672d6bfff", + "fingerprint": "eslint-bucket:jsx-a11y/mouse-events-have-key-events:web/js/components/preact/Toast.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-a4f59c579d19ce1e", + "fingerprint": "eslint-bucket:jsx-a11y/mouse-events-have-key-events:web/js/components/preact/WebRTCVideoCell.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-7a540f91903a1e57", + "fingerprint": "eslint-bucket:jsx-a11y/mouse-events-have-key-events:web/js/components/preact/recordings/RecordingsTable.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-dcdb657c2038e332", + "fingerprint": "eslint-bucket:jsx-a11y/mouse-events-have-key-events:web/js/components/preact/timeline/TimelinePage.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-20016996a3c7e096", + "fingerprint": "eslint-bucket:jsx-a11y/no-autofocus:web/js/components/preact/AuthGate.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-92718cbd3fc79c29", + "fingerprint": "eslint-bucket:jsx-a11y/no-autofocus:web/js/components/preact/LoginView.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-71520b6429344586", + "fingerprint": "eslint-bucket:jsx-a11y/no-autofocus:web/js/components/preact/events/EventDestinationEditor.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-82f90000b805b238", + "fingerprint": "eslint-bucket:jsx-a11y/no-autofocus:web/js/components/preact/events/EventRouteEditor.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-2acf09b0886c70c8", + "fingerprint": "eslint-bucket:jsx-a11y/no-autofocus:web/js/components/preact/fleet/CollectionManager.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-e6884093b3a77737", + "fingerprint": "eslint-bucket:jsx-a11y/no-autofocus:web/js/components/preact/fleet/OrganizationManager.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-24d767472f9eac0b", + "fingerprint": "eslint-bucket:jsx-a11y/no-autofocus:web/js/components/preact/investigation/InvestigationBookmarks.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-6040ad491a730d6d", + "fingerprint": "eslint-bucket:jsx-a11y/no-autofocus:web/js/components/preact/users/TotpSetupModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-d8c2127f8046b560", + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/FisheyeEptzCanvas.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-e4342be069acaf24", + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/StreamCard.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-141e103765b7c505", + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/ZoneEditor.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-370c727cb2690828", + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/common/LanguageSelector.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-bf7012d93c48094c", + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/investigation/InvestigationView.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-11c6ba5b7bf02e40", + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/live/LiveBuildingPlan.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-87cfe9ce5d499faf", + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/live/LiveOperatorNavigator.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-4d679d89b4da6865", + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/recordings/RecordingsGrid.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-d670cad0625d4f2c", + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/timeline/TimelineCursor.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-03caeab009bdc4fd", + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/timeline/TimelineSegments.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-939df4abd7adefdd", + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/users/AccessPolicyModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-4cf2eab3dda13b90", + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/users/AddUserModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-68103860cfe78d89", + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/users/ApiKeyModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-be996c224380b85e", + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/users/AuditHistoryModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-65f403c439392041", + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/users/EditUserModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-752682010e0c301c", + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-element-interactions:web/js/components/preact/users/RoleManagerModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-f32c4fd5a51337d3", + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-tabindex:web/js/components/preact/FisheyeEptzCanvas.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-d5958c65428cdc31", + "fingerprint": "eslint-bucket:jsx-a11y/no-noninteractive-tabindex:web/js/components/preact/common/LanguageSelector.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-45ebdb33421d89d5", + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/GridPicker.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-d6af678aacfbb026", + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/HLSVideoCell.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-e48ab90f6d76f69a", + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/HealthView.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-6cf65d94c0e817c8", + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/LiveView.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-d0493f3174391c77", + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/MSEVideoCell.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-134e1087e8cda477", + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/StreamCard.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-8a059d804561f236", + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/StreamConfigModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-21e6c2fa9c26c964", + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/StreamsView.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-b18881a630321191", + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/ToastContainer.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-d9d81163d1e1193d", + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/UI.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-3322f39793a9258c", + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/WebRTCVideoCell.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-6bdf7c909180cb5e", + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/ZoneEditor.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-243fa74ece4acc83", + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/common/ModalDialog.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-aa87081e964848f0", + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/fleet/BulkOrganizeModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-b9126919c0a748d2", + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/fleet/CollectionManager.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-ac70bbab0047fa80", + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/fleet/OrganizationManager.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-23073b0c71d7d2e3", + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/live/LiveBuildingPlan.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-be705595f12d1850", + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/live/LiveOperatorNavigator.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-55a74c5d3180cf15", + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/recordings/RecordingsGrid.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-fd743aa60d9abb1f", + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/settings/Go2rtcTab.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-fbc7ca1e0083c1d1", + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/system/ClearLogsModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-259ca1824a1d1447", + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/system/RestartModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-c06de8e6c5473e61", + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/timeline/TimelinePlayer.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-6bab06cb3c8102a9", + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/users/AccessPolicyModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-3ace786e8c2cd1a8", + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/users/AddUserModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-08d8785eb7476330", + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/users/ApiKeyModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-51093f104f4e1cbb", + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/users/AuditHistoryModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-7c82f257c4fb1103", + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/users/DeleteUserModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-c4dd2be3483455e5", + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/users/EditUserModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-5c8c07852ed0b107", + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/users/RoleManagerModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "finding", + "id": "ESLINT-BUCKET-e046fbe269eed0dc", + "fingerprint": "eslint-bucket:jsx-a11y/no-static-element-interactions:web/js/components/preact/users/TotpSetupModal.jsx", + "requested_owner": "maintainers/web", + "disposition": "baseline-debt", + "exposure": "application", + "reason_proposed": null, + "expiry_proposed": "2027-04-30", + "approval_status": "pending", + "review_needed": "Site-specific evidence and named accountable owner; existing metadata is not approval." + }, + { + "kind": "coverage_gap", + "id": "GAP-secret-scanning-disabled", + "scanner": "secret-scanning", + "condition": "not-scanned", + "requested_owner": "maintainers/security", + "reason_proposed": "GitHub secret scanning is disabled (HTTP 404) and no local secret scanner exists. NOT a clean result; enable it or add a scanner before expiry.", + "expiry_proposed": "2026-12-31", + "approval_status": "pending" + }, + { + "kind": "coverage_gap", + "id": "GAP-no-js-ts-sast", + "scanner": "codeql-javascript-typescript", + "condition": "not-scanned", + "requested_owner": "T14", + "reason_proposed": "No JS/TS security SAST is configured yet; T14 adds it.", + "expiry_proposed": "2027-01-31", + "approval_status": "pending" + }, + { + "kind": "coverage_gap", + "id": "GAP-cppcheck-config-coverage", + "scanner": "cppcheck", + "condition": "scanner-error", + "requested_owner": "T14", + "reason_proposed": "cppcheck runs without a compile database; checkersReport reports critical errors (partial analysis). Findings are still compared; resolved items are reported as unobserved, not fixed.", + "expiry_proposed": "2027-01-31", + "approval_status": "pending" + }, + { + "kind": "coverage_gap", + "id": "sanitizer-asan-ubsan", + "scanner": "sanitizer-asan-ubsan", + "condition": "missing-report", + "requested_owner": "coordinator", + "reason_proposed": "T1 recorded only the job conclusion (success at 1b8d4332 and 8927bc8a) and did not download the ctest log. Scoped to the T1 report directory only; later report directories must include the log.", + "expiry_proposed": "2026-11-30", + "approval_status": "pending" + }, + { + "kind": "dependency", + "task": "T7.8", + "id": "GHSA-3g3m-2fjr-6pw4", + "package": "glob", + "severity": "moderate", + "requested_owner": "repository maintainer (assignment pending)", + "approval_status": "pending", + "expiry_proposed": "2026-11-30", + "reason_proposed": "Jest currently requests ^10.5.0 and Sentry bundler ^13.0.6; even Jest 30.5.2 requests ^13.0.6. Patched 14.0.2 is outside these ranges.", + "exposure": "Development tooling only; web production npm audit has zero findings. Root package is integration/generation tooling. This is not an assertion that CI processing untrusted inputs is harmless.", + "mitigation_proposed": "Run build/test tooling only in disposable CI or trusted local checkout; do not expose glob patterns or Jest config as runtime user input; monitor compatible upstream releases.", + "patched_version": "14.0.2", + "source": "https://github.com/advisories/GHSA-3g3m-2fjr-6pw4", + "evidence": [ + "build/eng-artifacts/dependency-review/web-all.json", + "build/eng-artifacts/dependency-review/web-prod.json", + "build/eng-artifacts/dependency-review/root-all.json" + ] + }, + { + "kind": "dependency", + "task": "T7.9", + "id": "GHSA-g3hv-75wg-m249", + "package": "minimatch", + "severity": "moderate", + "requested_owner": "repository maintainer (assignment pending)", + "approval_status": "pending", + "expiry_proposed": "2026-11-30", + "reason_proposed": "Web lint/test/build parents and root openapi-typescript generator request older major ranges. Current ESLint 9.39.5 still requests ^3.1.5; openapi-typescript 7.13.0 is current.", + "exposure": "Development tooling only; web production npm audit has zero findings. Root package is integration/generation tooling. This is not an assertion that CI processing untrusted inputs is harmless.", + "mitigation_proposed": "Run build/test tooling only in disposable CI or trusted local checkout; do not expose glob patterns or Jest config as runtime user input; monitor compatible upstream releases.", + "patched_version": "11.0.1", + "source": "https://github.com/advisories/GHSA-g3hv-75wg-m249", + "evidence": [ + "build/eng-artifacts/dependency-review/web-all.json", + "build/eng-artifacts/dependency-review/web-prod.json", + "build/eng-artifacts/dependency-review/root-all.json" + ] + }, + { + "kind": "dependency", + "task": "T7.10", + "id": "GHSA-gcqx-w48m-w2h4", + "package": "deepmerge", + "severity": "low", + "requested_owner": "repository maintainer (assignment pending)", + "approval_status": "pending", + "expiry_proposed": "2026-11-30", + "reason_proposed": "Current published version 4.3.1 is vulnerable; no patched release. Jest 30.5.2 still requests ^4.3.1.", + "exposure": "Development tooling only; web production npm audit has zero findings. Root package is integration/generation tooling. This is not an assertion that CI processing untrusted inputs is harmless.", + "mitigation_proposed": "Run build/test tooling only in disposable CI or trusted local checkout; do not expose glob patterns or Jest config as runtime user input; monitor compatible upstream releases.", + "patched_version": null, + "source": "https://github.com/advisories/GHSA-gcqx-w48m-w2h4", + "evidence": [ + "build/eng-artifacts/dependency-review/web-all.json", + "build/eng-artifacts/dependency-review/web-prod.json", + "build/eng-artifacts/dependency-review/root-all.json" + ] + } + ] +} From 90f26a8d4bde6b83b6d592abf8b7101637873160 Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Sat, 31 Oct 2026 03:39:55 -0400 Subject: [PATCH 019/230] T9.2: type media elements and mocked Playwright routes --- quality/evidence/T9.2.md | 21 ++++++++++++++++++ .../specs/investigation.ui.spec.ts | 22 +++++++++---------- tests/integration/specs/recordings.ui.spec.ts | 10 +++++---- tests/integration/specs/streams.ui.spec.ts | 4 ++-- tests/integration/specs/timeline.ui.spec.ts | 2 +- 5 files changed, 41 insertions(+), 18 deletions(-) create mode 100644 quality/evidence/T9.2.md diff --git a/quality/evidence/T9.2.md b/quality/evidence/T9.2.md new file mode 100644 index 000000000..80d5c07fe --- /dev/null +++ b/quality/evidence/T9.2.md @@ -0,0 +1,21 @@ +# T9.2 — Media DOM and mocked routes + +RED: 23 diagnostics in investigation/recordings/streams/timeline UI specs. +GREEN for this four-file cluster: no remaining diagnostics; nine errors remain +for T9.3/T9.4. `npm run typecheck:tests` output is preserved in +`build/eng-artifacts/T9/after-T9.2.log` (exit 2 pending those tasks). + +Video locators' evaluate callbacks explicitly receive HTMLVideoElement. The +selector is `video`, and all existing readyState, dimensions, controls, +play/pause/load assertions remain. `controlsList` is checked as an actual +DOMTokenList capability; a missing capability remains false and fails the +existing assertion. Route setup accepts Playwright Page instead of any, so +Route callbacks infer their real types. ISO date slicing returns a defined +YYYY-MM-DD string without changing valid dates. + +`npx playwright test --list --reporter=list` passes. Comparing every project, +file and test title to discovery-before (ignoring moved source line numbers) +finds **213 identical test identities in 28 files**. Output is retained in +`build/eng-artifacts/T9/discovery-T9.2.log`. No assertions or runtime tests were +removed; no server or browser launched. Runtime UI execution remains in the +plan's isolated integration gates after T13. diff --git a/tests/integration/specs/investigation.ui.spec.ts b/tests/integration/specs/investigation.ui.spec.ts index 65c71d2db..d174f6ad8 100644 --- a/tests/integration/specs/investigation.ui.spec.ts +++ b/tests/integration/specs/investigation.ui.spec.ts @@ -91,7 +91,7 @@ test.describe('Investigation player regressions @ui @investigation', () => { const controls = player.locator('.investigation-player-controls'); await expect(video).toBeVisible(); - await expect.poll(() => video.evaluate(element => ({ + await expect.poll(() => video.evaluate((element: HTMLVideoElement) => ({ width: element.videoWidth, height: element.videoHeight, metadataLoaded: element.readyState >= HTMLMediaElement.HAVE_METADATA, @@ -106,8 +106,8 @@ test.describe('Investigation player regressions @ui @investigation', () => { return bounds.width / bounds.height; })).toBeCloseTo(4 / 3, 2); // Only the page's own control bar is shown; native controls would duplicate it (#568). - await expect.poll(() => video.evaluate(element => element.controls)).toBe(false); - await expect.poll(() => video.evaluate(element => + await expect.poll(() => video.evaluate((element: HTMLVideoElement) => element.controls)).toBe(false); + await expect.poll(() => video.evaluate((element: HTMLVideoElement) => getComputedStyle(element).objectFit)).toBe('contain'); await expect(controls).toBeVisible(); @@ -128,26 +128,26 @@ test.describe('Investigation player regressions @ui @investigation', () => { const video = player.locator('video'); const sharedPlay = page.locator('.investigation-play-button'); const localControls = player.locator('.investigation-player-controls'); - await expect.poll(() => video.evaluate(el => el.readyState)).toBeGreaterThanOrEqual(2); + await expect.poll(() => video.evaluate((el: HTMLVideoElement) => el.readyState)).toBeGreaterThanOrEqual(2); // These are real media events, as emitted by the browser's native controls. - await video.evaluate(el => el.play()); + await video.evaluate((el: HTMLVideoElement) => el.play()); await expect(sharedPlay).toContainText('Pause'); await expect(localControls.getByRole('button', { name: 'Pause' })).toBeVisible(); - await video.evaluate(el => el.pause()); + await video.evaluate((el: HTMLVideoElement) => el.pause()); await expect(sharedPlay).toContainText('Play'); await expect(localControls.getByRole('button', { name: 'Play', exact: true })).toBeVisible(); await sharedPlay.click(); - await expect.poll(() => video.evaluate(el => el.paused)).toBe(false); + await expect.poll(() => video.evaluate((el: HTMLVideoElement) => el.paused)).toBe(false); // load() emits pause while resetting the media element. It must not pause // the shared investigation clock or other cameras. - await video.evaluate(el => el.load()); - await expect.poll(() => video.evaluate(el => el.readyState)).toBeGreaterThanOrEqual(2); - await expect.poll(() => video.evaluate(el => el.paused)).toBe(false); + await video.evaluate((el: HTMLVideoElement) => el.load()); + await expect.poll(() => video.evaluate((el: HTMLVideoElement) => el.readyState)).toBeGreaterThanOrEqual(2); + await expect.poll(() => video.evaluate((el: HTMLVideoElement) => el.paused)).toBe(false); await expect(sharedPlay).toContainText('Pause'); - await video.evaluate(el => el.pause()); + await video.evaluate((el: HTMLVideoElement) => el.pause()); await expect(sharedPlay).toContainText('Play'); }); diff --git a/tests/integration/specs/recordings.ui.spec.ts b/tests/integration/specs/recordings.ui.spec.ts index fbc3149c6..476c53e1c 100644 --- a/tests/integration/specs/recordings.ui.spec.ts +++ b/tests/integration/specs/recordings.ui.spec.ts @@ -5,7 +5,7 @@ * @tags @ui @recordings */ -import { test, expect } from '@playwright/test'; +import { test, expect, type Page } from '@playwright/test'; import { RecordingsPage } from '../pages/RecordingsPage'; import { USERS, login, sleep } from '../fixtures/test-fixtures'; import { serveRecordingMedia } from '../fixtures/recording-media'; @@ -119,7 +119,7 @@ test.describe('Recordings Page @ui @recordings', () => { if (await recordingsPage.dateFilter.isVisible()) { // Get today's date in YYYY-MM-DD format - const today = new Date().toISOString().split('T')[0]; + const today = new Date().toISOString().slice(0, 10); await recordingsPage.filterByDate(today); console.log(`Filtered by date: ${today}`); @@ -375,7 +375,9 @@ test.describe('Recordings Page @ui @recordings', () => { }); await expect(page.locator('#recording-playback-position')).toHaveText('cam1 - 00:00:12'); - await expect.poll(() => page.locator('#video-preview-modal video').evaluate(video => video.controlsList?.contains('nofullscreen') ?? false)).toBe(true); + await expect.poll(() => page.locator('#video-preview-modal video').evaluate(video => + 'controlsList' in video && video.controlsList instanceof DOMTokenList && + video.controlsList.contains('nofullscreen'))).toBe(true); await expect(page.locator('#detection-overlay-checkbox')).toBeEnabled(); await page.locator('#detection-overlay-checkbox').check(); @@ -562,7 +564,7 @@ test.describe('Recordings Page @ui @recordings', () => { test.describe('i18n — table column headers and toolbar labels', () => { /** Shared route setup for recordings table i18n tests */ - async function setupRecordingsMocks(page: any) { + async function setupRecordingsMocks(page: Page) { await page.addInitScript(() => { localStorage.setItem('recordings_view_mode', 'table'); }); diff --git a/tests/integration/specs/streams.ui.spec.ts b/tests/integration/specs/streams.ui.spec.ts index 937d8a39d..ddaf4b2ea 100644 --- a/tests/integration/specs/streams.ui.spec.ts +++ b/tests/integration/specs/streams.ui.spec.ts @@ -5,7 +5,7 @@ * @tags @ui @streams */ -import { test, expect } from '@playwright/test'; +import { test, expect, type Page } from '@playwright/test'; import { StreamsPage } from '../pages/StreamsPage'; import { CONFIG, USERS, login, sleep, getAuthHeader } from '../fixtures/test-fixtures'; @@ -209,7 +209,7 @@ test.describe('Streams Page @ui @streams', () => { const MOCK_STREAM_NAME = 'test_pattern'; // Minimal stream list + full-detail stubs for route-based clone tests - async function setupCloneMocks(page: any) { + async function setupCloneMocks(page: Page) { await page.route(/\/api\/streams(?:\?.*)?$/, route => route.fulfill({ json: { streams: [{ name: MOCK_STREAM_NAME, diff --git a/tests/integration/specs/timeline.ui.spec.ts b/tests/integration/specs/timeline.ui.spec.ts index 96c7dce07..f42262dd8 100644 --- a/tests/integration/specs/timeline.ui.spec.ts +++ b/tests/integration/specs/timeline.ui.spec.ts @@ -96,7 +96,7 @@ test.describe('Timeline Page @ui @timeline', () => { // Navigate to yesterday const yesterday = new Date(); yesterday.setDate(yesterday.getDate() - 1); - const dateStr = yesterday.toISOString().split('T')[0]; + const dateStr = yesterday.toISOString().slice(0, 10); await timelinePage.goToDate(dateStr); console.log(`Navigated to date: ${dateStr}`); From de3fea4ec4fff6e57291fda431815dadfa3dead9 Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Sat, 31 Oct 2026 03:39:57 -0400 Subject: [PATCH 020/230] docs: integrate remediation and test typing execution graph --- engineering-foundation-plan.md | 6249 +++++++++++++++++++++++++++++++- quality/remediation-map.json | 20 +- 2 files changed, 6239 insertions(+), 30 deletions(-) diff --git a/engineering-foundation-plan.md b/engineering-foundation-plan.md index 1f3195d23..2c3ffc8e8 100644 --- a/engineering-foundation-plan.md +++ b/engineering-foundation-plan.md @@ -238,9 +238,9 @@ records and gate dependencies must be added by the named producer. - `python3 -m json.tool quality/target-profiles.json` - `python3 -m json.tool quality/runtime-budgets.json` - Repeat the recorded workload on the named device/browser and compare samples under the declared method. -- **status**: Not Completed -- **log**: -- **files edited/created**: +- **status**: Inventory/protocol completed (commit `e0544701`); physical calibration deferred by user +- **log**: Nine release target combinations and two immutable web profiles recorded; JSON/invariant checks pass, 12 native archive files and 221/165 web files hash-verified. Three host-only idle runs (180 samples) recorded 55,524–56,272 KiB RSS, 18 FDs, 21 threads and graceful exits; these are not constrained acceptance. Physical NVR/browser targets and 18 runtime limits remain null/unqualified, explicitly deferred by the user. Independent development may consume the protocol; physical-resource acceptance remains open. +- **files edited/created**: `quality/target-profiles.json`, `quality/runtime-budgets.json`, `quality/evidence/T5.md` ### T6: Implement finding identity and exception policy checks - **depends_on**: [T1] @@ -268,9 +268,9 @@ records and gate dependencies must be added by the named producer. - **validation**: - `python3 -m json.tool quality/remediation-map.json` - Coordinator checks graph, ownership, evidence producers, and finding-to-task completeness before releasing fix workers. -- **status**: Not Completed -- **log**: -- **files edited/created**: +- **status**: Completed (commits `3eb4d251`, `f9b2f0cf`, `4a390c02`; coordinator integrated expanded records) +- **log**: All 743 fingerprints and 17 T11 candidates mapped to bounded tasks; 335 child records with exact ownership, assertions, dependencies and planned commands. Same-file writers serialized; T33 fenced by every child; pilot/dependency gates updated. Static DAG/coverage checks and eight negative controls pass. No findings approvals or remediation completion inferred from planning. T7.1 already fixed in c285a0c2. +- **files edited/created**: `quality/remediation-map.json`, `quality/evidence/T7.md`, `quality/evidence/T7-expansion.md`, `quality/evidence/T7-check.py`, this plan ### T8: Establish strict TS, package, and Jest infrastructure - **depends_on**: [T2, T4, T11] @@ -287,9 +287,9 @@ records and gate dependencies must be added by the named producer. - `npm --prefix web test -- --runInBand` - `npm --prefix web run build` - Introduce/remove one temporary invalid prop in the fixture and verify a nonzero type-check exit. -- **status**: Not Completed -- **log**: -- **files edited/created**: +- **status**: Completed (commit `17de8155`) +- **log**: RED missing TSX discovery -> GREEN 55 suites/571 tests; strict Preact fixture checks and executes, deliberate invalid prop fails. Root/web clean installs and peer compatibility verified; both Vite profiles build. Pinned TS5.9.3 and Babel8-compatible transforms without changing installed majors. Root test type command exists but intentionally awaits T9 config. All legacy application JS remains explicitly unchecked. T11 compatibility proof covers 91 fixtures, generated types and browser-bundled Ajv helpers. +- **files edited/created**: root/web package manifests and locks, web Babel/Jest/ESLint configs, web tsconfigs, `web/tests/types/`, `quality/toolchain.json`, `quality/evidence/T8.md` ### T9: Type-check existing integration and load-test code - **depends_on**: [T3, T8] @@ -303,8 +303,8 @@ records and gate dependencies must be added by the named producer. - `npm run typecheck:tests` (script registered by T8) - `npx playwright test --list` - Review the load CLI's typed configuration/argument flow without sending load; compiler coverage is the acceptance check for that code here. -- **status**: Not Completed -- **log**: +- **status**: Expansion recorded; T9.1–T9.4 in progress +- **log**: Strict test config discovers 38 errors in 12 files; 213 Playwright tests in 28 files before changes. Coordinator accepted four bounded serial repair tasks and added final T9.4 to T13/T15. Initial diagnostics are RED contract; no broad ambient any or removed coverage allowed. - **files edited/created**: ### T10: Preserve lint, hooks, and i18n across extension changes @@ -356,7 +356,7 @@ records and gate dependencies must be added by the named producer. - **files edited/created**: ### T13: Isolate native, API, and UI validation runs -- **depends_on**: [T3, T9] +- **depends_on**: [T3, T9, T9.4] - **agent_type**: local - **ownership**: `scripts/quality/run-native.py`, `scripts/quality/run-integration.mjs`, `tests/integration/global-{setup,teardown}.ts`, shared integration fixtures/configuration, `playwright.config.ts`, `tests/unit/CMakeLists.txt`, `tests/quality/test_runners.py`. - **description**: Create task-scoped test runners and configure ports/storage/PIDs/reports consistently. Replace current fixed-port assumptions and generated config mismatches, or retain explicit serialization where hardcoding cannot be safely removed. Protect cleanup with run ownership, loopback-only targets, and PID provenance. Add an `eng` test-fragment registration seam for later native tests. Runner builds/binary selection and optional go2rtc fixtures must be explicit. @@ -373,7 +373,7 @@ records and gate dependencies must be added by the named producer. - **files edited/created**: ### T14: Wire analysis reports and blocking policy into CI -- **depends_on**: [T6, T8, T10] +- **depends_on**: [T6, T8, T10, T7.1] - **agent_type**: local - **ownership**: `.github/workflows/static-analysis.yml`, `codeql-analysis.yml`, `container-scan.yml`, `quality/scanners.json` scope extensions, `quality/evidence/T14.md`. - **description**: Preserve raw-report artifacts while applying the T6 policy. Add frontend JS/TS security coverage and explicit production/development dependency reports. Record scanner exit/report status independently; ensure changed tool/database versions remain visible. Do not mistake CodeQL upload success for an enforced no-new-alert gate; connect actual finding policy or verified repository code-scanning rules. @@ -388,7 +388,7 @@ records and gate dependencies must be added by the named producer. - **files edited/created**: ### T15: Integrate foundation checks and required-status policy -- **depends_on**: [T4, T7, T9, T10, T12, T13, T14] +- **depends_on**: [T4, T7, T9, T10, T12, T13, T14, T7.8, T7.9, T7.10, T9.4] - **agent_type**: local - **ownership**: shared manifests/lockfiles, `.github/workflows/integration-test.yml`, new engineering workflow if justified, `quality/required-checks.json`, `quality/evidence/T15.md`. - **description**: Resolve infrastructure changes, finalize command registrations and dependency pins, and add local/CI type/lint/unit/asset/schema statuses with explicit path-filter behavior. T39 activates real pilot contract CI once T18 exists; never allow an empty future suite to report success. Produce the concrete required-status settings for T38, without making remote administrative access a prerequisite for local development. @@ -454,7 +454,7 @@ records and gate dependencies must be added by the named producer. - **files edited/created**: ### T18: Test pilot contracts against the real C backend -- **depends_on**: [T15] +- **depends_on**: [T15, T7.334] - **agent_type**: worker - **ownership**: `tests/integration/specs/streams-contract.api.spec.ts`, `tests/contracts/fixtures/streams/` test additions, `quality/evidence/T18.md`; C/schema fixes go through owners. - **description**: Add @contract tests for admin/viewer/denied access, redaction, list/summary/full variants, encoded names, valid edit, rejected edit with unchanged state, and option dependencies. Verify sensitive-field absence independently of permissive schema validation. Use synthetic test accounts/data. @@ -484,7 +484,7 @@ records and gate dependencies must be added by the named producer. - **files edited/created**: ### T19: Type query/mutation interfaces and pilot API client -- **depends_on**: [T16] +- **depends_on**: [T16, T7.334] - **agent_type**: worker - **ownership**: `web/js/query-client.{js,ts}`, `web/js/api/streams.ts`, `web/tests/queryClient.spec.ts`, `web/tests/streamsClient.spec.ts`. - **description**: Preserve both existing query call forms and cache behavior. Type keys, decoder-derived results, mutation input/output, invalidation and cancellation. Use generated pilot types/validators from T12. Isolate any inadequate third-party typings behind a narrow tested adapter, not a module-wide any declaration. @@ -499,7 +499,7 @@ records and gate dependencies must be added by the named producer. - **files edited/created**: ### T20: Type the edit form and form model -- **depends_on**: [T17, T18, T19] +- **depends_on**: [T17, T18, T19, T7.167, T7.177, T7.180, T7.198] - **agent_type**: worker - **ownership**: `web/js/components/preact/StreamConfigModal.{jsx,tsx}`, new `web/js/components/preact/streams/streamForm.ts`, `web/tests/streamForm.spec.ts`. - **description**: Separate editable strings/checkboxes/schedules from wire models. Preserve full-detail loading, secret/redacted-field semantics, tri-state retention, optional values, and unchanged-field submission. Describe any ZoneEditor/legacy child boundary explicitly without assuming unknown props are safe. @@ -514,7 +514,7 @@ records and gate dependencies must be added by the named producer. - **files edited/created**: ### T21: Type stream cards without changing snapshot behavior -- **depends_on**: [T17, T18, T19] +- **depends_on**: [T17, T18, T19, T7.161, T7.180, T7.189, T7.193, T7.197] - **agent_type**: worker - **ownership**: `web/js/components/preact/StreamCard.{jsx,tsx}`, `web/tests/streamCard.spec.ts`. - **description**: Type redacted operational data, callbacks, and badge helpers. Preserve bounded snapshot concurrency, cleanup/release, async actions, and mobile markup; edit/delete/bulk behavior outside list/edit remains delegated through explicit callbacks. @@ -529,7 +529,7 @@ records and gate dependencies must be added by the named producer. - **files edited/created**: ### T22: Integrate the typed Streams list/edit feature -- **depends_on**: [T20, T21] +- **depends_on**: [T20, T21, T7.161, T7.168, T7.180, T7.189, T7.198] - **agent_type**: local - **ownership**: `web/js/components/preact/StreamsView.jsx`, new `web/js/components/preact/streams/StreamListEditor.tsx`, `web/js/pages/streams-page.jsx`, pilot import shims. T10's canonical i18n identity already covers renames. - **description**: Wire the typed API/model/components into the existing page. Extract list/edit orchestration if needed so ONVIF/create/delete/bulk workflows remain separately inventoried. Give cross-boundary values explicit validated shapes; do not label the remaining legacy view fully migrated. Preserve filters, layout, auth, toasts, localization, and pending behavior. @@ -577,7 +577,7 @@ records and gate dependencies must be added by the named producer. - **files edited/created**: ### T25: Materialize the remaining frontend and API rollout -- **depends_on**: [T2, T24] +- **depends_on**: [T2, T24, T7.160, T7.161, T7.162, T7.163, T7.164, T7.165, T7.166, T7.167, T7.168, T7.169, T7.170, T7.171, T7.172, T7.173, T7.174, T7.175, T7.176, T7.177, T7.178, T7.179, T7.180, T7.181, T7.182, T7.183, T7.184, T7.185, T7.186, T7.187, T7.188, T7.189, T7.190, T7.191, T7.192, T7.193, T7.194, T7.195, T7.196, T7.197, T7.198, T7.199, T7.200, T7.201, T7.202, T7.273] - **agent_type**: local - **ownership**: this plan, `quality/rollout-map.json`, consolidated application/API inventory updates; code read-only. - **description**: Apply the mandatory expansion protocol using measured pilot cost. Cover shared auth/i18n/navigation/UI first; then Live transport helpers/cells and the shared Live view; recordings/timeline; settings tabs; system/health; users/audit; fleet; events; investigation/LPR; remaining stream/ONVIF/bulk flows; and every leftover utility/page/test. Split each area into small exact file clusters. Add its schema and real C contract tests before typed consumers. Include raw-source test paths, imports, legacy shims, and non-JSON media protocols. Insert explicit local T25.* schema-aggregation/code-generation/package checkpoints before each dependent consumer wave, with exclusive write ownership; those checkpoints must not depend on downstream T26. Attach all terminal tasks to T26. @@ -696,7 +696,7 @@ records and gate dependencies must be added by the named producer. - **files edited/created**: ### T33: Verify remediation closure and refresh findings evidence -- **depends_on**: [T7, T14] +- **depends_on**: [T7, T14, T7.1, T7.2, T7.3, T7.4, T7.5, T7.6, T7.7, T7.8, T7.9, T7.10, T7.11, T7.12, T7.13, T7.14, T7.15, T7.16, T7.17, T7.18, T7.19, T7.20, T7.21, T7.22, T7.23, T7.24, T7.25, T7.26, T7.27, T7.28, T7.29, T7.30, T7.31, T7.32, T7.33, T7.34, T7.35, T7.36, T7.37, T7.38, T7.39, T7.40, T7.41, T7.42, T7.43, T7.44, T7.45, T7.46, T7.47, T7.48, T7.49, T7.50, T7.51, T7.52, T7.53, T7.54, T7.55, T7.56, T7.57, T7.58, T7.59, T7.60, T7.61, T7.62, T7.63, T7.64, T7.65, T7.66, T7.67, T7.68, T7.69, T7.70, T7.71, T7.72, T7.73, T7.74, T7.75, T7.76, T7.77, T7.78, T7.79, T7.80, T7.81, T7.82, T7.83, T7.84, T7.85, T7.86, T7.87, T7.88, T7.89, T7.90, T7.91, T7.92, T7.93, T7.94, T7.95, T7.96, T7.97, T7.98, T7.99, T7.100, T7.101, T7.102, T7.103, T7.104, T7.105, T7.106, T7.107, T7.108, T7.109, T7.110, T7.111, T7.112, T7.113, T7.114, T7.115, T7.116, T7.117, T7.118, T7.119, T7.120, T7.121, T7.122, T7.123, T7.124, T7.125, T7.126, T7.127, T7.128, T7.129, T7.130, T7.131, T7.132, T7.133, T7.134, T7.135, T7.136, T7.137, T7.138, T7.139, T7.140, T7.141, T7.142, T7.143, T7.144, T7.145, T7.146, T7.147, T7.148, T7.149, T7.150, T7.151, T7.152, T7.153, T7.154, T7.155, T7.156, T7.157, T7.158, T7.159, T7.160, T7.161, T7.162, T7.163, T7.164, T7.165, T7.166, T7.167, T7.168, T7.169, T7.170, T7.171, T7.172, T7.173, T7.174, T7.175, T7.176, T7.177, T7.178, T7.179, T7.180, T7.181, T7.182, T7.183, T7.184, T7.185, T7.186, T7.187, T7.188, T7.189, T7.190, T7.191, T7.192, T7.193, T7.194, T7.195, T7.196, T7.197, T7.198, T7.199, T7.200, T7.201, T7.202, T7.203, T7.204, T7.205, T7.206, T7.207, T7.208, T7.209, T7.210, T7.211, T7.212, T7.213, T7.214, T7.215, T7.216, T7.217, T7.218, T7.219, T7.220, T7.221, T7.222, T7.223, T7.224, T7.225, T7.226, T7.227, T7.228, T7.229, T7.230, T7.231, T7.232, T7.233, T7.234, T7.235, T7.236, T7.237, T7.238, T7.239, T7.240, T7.241, T7.242, T7.243, T7.244, T7.245, T7.246, T7.247, T7.248, T7.249, T7.250, T7.251, T7.252, T7.253, T7.254, T7.255, T7.256, T7.257, T7.258, T7.259, T7.260, T7.261, T7.262, T7.263, T7.264, T7.265, T7.266, T7.267, T7.268, T7.269, T7.270, T7.271, T7.272, T7.273, T7.274, T7.275, T7.276, T7.277, T7.278, T7.279, T7.280, T7.281, T7.282, T7.283, T7.284, T7.285, T7.286, T7.287, T7.288, T7.289, T7.290, T7.291, T7.292, T7.293, T7.294, T7.295, T7.296, T7.297, T7.298, T7.299, T7.300, T7.301, T7.302, T7.303, T7.304, T7.305, T7.306, T7.307, T7.308, T7.309, T7.310, T7.311, T7.312, T7.313, T7.314, T7.315, T7.316, T7.317, T7.318, T7.319, T7.320, T7.321, T7.322, T7.323, T7.324, T7.325, T7.326, T7.327, T7.328, T7.329, T7.330, T7.331, T7.332, T7.333, T7.334, T7.335, T38] - **agent_type**: local - **ownership**: findings dispositions/inventory, `quality/evidence/T33.md`; production changes only through explicit fix tasks. - **description**: **Locked until all T7.* terminal dependencies are inserted and complete.** Re-run scanners on the integrated revision. Resolve any new actionable findings through additional atomic tasks and dependencies. Check exceptions against current exposure/upstream state and expiry. Do not replace evidence with bulk suppression or warning-count reduction. @@ -777,6 +777,6211 @@ records and gate dependencies must be added by the named producer. - **log**: - **files edited/created**: + +## Expanded remediation tasks (T7) + + +T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15; T10 → web remediation → overlapping pilot migrations and T25; T13 → native/pilot remediations; T12 + pilot remediations → contract reconciliation → T18/T19; every T7.* → T33. Within these frontiers, depends_on includes each previous writer of the same path. + +| Frontier | Tasks | Resource constraints | +| --- | --- | --- | +| Policy/reviews | Tasks whose only producer is T6/T7/T11 | No production workload; approvals remain pending | +| Dependency | kind=dependency after T8 | One package/install/build writer, then T15 | +| Web | kind=web-fix after T10 | Max three workers; unique focused Jest files, exclusive full lint/build | +| Native/pilot | kind=native-fix/pilot-fix after T13 | Shared server/native operations serialized by runner lease; exact CMake fragments | +| Reconciliation | kind=integration after T12 and all pilot fixes | Exclusive generation, followed by T18/T19 | +| Closure | all T7.* then T33 | Fresh complete scanners; unresolved reviews block | + +### T7.1: Reject unapproved findings and coverage exceptions +- **depends_on**: [T7, T6] +- **agent_type**: local +- **ownership**: `scripts/quality/findings.py`, `tests/quality/test_findings.py`, `quality/findings-policy.json`, `quality/evidence/T7.1.md`. +- **priority**: high +- **description**: Require explicit reviewed approval evidence before an exception can affect --check or --release. The existing proposed-by-T1/T6 dates and maintainers/ owners are proposals, not approvals. Preserve diagnostic reporting and the read-only normal check. Do not silently bless old records during schema migration. +- **findings**: policy/integration requirement +- **acceptance_criteria**: + - Tests first prove proposed, missing, expired and malformed approvals fail; an explicitly approved current exception succeeds only in its permitted mode. + - An approval must name an accountable reviewer/owner, date and reason; placeholders do not qualify. --release still rejects coverage gaps. + - Run against actual T1 reports: unapproved proposals must cause policy failure. Hash the inventory before/after --check. +- **validation**: + - `python3 -m unittest discover -s tests/quality -p test_findings.py` + - `python3 scripts/quality/findings.py --check --reports build/eng-artifacts/T1 --inventory quality/findings.json` +- **status**: Completed (commit `c285a0c2`) +- **log**: Coordinator implemented RED -> GREEN approval enforcement: 65 tests pass; real T1 fails 575 inventory and 4 gap approval proposals; no accepted gaps. Metadata validation does not authenticate a human approval; do not fabricate production approval records. +- **files edited/created**: + +### T7.2: Verify disposition and regression evidence for ADVISORY-GHSA-cv53-mq7p-6jp2 +- **depends_on**: [T7] +- **agent_type**: local +- **ownership**: `quality/reviews/advisory-ghsa-cv53-mq7p-6jp2.json`, `quality/evidence/T7.2.md`. +- **priority**: high +- **description**: Read the source advisory through authorized access; record sanitized affected paths, fixed revision and exact existing regression command without publishing private identifiers or text. Published-version exclusion alone is not regression proof. If a regression or fix is absent, append a bounded child task and add it to T33 before this review can close; inaccessible private evidence leaves this task blocked. +- **findings**: ADVISORY-GHSA-cv53-mq7p-6jp2 +- **acceptance_criteria**: + - Confirm state and affected/current versions at the actual execution date. + - Record reviewer, evidence reference and passing regression, or explicit unresolved blocker; a draft or closed label alone is not a verified fix. + - No private advisory text, IDs or credentials in committed evidence. +- **validation**: + - `python3 -m json.tool quality/reviews/advisory-ghsa-cv53-mq7p-6jp2.json` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.3: Verify disposition and regression evidence for ADVISORY-repo-advisory-draft-1 +- **depends_on**: [T7] +- **agent_type**: local +- **ownership**: `quality/reviews/advisory-repo-advisory-draft-1.json`, `quality/evidence/T7.3.md`. +- **priority**: high +- **description**: Read the source advisory through authorized access; record sanitized affected paths, fixed revision and exact existing regression command without publishing private identifiers or text. Published-version exclusion alone is not regression proof. If a regression or fix is absent, append a bounded child task and add it to T33 before this review can close; inaccessible private evidence leaves this task blocked. +- **findings**: ADVISORY-repo-advisory-draft-1 +- **acceptance_criteria**: + - Confirm state and affected/current versions at the actual execution date. + - Record reviewer, evidence reference and passing regression, or explicit unresolved blocker; a draft or closed label alone is not a verified fix. + - No private advisory text, IDs or credentials in committed evidence. +- **validation**: + - `python3 -m json.tool quality/reviews/advisory-repo-advisory-draft-1.json` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.4: Verify disposition and regression evidence for ADVISORY-repo-advisory-closed-1 +- **depends_on**: [T7] +- **agent_type**: local +- **ownership**: `quality/reviews/advisory-repo-advisory-closed-1.json`, `quality/evidence/T7.4.md`. +- **priority**: high +- **description**: Read the source advisory through authorized access; record sanitized affected paths, fixed revision and exact existing regression command without publishing private identifiers or text. Published-version exclusion alone is not regression proof. If a regression or fix is absent, append a bounded child task and add it to T33 before this review can close; inaccessible private evidence leaves this task blocked. +- **findings**: ADVISORY-repo-advisory-closed-1 +- **acceptance_criteria**: + - Confirm state and affected/current versions at the actual execution date. + - Record reviewer, evidence reference and passing regression, or explicit unresolved blocker; a draft or closed label alone is not a verified fix. + - No private advisory text, IDs or credentials in committed evidence. +- **validation**: + - `python3 -m json.tool quality/reviews/advisory-repo-advisory-closed-1.json` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.5: Verify disposition and regression evidence for ADVISORY-repo-advisory-draft-2 +- **depends_on**: [T7] +- **agent_type**: local +- **ownership**: `quality/reviews/advisory-repo-advisory-draft-2.json`, `quality/evidence/T7.5.md`. +- **priority**: high +- **description**: Read the source advisory through authorized access; record sanitized affected paths, fixed revision and exact existing regression command without publishing private identifiers or text. Published-version exclusion alone is not regression proof. If a regression or fix is absent, append a bounded child task and add it to T33 before this review can close; inaccessible private evidence leaves this task blocked. +- **findings**: ADVISORY-repo-advisory-draft-2 +- **acceptance_criteria**: + - Confirm state and affected/current versions at the actual execution date. + - Record reviewer, evidence reference and passing regression, or explicit unresolved blocker; a draft or closed label alone is not a verified fix. + - No private advisory text, IDs or credentials in committed evidence. +- **validation**: + - `python3 -m json.tool quality/reviews/advisory-repo-advisory-draft-2.json` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.6: Verify disposition and regression evidence for ADVISORY-GHSA-rqj3-pch5-rq4f +- **depends_on**: [T7] +- **agent_type**: local +- **ownership**: `quality/reviews/advisory-ghsa-rqj3-pch5-rq4f.json`, `quality/evidence/T7.6.md`. +- **priority**: critical +- **description**: Read the source advisory through authorized access; record sanitized affected paths, fixed revision and exact existing regression command without publishing private identifiers or text. Published-version exclusion alone is not regression proof. If a regression or fix is absent, append a bounded child task and add it to T33 before this review can close; inaccessible private evidence leaves this task blocked. +- **findings**: ADVISORY-GHSA-rqj3-pch5-rq4f +- **acceptance_criteria**: + - Confirm state and affected/current versions at the actual execution date. + - Record reviewer, evidence reference and passing regression, or explicit unresolved blocker; a draft or closed label alone is not a verified fix. + - No private advisory text, IDs or credentials in committed evidence. +- **validation**: + - `python3 -m json.tool quality/reviews/advisory-ghsa-rqj3-pch5-rq4f.json` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.7: Verify disposition and regression evidence for ADVISORY-GHSA-pvw7-7j8c-qx96 +- **depends_on**: [T7] +- **agent_type**: local +- **ownership**: `quality/reviews/advisory-ghsa-pvw7-7j8c-qx96.json`, `quality/evidence/T7.7.md`. +- **priority**: high +- **description**: Read the source advisory through authorized access; record sanitized affected paths, fixed revision and exact existing regression command without publishing private identifiers or text. Published-version exclusion alone is not regression proof. If a regression or fix is absent, append a bounded child task and add it to T33 before this review can close; inaccessible private evidence leaves this task blocked. +- **findings**: ADVISORY-GHSA-pvw7-7j8c-qx96 +- **acceptance_criteria**: + - Confirm state and affected/current versions at the actual execution date. + - Record reviewer, evidence reference and passing regression, or explicit unresolved blocker; a draft or closed label alone is not a verified fix. + - No private advisory text, IDs or credentials in committed evidence. +- **validation**: + - `python3 -m json.tool quality/reviews/advisory-ghsa-pvw7-7j8c-qx96.json` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.8: Remediate glob dependency advisory GHSA-3g3m-2fjr-6pw4 +- **depends_on**: [T7, T8] +- **agent_type**: local +- **ownership**: `web/package.json`, `web/package-lock.json`, `quality/evidence/T7.8.md`. +- **priority**: medium +- **description**: Resolve GHSA-3g3m-2fjr-6pw4 for glob using an actually available compatible patched transitive version or remove the vulnerable dependency path. Inspect npm explain and production/dev reachability. Preserve Node 24 and installed direct major versions. If no compatible fix exists, submit a specific owner/expiry/rationale proposal and keep this task open until explicitly reviewed; do not force an unrelated major upgrade. +- **findings**: NPM-WEB-GHSA-3g3m-2fjr-6pw4-glob +- **acceptance_criteria**: + - npm audit no longer reports the advisory on each original dependency path, or an explicitly reviewed current exception documents the residual exposure. + - Dependency graph, unit tests and both web builds remain compatible; no broad overrides that violate parent ranges. +- **validation**: + - `npm --prefix web explain glob` + - `npm --prefix web audit --json` + - `npm --prefix web audit --omit=dev --json` + - `npm --prefix web test -- --runInBand` + - `npm --prefix web run build` + - `LIGHTNVR_WEB_LEGACY=false npm --prefix web run build` +- **status**: Blocked — review prepared, awaiting compatible fix or maintainer decision +- **log**: Concrete review packet committed in `713b3025`; no package mutation, approval or disposition change. Current development-tool advisory ranges and dependency parents checked; production web audit zero. See task evidence and `quality/reviews/exception-ownership.json`. +- **files edited/created**: + +### T7.9: Remediate minimatch dependency advisory GHSA-g3hv-75wg-m249 +- **depends_on**: [T7, T8, T7.8] +- **agent_type**: local +- **ownership**: `web/package.json`, `web/package-lock.json`, `package.json`, `package-lock.json`, `quality/evidence/T7.9.md`. +- **priority**: medium +- **description**: Resolve GHSA-g3hv-75wg-m249 for minimatch using an actually available compatible patched transitive version or remove the vulnerable dependency path. Inspect npm explain and production/dev reachability. Preserve Node 24 and installed direct major versions. If no compatible fix exists, submit a specific owner/expiry/rationale proposal and keep this task open until explicitly reviewed; do not force an unrelated major upgrade. +- **findings**: NPM-WEB-GHSA-g3hv-75wg-m249-minimatch + T8 adds the root openapi-typescript/redocly dev path for the same minimatch advisory; root manifests are included and T33 must reconcile the new occurrence without automatic baseline changes. +- **acceptance_criteria**: + - npm audit no longer reports the advisory on each original dependency path, or an explicitly reviewed current exception documents the residual exposure. + - Dependency graph, unit tests and both web builds remain compatible; no broad overrides that violate parent ranges. +- **validation**: + - `npm --prefix web explain minimatch` + - `npm --prefix web audit --json` + - `npm --prefix web audit --omit=dev --json` + - `npm --prefix web test -- --runInBand` + - `npm --prefix web run build` + - `LIGHTNVR_WEB_LEGACY=false npm --prefix web run build` + - `npm explain minimatch` + - `npm audit --json` + - `npm audit --omit=dev --json` +- **status**: Blocked — review prepared, awaiting compatible fix or maintainer decision +- **log**: Concrete review packet committed in `713b3025`; no package mutation, approval or disposition change. Current development-tool advisory ranges and dependency parents checked; production web audit zero. See task evidence and `quality/reviews/exception-ownership.json`. +- **files edited/created**: + +### T7.10: Remediate deepmerge dependency advisory GHSA-gcqx-w48m-w2h4 +- **depends_on**: [T7, T8, T7.9] +- **agent_type**: local +- **ownership**: `web/package.json`, `web/package-lock.json`, `quality/evidence/T7.10.md`. +- **priority**: medium +- **description**: Resolve GHSA-gcqx-w48m-w2h4 for deepmerge using an actually available compatible patched transitive version or remove the vulnerable dependency path. Inspect npm explain and production/dev reachability. Preserve Node 24 and installed direct major versions. If no compatible fix exists, submit a specific owner/expiry/rationale proposal and keep this task open until explicitly reviewed; do not force an unrelated major upgrade. +- **findings**: DEPENDABOT-101, NPM-WEB-GHSA-gcqx-w48m-w2h4-deepmerge +- **acceptance_criteria**: + - npm audit no longer reports the advisory on each original dependency path, or an explicitly reviewed current exception documents the residual exposure. + - Dependency graph, unit tests and both web builds remain compatible; no broad overrides that violate parent ranges. +- **validation**: + - `npm --prefix web explain deepmerge` + - `npm --prefix web audit --json` + - `npm --prefix web audit --omit=dev --json` + - `npm --prefix web test -- --runInBand` + - `npm --prefix web run build` + - `LIGHTNVR_WEB_LEGACY=false npm --prefix web run build` +- **status**: Blocked — review prepared, awaiting compatible fix or maintainer decision +- **log**: Concrete review packet committed in `713b3025`; no package mutation, approval or disposition change. Current development-tool advisory ranges and dependency parents checked; production web audit zero. See task evidence and `quality/reviews/exception-ownership.json`. +- **files edited/created**: + +### T7.11: cpp/cleartext-storage-database in db_event_destinations.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_event_destinations.c`, `tests/unit/test_t7_11.c`, `tests/unit/cmake/eng/t7_11.cmake`, `quality/evidence/T7.11.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-316, CODEQL-307 +- **acceptance_criteria**: + - Trace credential persistence and read access; document existing at-rest security and migration constraints. Test redaction and restricted access. If encryption changes the storage contract, materialize a separate bounded migration task instead of inventing a key-management scheme. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.11 --regex '^test_t7_11$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.11`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.12: cpp/cleartext-storage-database in db_streams.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_streams.c`, `tests/unit/test_t7_12.c`, `tests/unit/cmake/eng/t7_12.cmake`, `quality/evidence/T7.12.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-185, CODEQL-183, CODEQL-181 +- **acceptance_criteria**: + - Trace credential persistence and read access; document existing at-rest security and migration constraints. Test redaction and restricted access. If encryption changes the storage contract, materialize a separate bounded migration task instead of inventing a key-management scheme. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.12 --regex '^test_t7_12$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.12`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.13: cpp/cleartext-storage-file in config.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/core/config.c`, `tests/unit/test_t7_13.c`, `tests/unit/cmake/eng/t7_13.cmake`, `quality/evidence/T7.13.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-267, CODEQL-64, CODEQL-63 +- **acceptance_criteria**: + - Verify file permissions, creation umask, redacted logs and credential read access; preserve compatible config loading. Residual necessary plaintext needs explicit reviewed exposure acceptance. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.13 --regex '^test_t7_13$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.13`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.14: cpp/cleartext-transmission in hls_unified_thread.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/hls/hls_unified_thread.c`, `tests/unit/test_t7_14.c`, `tests/unit/cmake/eng/t7_14.cmake`, `quality/evidence/T7.14.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-264 +- **acceptance_criteria**: + - Assert credential-bearing payloads are not disclosed to an untrusted/insecure destination; verify supported camera transport behavior. Any required legacy cleartext transport needs an explicit reviewed exposure exception. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.14 --regex '^test_t7_14$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.14`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.15: cpp/cleartext-transmission in stream_protocol.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/stream_protocol.c`, `tests/unit/test_t7_15.c`, `tests/unit/cmake/eng/t7_15.cmake`, `quality/evidence/T7.15.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-14 +- **acceptance_criteria**: + - Assert credential-bearing payloads are not disclosed to an untrusted/insecure destination; verify supported camera transport behavior. Any required legacy cleartext transport needs an explicit reviewed exposure exception. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.15 --regex '^test_t7_15$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.15`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.16: cpp/integer-multiplication-cast-to-long in mp4_writer_utils.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/mp4_writer_utils.c`, `tests/unit/test_t7_16.c`, `tests/unit/cmake/eng/t7_16.cmake`, `quality/evidence/T7.16.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-329 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.16 --regex '^test_t7_16$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.16`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.17: cpp/non-https-url in go2rtc_api.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/go2rtc/go2rtc_api.c`, `tests/unit/test_t7_17.c`, `tests/unit/cmake/eng/t7_17.cmake`, `quality/evidence/T7.17.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-78, CODEQL-77, CODEQL-76, CODEQL-75, CODEQL-71, CODEQL-70, CODEQL-69, CODEQL-20, CODEQL-19 +- **acceptance_criteria**: + - Prove endpoint trust and transport policy for each reported URL; retain HTTP-only camera compatibility only with an explicitly reviewed exposure exception. Do not rewrite device endpoints to HTTPS without negotiation/support. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.17 --regex '^test_t7_17$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.17`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.18: cpp/non-https-url in onvif_detection.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/onvif_detection.c`, `tests/unit/test_t7_18.c`, `tests/unit/cmake/eng/t7_18.cmake`, `quality/evidence/T7.18.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-337, CODEQL-336, CODEQL-335, CODEQL-334, CODEQL-272, CODEQL-271, CODEQL-270 +- **acceptance_criteria**: + - Prove endpoint trust and transport policy for each reported URL; retain HTTP-only camera compatibility only with an explicitly reviewed exposure exception. Do not rewrite device endpoints to HTTPS without negotiation/support. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.18 --regex '^test_t7_18$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.18`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.19: cpp/non-https-url in onvif_discovery.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/onvif_discovery.c`, `tests/unit/test_t7_19.c`, `tests/unit/cmake/eng/t7_19.cmake`, `quality/evidence/T7.19.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-59 +- **acceptance_criteria**: + - Prove endpoint trust and transport policy for each reported URL; retain HTTP-only camera compatibility only with an explicitly reviewed exposure exception. Do not rewrite device endpoints to HTTPS without negotiation/support. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.19 --regex '^test_t7_19$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.19`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.20: cpp/non-https-url in api_handlers_ptz.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_ptz.c`, `tests/unit/test_t7_20.c`, `tests/unit/cmake/eng/t7_20.cmake`, `quality/evidence/T7.20.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-73 +- **acceptance_criteria**: + - Prove endpoint trust and transport policy for each reported URL; retain HTTP-only camera compatibility only with an explicitly reviewed exposure exception. Do not rewrite device endpoints to HTTPS without negotiation/support. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.20 --regex '^test_t7_20$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.20`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.21: cpp/path-injection in storage_s3.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/storage/storage_s3.c`, `tests/unit/test_t7_21.c`, `tests/unit/cmake/eng/t7_21.cmake`, `quality/evidence/T7.21.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-325 +- **acceptance_criteria**: + - Reject dot segments, separators and encoded traversal from untrusted names before filesystem access; assert normal names still select the intended file and no outside-tree path is opened. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.21 --regex '^test_t7_21$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.21`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.22: cpp/path-injection in linux_cgroup.c, linux_network.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/telemetry/collectors/linux_cgroup.c`, `src/telemetry/collectors/linux_network.c`, `tests/unit/test_t7_22.c`, `tests/unit/cmake/eng/t7_22.cmake`, `quality/evidence/T7.22.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-320, CODEQL-319, CODEQL-318, CODEQL-317 +- **acceptance_criteria**: + - Reject dot segments, separators and encoded traversal from untrusted names before filesystem access; assert normal names still select the intended file and no outside-tree path is opened. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.22 --regex '^test_t7_22$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.22`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.23: cpp/sql-injection in sqlite_migrate.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/sqlite_migrate.c`, `tests/unit/test_t7_23.c`, `tests/unit/cmake/eng/t7_23.cmake`, `quality/evidence/T7.23.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-67, CODEQL-66 +- **acceptance_criteria**: + - Use quote, semicolon and comment-bearing identifiers in a disposable database; ensure they cannot execute a second statement or alter unrelated schema, while valid migration names still work. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.23 --regex '^test_t7_23$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.23`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.24: cpp/suspicious-pointer-scaling in frame.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_24-upstream.json`, `quality/evidence/T7.24.md`. +- **priority**: high +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CODEQL-330 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_24-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.24`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.25: cpp/toctou-race-condition in db_core.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_core.c`, `tests/unit/test_t7_25.c`, `tests/unit/cmake/eng/t7_25.cmake`, `quality/evidence/T7.25.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-321 +- **acceptance_criteria**: + - Exercise replacement/symlink races between validation and use; operations must hold and use the validated descriptor or reject changed identity, preserving normal success and cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.25 --regex '^test_t7_25$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.25`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.26: cpp/toctou-race-condition in storage_migration.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/storage/storage_migration.c`, `tests/unit/test_t7_26.c`, `tests/unit/cmake/eng/t7_26.cmake`, `quality/evidence/T7.26.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-310 +- **acceptance_criteria**: + - Exercise replacement/symlink races between validation and use; operations must hold and use the validated descriptor or reject changed identity, preserving normal success and cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.26 --regex '^test_t7_26$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.26`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.27: cpp/toctou-race-condition in api_handlers_operator_floor_plans.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_operator_floor_plans.c`, `tests/unit/test_t7_27.c`, `tests/unit/cmake/eng/t7_27.cmake`, `quality/evidence/T7.27.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-315, CODEQL-314, CODEQL-313 +- **acceptance_criteria**: + - Exercise replacement/symlink races between validation and use; operations must hold and use the validated descriptor or reject changed identity, preserving normal success and cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.27 --regex '^test_t7_27$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.27`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.28: cpp/uncontrolled-allocation-size in event_router.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/core/event_router.c`, `tests/unit/test_t7_28.c`, `tests/unit/cmake/eng/t7_28.cmake`, `quality/evidence/T7.28.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-306, CODEQL-305 +- **acceptance_criteria**: + - Exercise zero, maximum accepted, one-past maximum and overflow-sized user inputs; reject before allocation/multiplication, leave state unchanged, and preserve ordinary delivery. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.28 --regex '^test_t7_28$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.28`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.29: cpp/world-writable-file-creation in mqtt_client.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/core/mqtt_client.c`, `tests/unit/test_t7_29.c`, `tests/unit/cmake/eng/t7_29.cmake`, `quality/evidence/T7.29.md`. +- **priority**: high +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CODEQL-293 +- **acceptance_criteria**: + - Create the credential-bearing file under a permissive umask and assert effective permissions exclude group/other access; retain existing owner and normal reload semantics. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.29 --regex '^test_t7_29$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.29`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.30: arrayIndexOutOfBounds in stream_protocol.c +- **depends_on**: [T7, T13, T7.15] +- **agent_type**: worker +- **ownership**: `src/video/stream_protocol.c`, `tests/unit/test_t7_30.c`, `tests/unit/cmake/eng/t7_30.cmake`, `quality/evidence/T7.30.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-0dfdce44e3f2c522 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.30 --regex '^test_t7_30$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.30`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.31: clang-analyzer-core.CallAndMessage in system_health_policy.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/telemetry/system_health_policy.c`, `tests/unit/test_t7_31.c`, `tests/unit/cmake/eng/t7_31.cmake`, `quality/evidence/T7.31.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-9b21a14b97b3a15e +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.31 --regex '^test_t7_31$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.31`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.32: clang-analyzer-core.DivideZero in db_storage_pools.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_storage_pools.c`, `tests/unit/test_t7_32.c`, `tests/unit/cmake/eng/t7_32.cmake`, `quality/evidence/T7.32.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-b7cb62f9287bca53 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.32 --regex '^test_t7_32$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.32`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.33: clang-analyzer-core.NonNullParamChecker in camera_collection_filter.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/core/camera_collection_filter.c`, `tests/unit/test_t7_33.c`, `tests/unit/cmake/eng/t7_33.cmake`, `quality/evidence/T7.33.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-a918c6008bfe9234 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.33 --regex '^test_t7_33$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.33`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.34: clang-analyzer-core.NonNullParamChecker in db_storage_policies.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_storage_policies.c`, `tests/unit/test_t7_34.c`, `tests/unit/cmake/eng/t7_34.cmake`, `quality/evidence/T7.34.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-a5ab5fe6add78d8e +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.34 --regex '^test_t7_34$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.34`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.35: clang-analyzer-core.NonNullParamChecker in storage_s3.c +- **depends_on**: [T7, T13, T7.21] +- **agent_type**: worker +- **ownership**: `src/storage/storage_s3.c`, `tests/unit/test_t7_35.c`, `tests/unit/cmake/eng/t7_35.cmake`, `quality/evidence/T7.35.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-cb260984bd5750f8 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.35 --regex '^test_t7_35$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.35`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.36: clang-analyzer-core.NullDereference in event_envelope.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/core/event_envelope.c`, `tests/unit/test_t7_36.c`, `tests/unit/cmake/eng/t7_36.cmake`, `quality/evidence/T7.36.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-f240093f03b567fb +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.36 --regex '^test_t7_36$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.36`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.37: clang-analyzer-core.NullDereference in db_live_saved_layouts.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_live_saved_layouts.c`, `tests/unit/test_t7_37.c`, `tests/unit/cmake/eng/t7_37.cmake`, `quality/evidence/T7.37.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-f8203edcc8863cd8 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.37 --regex '^test_t7_37$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.37`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.38: clang-analyzer-core.NullDereference in db_storage_policies.c +- **depends_on**: [T7, T13, T7.34] +- **agent_type**: worker +- **ownership**: `src/database/db_storage_policies.c`, `tests/unit/test_t7_38.c`, `tests/unit/cmake/eng/t7_38.cmake`, `quality/evidence/T7.38.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-179513c629f1ecac +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.38 --regex '^test_t7_38$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.38`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.39: clang-analyzer-core.NullDereference in smartctl_provider.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/telemetry/providers/smartctl_provider.c`, `tests/unit/test_t7_39.c`, `tests/unit/cmake/eng/t7_39.cmake`, `quality/evidence/T7.39.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-33d1c32daba1778e +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.39 --regex '^test_t7_39$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.39`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.40: clang-analyzer-core.NullDereference in go2rtc_api.c +- **depends_on**: [T7, T13, T7.17] +- **agent_type**: worker +- **ownership**: `src/video/go2rtc/go2rtc_api.c`, `tests/unit/test_t7_40.c`, `tests/unit/cmake/eng/t7_40.cmake`, `quality/evidence/T7.40.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-14fc6cb721e4ff46 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.40 --regex '^test_t7_40$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.40`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.41: clang-analyzer-core.NullDereference in hls_writer.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/hls_writer.c`, `tests/unit/test_t7_41.c`, `tests/unit/cmake/eng/t7_41.cmake`, `quality/evidence/T7.41.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-848024a1059f9105, CLANGTIDY-c18dbfa67bfd519e +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.41 --regex '^test_t7_41$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.41`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.42: clang-analyzer-core.NullDereference in api_handlers_authorization.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_authorization.c`, `tests/unit/test_t7_42.c`, `tests/unit/cmake/eng/t7_42.cmake`, `quality/evidence/T7.42.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-3853c804fd823d76, CLANGTIDY-e903e0b58c1ab7fb, CLANGTIDY-7037bcf50d8dd6e1, CLANGTIDY-468c829b1cc867f5, CLANGTIDY-5546a3c4710ffc07, CLANGTIDY-9c42b9e1d1f45117, CLANGTIDY-b45db718e3e94b0d +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.42 --regex '^test_t7_42$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.42`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.43: clang-analyzer-core.NullDereference in api_handlers_fleet.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_fleet.c`, `tests/unit/test_t7_43.c`, `tests/unit/cmake/eng/t7_43.cmake`, `quality/evidence/T7.43.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-dc1d8989b6dc0f0a +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.43 --regex '^test_t7_43$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.43`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.44: clang-analyzer-core.NullDereference in api_handlers_health.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_health.c`, `tests/unit/test_t7_44.c`, `tests/unit/cmake/eng/t7_44.cmake`, `quality/evidence/T7.44.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-18224b07c8f96008 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.44 --regex '^test_t7_44$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.44`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.45: clang-analyzer-core.NullDereference in api_handlers_lpr.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_lpr.c`, `tests/unit/test_t7_45.c`, `tests/unit/cmake/eng/t7_45.cmake`, `quality/evidence/T7.45.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-36ab8111fbec813b, CLANGTIDY-21f4fa94b0f2d17d +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.45 --regex '^test_t7_45$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.45`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.46: clang-analyzer-core.NullDereference in api_handlers_recording_control.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_recording_control.c`, `tests/unit/test_t7_46.c`, `tests/unit/cmake/eng/t7_46.cmake`, `quality/evidence/T7.46.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-e722e2369c13444f +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.46 --regex '^test_t7_46$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.46`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.47: clang-analyzer-core.NullDereference in api_handlers_retention.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_retention.c`, `tests/unit/test_t7_47.c`, `tests/unit/cmake/eng/t7_47.cmake`, `quality/evidence/T7.47.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-67d853afc9b7eefe +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.47 --regex '^test_t7_47$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.47`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.48: clang-analyzer-core.NullDereference in api_handlers_storage_migrations.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_storage_migrations.c`, `tests/unit/test_t7_48.c`, `tests/unit/cmake/eng/t7_48.cmake`, `quality/evidence/T7.48.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-44c26e7cc4f14d25, CLANGTIDY-7f68b57abf95cdae +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.48 --regex '^test_t7_48$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.48`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.49: clang-analyzer-core.NullDereference in api_handlers_streams_get.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_streams_get.c`, `tests/unit/test_t7_49.c`, `tests/unit/cmake/eng/t7_49.cmake`, `quality/evidence/T7.49.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-2b9b559954a51bc7 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.49 --regex '^test_t7_49$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.49`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.50: clang-analyzer-core.NullDereference in api_handlers_streams_modify.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_streams_modify.c`, `tests/unit/test_t7_50.c`, `tests/unit/cmake/eng/t7_50.cmake`, `quality/evidence/T7.50.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-3ac69a72123df761 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.50 --regex '^test_t7_50$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.50`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.51: clang-analyzer-core.NullDereference in api_handlers_system_health.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_system_health.c`, `tests/unit/test_t7_51.c`, `tests/unit/cmake/eng/t7_51.cmake`, `quality/evidence/T7.51.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-2eb8f8220e64672b, CLANGTIDY-8935718b76906f1e, CLANGTIDY-db6d4840afaa43ce, CLANGTIDY-6253a319b7ed3b31 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.51 --regex '^test_t7_51$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.51`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.52: clang-analyzer-core.UndefinedBinaryOperatorResult in path_utils.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/core/path_utils.c`, `tests/unit/test_t7_52.c`, `tests/unit/cmake/eng/t7_52.cmake`, `quality/evidence/T7.52.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-d86514e7015dbd70 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.52 --regex '^test_t7_52$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.52`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.53: clang-analyzer-security.ArrayBound in authorization.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/core/authorization.c`, `tests/unit/test_t7_53.c`, `tests/unit/cmake/eng/t7_53.cmake`, `quality/evidence/T7.53.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-c4536c7eb269c97d, CLANGTIDY-dc57edf3e0b50ae4 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.53 --regex '^test_t7_53$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.53`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.54: clang-analyzer-security.ArrayBound in logger_json.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/core/logger_json.c`, `tests/unit/test_t7_54.c`, `tests/unit/cmake/eng/t7_54.cmake`, `quality/evidence/T7.54.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-ff30996a0be1b3ef +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.54 --regex '^test_t7_54$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.54`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.55: clang-analyzer-security.ArrayBound in main.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/core/main.c`, `tests/unit/test_t7_55.c`, `tests/unit/cmake/eng/t7_55.cmake`, `quality/evidence/T7.55.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-470e897ffa76864e +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.55 --regex '^test_t7_55$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.55`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.56: clang-analyzer-security.ArrayBound in sqlite_migrate.c +- **depends_on**: [T7, T13, T7.23] +- **agent_type**: worker +- **ownership**: `src/database/sqlite_migrate.c`, `tests/unit/test_t7_56.c`, `tests/unit/cmake/eng/t7_56.cmake`, `quality/evidence/T7.56.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-2772ec37ee463512 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.56 --regex '^test_t7_56$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.56`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.57: clang-analyzer-security.ArrayBound in linux_network.c, linux_process.c, linux_restart.c, linux_thermal.c +- **depends_on**: [T7, T13, T7.22] +- **agent_type**: worker +- **ownership**: `src/telemetry/collectors/linux_network.c`, `src/telemetry/collectors/linux_process.c`, `src/telemetry/collectors/linux_restart.c`, `src/telemetry/collectors/linux_thermal.c`, `tests/unit/test_t7_57.c`, `tests/unit/cmake/eng/t7_57.cmake`, `quality/evidence/T7.57.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-9259d0adb44e3ab3, CLANGTIDY-55f597a830e65b4d, CLANGTIDY-eaf20c1f0de62870, CLANGTIDY-c05a923060c50809, CLANGTIDY-30cd36651cb697e6 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.57 --regex '^test_t7_57$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.57`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.58: clang-analyzer-security.ArrayBound in linux_hardware.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/telemetry/providers/linux_hardware.c`, `tests/unit/test_t7_58.c`, `tests/unit/cmake/eng/t7_58.cmake`, `quality/evidence/T7.58.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-29fe00c504db3f7e, CLANGTIDY-93f7df7451e39223 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.58 --regex '^test_t7_58$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.58`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.59: clang-analyzer-security.ArrayBound in system_health.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/telemetry/system_health.c`, `tests/unit/test_t7_59.c`, `tests/unit/cmake/eng/t7_59.cmake`, `quality/evidence/T7.59.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-192595ad5f7437f2 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.59 --regex '^test_t7_59$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.59`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.60: clang-analyzer-security.ArrayBound in go2rtc_process.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/go2rtc/go2rtc_process.c`, `tests/unit/test_t7_60.c`, `tests/unit/cmake/eng/t7_60.cmake`, `quality/evidence/T7.60.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-6eb7be7d5d4be88a +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.60 --regex '^test_t7_60$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.60`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.61: clang-analyzer-security.ArrayBound in hls_cache_cleanup.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/hls/hls_cache_cleanup.c`, `tests/unit/test_t7_61.c`, `tests/unit/cmake/eng/t7_61.cmake`, `quality/evidence/T7.61.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-e88c078f85b44a5e +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.61 --regex '^test_t7_61$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.61`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.62: clang-analyzer-security.ArrayBound in stream_manager.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/stream_manager.c`, `tests/unit/test_t7_62.c`, `tests/unit/cmake/eng/t7_62.cmake`, `quality/evidence/T7.62.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-87fe5c4f9b2c4103 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.62 --regex '^test_t7_62$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.62`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.63: clang-analyzer-security.ArrayBound in api_handlers_fleet.c +- **depends_on**: [T7, T13, T7.43] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_fleet.c`, `tests/unit/test_t7_63.c`, `tests/unit/cmake/eng/t7_63.cmake`, `quality/evidence/T7.63.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-b6500f12e4ee30b7, CLANGTIDY-a01b119b5b6a4463 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.63 --regex '^test_t7_63$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.63`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.64: clang-analyzer-security.ArrayBound in api_handlers_streams_get.c +- **depends_on**: [T7, T13, T7.49] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_streams_get.c`, `tests/unit/test_t7_64.c`, `tests/unit/cmake/eng/t7_64.cmake`, `quality/evidence/T7.64.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-d562d8dbfbb1dcc3, CLANGTIDY-24b2873ab4fb113e +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.64 --regex '^test_t7_64$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.64`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.65: clang-analyzer-security.ArrayBound in api_handlers_system.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_system.c`, `tests/unit/test_t7_65.c`, `tests/unit/cmake/eng/t7_65.cmake`, `quality/evidence/T7.65.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-4f6abbd42f9a1855, CLANGTIDY-c7df8f3cce68c5a4 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.65 --regex '^test_t7_65$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.65`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.66: clang-analyzer-security.insecureAPI.strcpy in recording_transcode.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/recording_transcode.c`, `tests/unit/test_t7_66.c`, `tests/unit/cmake/eng/t7_66.cmake`, `quality/evidence/T7.66.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-d6eef8565b934dd8, CLANGTIDY-4976fee144691228 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.66 --regex '^test_t7_66$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.66`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.67: clang-analyzer-security.insecureAPI.strcpy in api_handlers_go2rtc_proxy.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_go2rtc_proxy.c`, `tests/unit/test_t7_67.c`, `tests/unit/cmake/eng/t7_67.cmake`, `quality/evidence/T7.67.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-4c710ebaa0f3ef18, CLANGTIDY-e7f2b500346b1db4, CLANGTIDY-59d7e244d1294daa, CLANGTIDY-de5c9750f9e973f2 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.67 --regex '^test_t7_67$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.67`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.68: clang-analyzer-unix.BlockInCriticalSection in health_helper_runner.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/telemetry/health_helper_runner.c`, `tests/unit/test_t7_68.c`, `tests/unit/cmake/eng/t7_68.cmake`, `quality/evidence/T7.68.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-8a0289975bb00ddb +- **acceptance_criteria**: + - Exercise the blocking operation and concurrent shutdown/contending thread with bounded deadlines; assert no lock is held across unbounded I/O and lock-protected invariants remain intact. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.68 --regex '^test_t7_68$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.68`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.69: clang-analyzer-unix.BlockInCriticalSection in hls_unified_thread.c +- **depends_on**: [T7, T13, T7.14] +- **agent_type**: worker +- **ownership**: `src/video/hls/hls_unified_thread.c`, `tests/unit/test_t7_69.c`, `tests/unit/cmake/eng/t7_69.cmake`, `quality/evidence/T7.69.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-1728287dd1cfa5a4 +- **acceptance_criteria**: + - Exercise the blocking operation and concurrent shutdown/contending thread with bounded deadlines; assert no lock is held across unbounded I/O and lock-protected invariants remain intact. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.69 --regex '^test_t7_69$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.69`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.70: clang-analyzer-unix.Errno in storage_migration.c +- **depends_on**: [T7, T13, T7.26] +- **agent_type**: worker +- **ownership**: `src/storage/storage_migration.c`, `tests/unit/test_t7_70.c`, `tests/unit/cmake/eng/t7_70.cmake`, `quality/evidence/T7.70.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-f15ef4cfb6675401, CLANGTIDY-d8903761e409b32d +- **acceptance_criteria**: + - Inject failing and successful calls with stale errno; branch only on actual call failure and preserve the original error before cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.70 --regex '^test_t7_70$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.70`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.71: clang-analyzer-unix.StdCLibraryFunctions in hls_cache_cleanup.c +- **depends_on**: [T7, T13, T7.61] +- **agent_type**: worker +- **ownership**: `src/video/hls/hls_cache_cleanup.c`, `tests/unit/test_t7_71.c`, `tests/unit/cmake/eng/t7_71.cmake`, `quality/evidence/T7.71.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-f70e12d3b12447f9, CLANGTIDY-81dd4bf2eb1bd4a8 +- **acceptance_criteria**: + - Exercise every reported format/library call with boundary values; argument types/counts, buffer extents and returned errors must match the library contract with no UB. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.71 --regex '^test_t7_71$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.71`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.72: clang-analyzer-unix.Stream in linux_network.c +- **depends_on**: [T7, T13, T7.57] +- **agent_type**: worker +- **ownership**: `src/telemetry/collectors/linux_network.c`, `tests/unit/test_t7_72.c`, `tests/unit/cmake/eng/t7_72.cmake`, `quality/evidence/T7.72.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-b38fd5e59ea07d0e, CLANGTIDY-ebeb3bd843bc6421 +- **acceptance_criteria**: + - Inject each allocation/open and downstream failure at the reported site; assert allocations, FILE handles and descriptors return to baseline on every exit and successful ownership transfers remain valid. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.72 --regex '^test_t7_72$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.72`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.73: integerOverflow in config.c +- **depends_on**: [T7, T13, T7.13] +- **agent_type**: worker +- **ownership**: `src/core/config.c`, `tests/unit/test_t7_73.c`, `tests/unit/cmake/eng/t7_73.cmake`, `quality/evidence/T7.73.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-a8a2fee09e04d7a2 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.73 --regex '^test_t7_73$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.73`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.74: memleak in sod_img_writer.h +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_74-upstream.json`, `quality/evidence/T7.74.md`. +- **priority**: medium +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-582ed0e8d5a10fc1 +- **acceptance_criteria**: + - Inject each allocation/open and downstream failure at the reported site; assert allocations, FILE handles and descriptors return to baseline on every exit and successful ownership transfers remain valid. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_74-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.74`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.75: memleak in sod.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_75-upstream.json`, `quality/evidence/T7.75.md`. +- **priority**: medium +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-d14ab8cc9d321477, CPPCHECK-7bc58272fe78e01c, CPPCHECK-d1406d76ca075628, CPPCHECK-187d49bac01afe0b, CPPCHECK-01d35c4f8b07a420, CPPCHECK-7ed0f3ac85abfc0f, CPPCHECK-afd0bb6171ab9102, CPPCHECK-6c275f8832cf9762, CPPCHECK-340c5f9dec875049, CPPCHECK-94d7d3c523b01523, CPPCHECK-65f97e38c1e1c5df, CPPCHECK-377feb103d4c3b66 +- **acceptance_criteria**: + - Inject each allocation/open and downstream failure at the reported site; assert allocations, FILE handles and descriptors return to baseline on every exit and successful ownership transfers remain valid. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_75-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.75`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.76: preprocessorErrorDirective in nvme_provider.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/telemetry/providers/nvme_provider.c`, `tests/unit/test_t7_76.c`, `tests/unit/cmake/eng/t7_76.cmake`, `quality/evidence/T7.76.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-1c7b293c20ba8b3d +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.76 --regex '^test_t7_76$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.76`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.77: preprocessorErrorDirective in mp4_writer_utils.c +- **depends_on**: [T7, T13, T7.16] +- **agent_type**: worker +- **ownership**: `src/video/mp4_writer_utils.c`, `tests/unit/test_t7_77.c`, `tests/unit/cmake/eng/t7_77.cmake`, `quality/evidence/T7.77.md`. +- **priority**: medium +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-1afeb1315d85ff61 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.77 --regex '^test_t7_77$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.77`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.78: arrayIndexOutOfBoundsCond in stream_protocol.c +- **depends_on**: [T7, T13, T7.30] +- **agent_type**: worker +- **ownership**: `src/video/stream_protocol.c`, `tests/unit/test_t7_78.c`, `tests/unit/cmake/eng/t7_78.cmake`, `quality/evidence/T7.78.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-1d3bfb4e5fc184fe +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.78 --regex '^test_t7_78$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.78`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.79: bugprone-assignment-in-if-condition in db_system_health_incidents.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_system_health_incidents.c`, `tests/unit/test_t7_79.c`, `tests/unit/cmake/eng/t7_79.cmake`, `quality/evidence/T7.79.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-808f26556ac98110, CLANGTIDY-7e1ce15fe947a21d +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.79 --regex '^test_t7_79$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.79`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.80: bugprone-assignment-in-if-condition in api_detection.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/api_detection.c`, `tests/unit/test_t7_80.c`, `tests/unit/cmake/eng/t7_80.cmake`, `quality/evidence/T7.80.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-c34509f97f5eb3bf, CLANGTIDY-6ac00b1420332d40, CLANGTIDY-1848d1ca57216f44, CLANGTIDY-be52eb80a1a9b4e2 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.80 --regex '^test_t7_80$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.80`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.81: bugprone-assignment-in-if-condition in api_handlers_metrics.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_metrics.c`, `tests/unit/test_t7_81.c`, `tests/unit/cmake/eng/t7_81.cmake`, `quality/evidence/T7.81.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-02365646d53a2c50, CLANGTIDY-a219d74f760de10e, CLANGTIDY-96f8eef93ec11127, CLANGTIDY-221d97bd8b8ca157, CLANGTIDY-b6b7c0de32a0c6b7, CLANGTIDY-4edbb01e2c9075ed, CLANGTIDY-ec9cd5d6ab7a3d6e, CLANGTIDY-2f30db61a3888f56 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.81 --regex '^test_t7_81$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.81`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.82: bugprone-assignment-in-if-condition in go2rtc_websocket.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/go2rtc_websocket.c`, `tests/unit/test_t7_82.c`, `tests/unit/cmake/eng/t7_82.cmake`, `quality/evidence/T7.82.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-82315a3f137f4aff +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.82 --regex '^test_t7_82$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.82`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.83: bugprone-branch-clone in linux_cgroup.c +- **depends_on**: [T7, T13, T7.22] +- **agent_type**: worker +- **ownership**: `src/telemetry/collectors/linux_cgroup.c`, `tests/unit/test_t7_83.c`, `tests/unit/cmake/eng/t7_83.cmake`, `quality/evidence/T7.83.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-eac1097bd3780c16 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.83 --regex '^test_t7_83$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.83`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.84: bugprone-branch-clone in api_handlers_authorization.c +- **depends_on**: [T7, T13, T7.42] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_authorization.c`, `tests/unit/test_t7_84.c`, `tests/unit/cmake/eng/t7_84.cmake`, `quality/evidence/T7.84.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-a03bd79d6040e625 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.84 --regex '^test_t7_84$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.84`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.85: bugprone-branch-clone in api_handlers_timeline.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_timeline.c`, `tests/unit/test_t7_85.c`, `tests/unit/cmake/eng/t7_85.cmake`, `quality/evidence/T7.85.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-f1f70f55c95dfbaf +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.85 --regex '^test_t7_85$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.85`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.86: bugprone-branch-clone in audit_log.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/audit_log.c`, `tests/unit/test_t7_86.c`, `tests/unit/cmake/eng/t7_86.cmake`, `quality/evidence/T7.86.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-5bdf00371aedee4a +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.86 --regex '^test_t7_86$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.86`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.87: bugprone-branch-clone in thumbnail_thread.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/thumbnail_thread.c`, `tests/unit/test_t7_87.c`, `tests/unit/cmake/eng/t7_87.cmake`, `quality/evidence/T7.87.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-ccff9a5b097b862e +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.87 --regex '^test_t7_87$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.87`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.88: bugprone-implicit-widening-of-multiplication-result in event_bus.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/core/event_bus.c`, `tests/unit/test_t7_88.c`, `tests/unit/cmake/eng/t7_88.cmake`, `quality/evidence/T7.88.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-73322317a31f8bcc, CLANGTIDY-dbe8bf00e4b146ee +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.88 --regex '^test_t7_88$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.88`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.89: bugprone-implicit-widening-of-multiplication-result in event_envelope.c +- **depends_on**: [T7, T13, T7.36] +- **agent_type**: worker +- **ownership**: `src/core/event_envelope.c`, `tests/unit/test_t7_89.c`, `tests/unit/cmake/eng/t7_89.cmake`, `quality/evidence/T7.89.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-2fcad01867c4b146, CLANGTIDY-51ab98673b990b2c, CLANGTIDY-a48d8d980b8dbfcc +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.89 --regex '^test_t7_89$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.89`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.90: bugprone-implicit-widening-of-multiplication-result in event_router.c +- **depends_on**: [T7, T13, T7.28] +- **agent_type**: worker +- **ownership**: `src/core/event_router.c`, `tests/unit/test_t7_90.c`, `tests/unit/cmake/eng/t7_90.cmake`, `quality/evidence/T7.90.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-767515747827ef14 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.90 --regex '^test_t7_90$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.90`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.91: bugprone-implicit-widening-of-multiplication-result in mqtt_delivery_worker.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/core/mqtt_delivery_worker.c`, `tests/unit/test_t7_91.c`, `tests/unit/cmake/eng/t7_91.cmake`, `quality/evidence/T7.91.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-ced78137a6871fda +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.91 --regex '^test_t7_91$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.91`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.92: bugprone-implicit-widening-of-multiplication-result in db_operator_floor_plans.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_operator_floor_plans.c`, `tests/unit/test_t7_92.c`, `tests/unit/cmake/eng/t7_92.cmake`, `quality/evidence/T7.92.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-4ce72e7a43d0bcce +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.92 --regex '^test_t7_92$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.92`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.93: bugprone-implicit-widening-of-multiplication-result in storage_migration.c +- **depends_on**: [T7, T13, T7.70] +- **agent_type**: worker +- **ownership**: `src/storage/storage_migration.c`, `tests/unit/test_t7_93.c`, `tests/unit/cmake/eng/t7_93.cmake`, `quality/evidence/T7.93.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-50703d3018f9bed5, CLANGTIDY-15fa53ad8b574808, CLANGTIDY-e5960a2d15356c27, CLANGTIDY-1fac122c6010eb36 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.93 --regex '^test_t7_93$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.93`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.94: bugprone-implicit-widening-of-multiplication-result in storage_s3.c +- **depends_on**: [T7, T13, T7.35] +- **agent_type**: worker +- **ownership**: `src/storage/storage_s3.c`, `tests/unit/test_t7_94.c`, `tests/unit/cmake/eng/t7_94.cmake`, `quality/evidence/T7.94.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-612c846365824225, CLANGTIDY-1e0ea76108754cd5, CLANGTIDY-ab4dc4b3768799ca, CLANGTIDY-14f55668eaa243b0, CLANGTIDY-fbf040917d8b6cf7, CLANGTIDY-52dada64b4a6e625, CLANGTIDY-d1d1cf8dcb7070f8, CLANGTIDY-bfb7d2825452ce0c, CLANGTIDY-842c6bb171a64e75, CLANGTIDY-4a2a60d787933d7d, CLANGTIDY-a145bd05b0189193, CLANGTIDY-f72760acc6c09e16, CLANGTIDY-0866b8e57f533141, CLANGTIDY-d08422316656b39c, CLANGTIDY-d7c0ab1bf29a42a3 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.94 --regex '^test_t7_94$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.94`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.95: bugprone-implicit-widening-of-multiplication-result in linux_network.c, linux_process.c, linux_thermal.c +- **depends_on**: [T7, T13, T7.72, T7.57] +- **agent_type**: worker +- **ownership**: `src/telemetry/collectors/linux_network.c`, `src/telemetry/collectors/linux_process.c`, `src/telemetry/collectors/linux_thermal.c`, `tests/unit/test_t7_95.c`, `tests/unit/cmake/eng/t7_95.cmake`, `quality/evidence/T7.95.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-8d33cee7806f5d43, CLANGTIDY-02b18b5e0f4e3b93, CLANGTIDY-b84c577b6e369ac3, CLANGTIDY-8b66085f0250d8e1, CLANGTIDY-15838d8765a7623e, CLANGTIDY-df8a271dac7dc00c +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.95 --regex '^test_t7_95$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.95`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.96: bugprone-implicit-widening-of-multiplication-result in ffmpeg_rss_guard.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/tools/ffmpeg_rss_guard.c`, `tests/unit/test_t7_96.c`, `tests/unit/cmake/eng/t7_96.cmake`, `quality/evidence/T7.96.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-802a0570e39a96a6, CLANGTIDY-a072eb98578bd9cf +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.96 --regex '^test_t7_96$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.96`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.97: bugprone-implicit-widening-of-multiplication-result in lpr_crypto.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/utils/lpr_crypto.c`, `tests/unit/test_t7_97.c`, `tests/unit/cmake/eng/t7_97.cmake`, `quality/evidence/T7.97.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-576d7acbaee5cef6 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.97 --regex '^test_t7_97$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.97`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.98: bugprone-implicit-widening-of-multiplication-result in go2rtc_api.c, go2rtc_consumer.c, go2rtc_integration.c, go2rtc_snapshot.c, go2rtc_stream.c +- **depends_on**: [T7, T13, T7.40] +- **agent_type**: worker +- **ownership**: `src/video/go2rtc/go2rtc_api.c`, `src/video/go2rtc/go2rtc_consumer.c`, `src/video/go2rtc/go2rtc_integration.c`, `src/video/go2rtc/go2rtc_snapshot.c`, `src/video/go2rtc/go2rtc_stream.c`, `tests/unit/test_t7_98.c`, `tests/unit/cmake/eng/t7_98.cmake`, `quality/evidence/T7.98.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-eadc49a35e808a77, CLANGTIDY-bdcbae59a275ce50, CLANGTIDY-5582e7df3dd25730, CLANGTIDY-23826be3117b0a5e, CLANGTIDY-cac166160ef5ab94, CLANGTIDY-6eced00c619f459a, CLANGTIDY-a35257b195053d18, CLANGTIDY-9fbcc527095ebbbb, CLANGTIDY-c263543788ddaa36, CLANGTIDY-d06458b2bdfca56d, CLANGTIDY-1592d34d4e3dc54c, CLANGTIDY-957e3e8e5e143726, CLANGTIDY-76ebb6a603073b54, CLANGTIDY-2c1116134a2ee5a3, CLANGTIDY-0ce2e7833fc885fd, CLANGTIDY-4e94aa9ff957dec6, CLANGTIDY-f6ddc3b14e23e020 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.98 --regex '^test_t7_98$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.98`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.99: bugprone-implicit-widening-of-multiplication-result in mp4_writer_utils.c +- **depends_on**: [T7, T13, T7.77] +- **agent_type**: worker +- **ownership**: `src/video/mp4_writer_utils.c`, `tests/unit/test_t7_99.c`, `tests/unit/cmake/eng/t7_99.cmake`, `quality/evidence/T7.99.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-a19387fbb98806ae +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.99 --regex '^test_t7_99$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.99`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.100: bugprone-implicit-widening-of-multiplication-result in onvif_detection.c +- **depends_on**: [T7, T13, T7.18] +- **agent_type**: worker +- **ownership**: `src/video/onvif_detection.c`, `tests/unit/test_t7_100.c`, `tests/unit/cmake/eng/t7_100.cmake`, `quality/evidence/T7.100.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-18362aef7fade326, CLANGTIDY-eade1f2d38582a47, CLANGTIDY-8b074e54e83681ff +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.100 --regex '^test_t7_100$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.100`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.101: bugprone-implicit-widening-of-multiplication-result in onvif_event.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/onvif_event.c`, `tests/unit/test_t7_101.c`, `tests/unit/cmake/eng/t7_101.cmake`, `quality/evidence/T7.101.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-eb4e649dccdb530f +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.101 --regex '^test_t7_101$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.101`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.102: bugprone-implicit-widening-of-multiplication-result in api_handlers_investigations.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_investigations.c`, `tests/unit/test_t7_102.c`, `tests/unit/cmake/eng/t7_102.cmake`, `quality/evidence/T7.102.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-6829e02764d9d278, CLANGTIDY-113735d7300e4f01, CLANGTIDY-25b00beae5a3f4a8, CLANGTIDY-2387b22f15e219d3 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.102 --regex '^test_t7_102$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.102`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.103: bugprone-implicit-widening-of-multiplication-result in api_handlers_lpr.c +- **depends_on**: [T7, T13, T7.45] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_lpr.c`, `tests/unit/test_t7_103.c`, `tests/unit/cmake/eng/t7_103.cmake`, `quality/evidence/T7.103.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-0818b8d62b6628c5 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.103 --regex '^test_t7_103$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.103`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.104: bugprone-implicit-widening-of-multiplication-result in api_handlers_operator_floor_plans.c +- **depends_on**: [T7, T13, T7.27] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_operator_floor_plans.c`, `tests/unit/test_t7_104.c`, `tests/unit/cmake/eng/t7_104.cmake`, `quality/evidence/T7.104.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-53e88d8983baf290, CLANGTIDY-dbd6a5de3a7e191c +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.104 --regex '^test_t7_104$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.104`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.105: bugprone-implicit-widening-of-multiplication-result in api_handlers_storage.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_storage.c`, `tests/unit/test_t7_105.c`, `tests/unit/cmake/eng/t7_105.cmake`, `quality/evidence/T7.105.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-88f84938e1b8feb0 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.105 --regex '^test_t7_105$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.105`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.106: bugprone-implicit-widening-of-multiplication-result in api_handlers_system_go2rtc.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_system_go2rtc.c`, `tests/unit/test_t7_106.c`, `tests/unit/cmake/eng/t7_106.cmake`, `quality/evidence/T7.106.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-101a7d6e0cfda715, CLANGTIDY-c586f58fa85c527e +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.106 --regex '^test_t7_106$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.106`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.107: bugprone-implicit-widening-of-multiplication-result in api_handlers_timeline.c +- **depends_on**: [T7, T13, T7.85] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_timeline.c`, `tests/unit/test_t7_107.c`, `tests/unit/cmake/eng/t7_107.cmake`, `quality/evidence/T7.107.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-18895086ef6f0ed9 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.107 --regex '^test_t7_107$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.107`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.108: bugprone-implicit-widening-of-multiplication-result in go2rtc_websocket.c +- **depends_on**: [T7, T13, T7.82] +- **agent_type**: worker +- **ownership**: `src/web/go2rtc_websocket.c`, `tests/unit/test_t7_108.c`, `tests/unit/cmake/eng/t7_108.cmake`, `quality/evidence/T7.108.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-6e45cad03ed5a9f3 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.108 --regex '^test_t7_108$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.108`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.109: bugprone-implicit-widening-of-multiplication-result in recording_archive.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/recording_archive.c`, `tests/unit/test_t7_109.c`, `tests/unit/cmake/eng/t7_109.cmake`, `quality/evidence/T7.109.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-5bcac8af8164c1b0, CLANGTIDY-e2b358165654b79e +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.109 --regex '^test_t7_109$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.109`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.110: bugprone-inc-dec-in-conditions in storage_source.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/storage/storage_source.c`, `tests/unit/test_t7_110.c`, `tests/unit/cmake/eng/t7_110.cmake`, `quality/evidence/T7.110.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-9613b39c2e0a1e4c +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.110 --regex '^test_t7_110$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.110`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.111: bugprone-macro-parentheses in cJSON.h +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_111-upstream.json`, `quality/evidence/T7.111.md`. +- **priority**: low +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CLANGTIDY-5f6ae30cde3aaf3d, CLANGTIDY-bc48f96894493869, CLANGTIDY-01e4c541adfa23e3, CLANGTIDY-3abdad2ed8a71fe5, CLANGTIDY-09829500c354c2b5, CLANGTIDY-661c1d9d010f4873, CLANGTIDY-f69ef126d8e55b2b, CLANGTIDY-6d1385324d08479d +- **acceptance_criteria**: + - Compile/evaluate precedence-sensitive macro arguments and side effects; results must match the intended fully parenthesized expression without double evaluation. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_111-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.111`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.112: bugprone-macro-parentheses in api_detection.c +- **depends_on**: [T7, T13, T7.80] +- **agent_type**: worker +- **ownership**: `src/video/api_detection.c`, `tests/unit/test_t7_112.c`, `tests/unit/cmake/eng/t7_112.cmake`, `quality/evidence/T7.112.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-ae25a6959341dd10 +- **acceptance_criteria**: + - Compile/evaluate precedence-sensitive macro arguments and side effects; results must match the intended fully parenthesized expression without double evaluation. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.112 --regex '^test_t7_112$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.112`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.113: bugprone-misplaced-widening-cast in db_fleet_query.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_fleet_query.c`, `tests/unit/test_t7_113.c`, `tests/unit/cmake/eng/t7_113.cmake`, `quality/evidence/T7.113.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-7bff304a77769e6c +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.113 --regex '^test_t7_113$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.113`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.114: bugprone-multi-level-implicit-pointer-conversion in authorization.c +- **depends_on**: [T7, T13, T7.53] +- **agent_type**: worker +- **ownership**: `src/core/authorization.c`, `tests/unit/test_t7_114.c`, `tests/unit/cmake/eng/t7_114.cmake`, `quality/evidence/T7.114.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-4505cfde8bb2e42a, CLANGTIDY-ff0e443bb0b29339 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.114 --regex '^test_t7_114$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.114`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.115: bugprone-multi-level-implicit-pointer-conversion in camera_collection_filter.c +- **depends_on**: [T7, T13, T7.33] +- **agent_type**: worker +- **ownership**: `src/core/camera_collection_filter.c`, `tests/unit/test_t7_115.c`, `tests/unit/cmake/eng/t7_115.cmake`, `quality/evidence/T7.115.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-3a7569f24a5603a4, CLANGTIDY-54a9eba3b05f0872, CLANGTIDY-a221992baafec96f +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.115 --regex '^test_t7_115$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.115`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.116: bugprone-multi-level-implicit-pointer-conversion in camera_selector.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/core/camera_selector.c`, `tests/unit/test_t7_116.c`, `tests/unit/cmake/eng/t7_116.cmake`, `quality/evidence/T7.116.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-8e1debc0e42f328a, CLANGTIDY-1fb6fbd990b73e55, CLANGTIDY-52e7ee5b7b20725e, CLANGTIDY-a816d3388754e9a3, CLANGTIDY-bdf2049affa5a3fd, CLANGTIDY-946781b07a8a19f6 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.116 --regex '^test_t7_116$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.116`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.117: bugprone-multi-level-implicit-pointer-conversion in db_storage_lifecycle.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_storage_lifecycle.c`, `tests/unit/test_t7_117.c`, `tests/unit/cmake/eng/t7_117.cmake`, `quality/evidence/T7.117.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-39f0ad6017069f02, CLANGTIDY-c666354bdbc1df4b, CLANGTIDY-c8b906651c5b2c7f, CLANGTIDY-8a2d068dc3e8b0c0, CLANGTIDY-ad7afdbd70ca0a46 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.117 --regex '^test_t7_117$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.117`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.118: bugprone-multi-level-implicit-pointer-conversion in hls_cache_cleanup.c +- **depends_on**: [T7, T13, T7.71] +- **agent_type**: worker +- **ownership**: `src/video/hls/hls_cache_cleanup.c`, `tests/unit/test_t7_118.c`, `tests/unit/cmake/eng/t7_118.cmake`, `quality/evidence/T7.118.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-48d30c8fb35cc9cd, CLANGTIDY-1634947d8289644f, CLANGTIDY-cb9a5afe872113f7, CLANGTIDY-098d117140abdf3a, CLANGTIDY-a89af13dd80ae187 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.118 --regex '^test_t7_118$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.118`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.119: bugprone-multi-level-implicit-pointer-conversion in mp4_segment_recorder.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/mp4_segment_recorder.c`, `tests/unit/test_t7_119.c`, `tests/unit/cmake/eng/t7_119.cmake`, `quality/evidence/T7.119.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-30c3f7edea8fbd8d +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.119 --regex '^test_t7_119$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.119`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.120: bugprone-multi-level-implicit-pointer-conversion in mp4_writer_core.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/mp4_writer_core.c`, `tests/unit/test_t7_120.c`, `tests/unit/cmake/eng/t7_120.cmake`, `quality/evidence/T7.120.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-d421e791a6b63cc9 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.120 --regex '^test_t7_120$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.120`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.121: bugprone-multi-level-implicit-pointer-conversion in mp4_writer_utils.c +- **depends_on**: [T7, T13, T7.99] +- **agent_type**: worker +- **ownership**: `src/video/mp4_writer_utils.c`, `tests/unit/test_t7_121.c`, `tests/unit/cmake/eng/t7_121.cmake`, `quality/evidence/T7.121.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-c536433a0089e4b9, CLANGTIDY-4e34d6b524364f03 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.121 --regex '^test_t7_121$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.121`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.122: bugprone-multi-level-implicit-pointer-conversion in unified_detection_thread.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/unified_detection_thread.c`, `tests/unit/test_t7_122.c`, `tests/unit/cmake/eng/t7_122.cmake`, `quality/evidence/T7.122.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-5dc4623d12ccf5b2 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.122 --regex '^test_t7_122$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.122`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.123: bugprone-multi-level-implicit-pointer-conversion in api_handlers_camera_collections.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_camera_collections.c`, `tests/unit/test_t7_123.c`, `tests/unit/cmake/eng/t7_123.cmake`, `quality/evidence/T7.123.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-1f9c86e17ca383f9, CLANGTIDY-316e32d23b15b780, CLANGTIDY-7464eb7864628fd1, CLANGTIDY-5e2b3b364d163173, CLANGTIDY-81fbfb962103b645, CLANGTIDY-c41e983019497e88, CLANGTIDY-308b0349ef001b56, CLANGTIDY-7a3f68ca1e19c9db, CLANGTIDY-475d0f82a4e9b764, CLANGTIDY-2276a7bff678cf41, CLANGTIDY-63c736995704d2d6, CLANGTIDY-f5ac788b77f1417a, CLANGTIDY-ae6a96ea4d41087d, CLANGTIDY-f617ccfb4cfc3cc2, CLANGTIDY-169001b0559c7bcb, CLANGTIDY-6bce10f282924906 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.123 --regex '^test_t7_123$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.123`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.124: bugprone-multi-level-implicit-pointer-conversion in api_handlers_fleet.c +- **depends_on**: [T7, T13, T7.63] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_fleet.c`, `tests/unit/test_t7_124.c`, `tests/unit/cmake/eng/t7_124.cmake`, `quality/evidence/T7.124.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-0b0bcefaf7a0b24f, CLANGTIDY-d8c6998c9398adf1, CLANGTIDY-79ebe40a23b7323a, CLANGTIDY-6da59a8629d16699, CLANGTIDY-773e04e041de5410, CLANGTIDY-f12d6e4a615966e9, CLANGTIDY-ede4da279d79ec69, CLANGTIDY-36c8164a04c2420c, CLANGTIDY-4053884d5188ab2f +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.124 --regex '^test_t7_124$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.124`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.125: bugprone-multi-level-implicit-pointer-conversion in api_handlers_retention.c +- **depends_on**: [T7, T13, T7.47] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_retention.c`, `tests/unit/test_t7_125.c`, `tests/unit/cmake/eng/t7_125.cmake`, `quality/evidence/T7.125.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-0cc9a9ea64babfdc, CLANGTIDY-234cb88ea5651731 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.125 --regex '^test_t7_125$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.125`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.126: bugprone-multi-level-implicit-pointer-conversion in api_handlers_storage_policies.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_storage_policies.c`, `tests/unit/test_t7_126.c`, `tests/unit/cmake/eng/t7_126.cmake`, `quality/evidence/T7.126.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-312e6eafc5ebdca6, CLANGTIDY-1985156ff8e5c87d, CLANGTIDY-ca7e963b9f3e3214, CLANGTIDY-aede9d1024b66426, CLANGTIDY-07c63776b48ad48f, CLANGTIDY-ea16598ca26b9108 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.126 --regex '^test_t7_126$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.126`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.127: bugprone-narrowing-conversions in api_timing.h +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `include/web/api_timing.h`, `tests/unit/test_t7_127.c`, `tests/unit/cmake/eng/t7_127.cmake`, `quality/evidence/T7.127.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-ca2f4806dea5f177, CLANGTIDY-054f4f2a2583f814 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.127 --regex '^test_t7_127$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.127`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.128: bugprone-narrowing-conversions in path_utils.c +- **depends_on**: [T7, T13, T7.52] +- **agent_type**: worker +- **ownership**: `src/core/path_utils.c`, `tests/unit/test_t7_128.c`, `tests/unit/cmake/eng/t7_128.cmake`, `quality/evidence/T7.128.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-dda225859c807d72 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.128 --regex '^test_t7_128$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.128`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.129: bugprone-narrowing-conversions in db_storage_lifecycle.c +- **depends_on**: [T7, T13, T7.117] +- **agent_type**: worker +- **ownership**: `src/database/db_storage_lifecycle.c`, `tests/unit/test_t7_129.c`, `tests/unit/cmake/eng/t7_129.cmake`, `quality/evidence/T7.129.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-76e54a4e3ac5efb3, CLANGTIDY-84fbbd387f95947a +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.129 --regex '^test_t7_129$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.129`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.130: bugprone-narrowing-conversions in mp4_writer_utils.c +- **depends_on**: [T7, T13, T7.121] +- **agent_type**: worker +- **ownership**: `src/video/mp4_writer_utils.c`, `tests/unit/test_t7_130.c`, `tests/unit/cmake/eng/t7_130.cmake`, `quality/evidence/T7.130.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-c74d7d04edeb4ee2, CLANGTIDY-cb47dbd2bd0937a1, CLANGTIDY-6f7bee0a60d5152f +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.130 --regex '^test_t7_130$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.130`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.131: bugprone-narrowing-conversions in stream_frame_rate.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/stream_frame_rate.c`, `tests/unit/test_t7_131.c`, `tests/unit/cmake/eng/t7_131.cmake`, `quality/evidence/T7.131.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-e1b115ce18cb0926, CLANGTIDY-9bb912a1e3d2bf88 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.131 --regex '^test_t7_131$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.131`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.132: bugprone-narrowing-conversions in api_handlers_storage_compliance.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_storage_compliance.c`, `tests/unit/test_t7_132.c`, `tests/unit/cmake/eng/t7_132.cmake`, `quality/evidence/T7.132.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-6a756d858b2a4590, CLANGTIDY-0f6724ca27b42ed9, CLANGTIDY-ec3e72154d735330, CLANGTIDY-e85c88c08460d2ef, CLANGTIDY-9c90ce2f531301e0, CLANGTIDY-3e6ff569aac7699e, CLANGTIDY-ca4b8a2f2a2f60bf, CLANGTIDY-c990523bb862f2b6, CLANGTIDY-7a5a584e25342a04, CLANGTIDY-8d9dd908cb4d8452 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.132 --regex '^test_t7_132$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.132`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.133: bugprone-narrowing-conversions in httpd_utils.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/httpd_utils.c`, `tests/unit/test_t7_133.c`, `tests/unit/cmake/eng/t7_133.cmake`, `quality/evidence/T7.133.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-cb7511d8b0a3b651 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.133 --regex '^test_t7_133$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.133`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.134: bugprone-not-null-terminated-result in mqtt_destination_client.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/core/mqtt_destination_client.c`, `tests/unit/test_t7_134.c`, `tests/unit/cmake/eng/t7_134.cmake`, `quality/evidence/T7.134.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-d7edea27d80824ed +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.134 --regex '^test_t7_134$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.134`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.135: bugprone-not-null-terminated-result in linux_hardware.c +- **depends_on**: [T7, T13, T7.58] +- **agent_type**: worker +- **ownership**: `src/telemetry/providers/linux_hardware.c`, `tests/unit/test_t7_135.c`, `tests/unit/cmake/eng/t7_135.cmake`, `quality/evidence/T7.135.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-65ab86fae5fd2213 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.135 --regex '^test_t7_135$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.135`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.136: bugprone-suspicious-string-compare in db_storage_targets.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_storage_targets.c`, `tests/unit/test_t7_136.c`, `tests/unit/cmake/eng/t7_136.cmake`, `quality/evidence/T7.136.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-709dbb22240f409f, CLANGTIDY-d68060f1555ca324, CLANGTIDY-b922ced0e34aacea, CLANGTIDY-295d32efbfee9145 +- **acceptance_criteria**: + - Use equal, unequal, prefix-only and empty strings to prove the branch implements the intended comparison rather than pointer/boolean equality. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.136 --regex '^test_t7_136$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.136`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.137: bugprone-suspicious-string-compare in storage_deletion.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/storage/storage_deletion.c`, `tests/unit/test_t7_137.c`, `tests/unit/cmake/eng/t7_137.cmake`, `quality/evidence/T7.137.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-56955e0bf792f087 +- **acceptance_criteria**: + - Use equal, unequal, prefix-only and empty strings to prove the branch implements the intended comparison rather than pointer/boolean equality. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.137 --regex '^test_t7_137$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.137`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.138: bugprone-suspicious-string-compare in storage_migration.c +- **depends_on**: [T7, T13, T7.93] +- **agent_type**: worker +- **ownership**: `src/storage/storage_migration.c`, `tests/unit/test_t7_138.c`, `tests/unit/cmake/eng/t7_138.cmake`, `quality/evidence/T7.138.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-d6379e87cfa699fa +- **acceptance_criteria**: + - Use equal, unequal, prefix-only and empty strings to prove the branch implements the intended comparison rather than pointer/boolean equality. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.138 --regex '^test_t7_138$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.138`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.139: bugprone-suspicious-string-compare in storage_s3.c +- **depends_on**: [T7, T13, T7.94] +- **agent_type**: worker +- **ownership**: `src/storage/storage_s3.c`, `tests/unit/test_t7_139.c`, `tests/unit/cmake/eng/t7_139.cmake`, `quality/evidence/T7.139.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-789d9f9254afa1b1, CLANGTIDY-2f98dec54b741594, CLANGTIDY-852f97f8aacc5432, CLANGTIDY-ba57287cdb3eb096, CLANGTIDY-bfbbf95e2bedfe38, CLANGTIDY-65cc9415acf1be4d, CLANGTIDY-5561b78de6be772b, CLANGTIDY-6b719694dd2640c7 +- **acceptance_criteria**: + - Use equal, unequal, prefix-only and empty strings to prove the branch implements the intended comparison rather than pointer/boolean equality. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.139 --regex '^test_t7_139$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.139`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.140: bugprone-suspicious-string-compare in storage_source.c +- **depends_on**: [T7, T13, T7.110] +- **agent_type**: worker +- **ownership**: `src/storage/storage_source.c`, `tests/unit/test_t7_140.c`, `tests/unit/cmake/eng/t7_140.cmake`, `quality/evidence/T7.140.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-6a07b625f331b20e +- **acceptance_criteria**: + - Use equal, unequal, prefix-only and empty strings to prove the branch implements the intended comparison rather than pointer/boolean equality. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.140 --regex '^test_t7_140$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.140`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.141: bugprone-suspicious-string-compare in recording_archive.c +- **depends_on**: [T7, T13, T7.109] +- **agent_type**: worker +- **ownership**: `src/web/recording_archive.c`, `tests/unit/test_t7_141.c`, `tests/unit/cmake/eng/t7_141.cmake`, `quality/evidence/T7.141.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-adf6edf7670e9010 +- **acceptance_criteria**: + - Use equal, unequal, prefix-only and empty strings to prove the branch implements the intended comparison rather than pointer/boolean equality. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.141 --regex '^test_t7_141$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.141`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.142: bugprone-unsafe-functions,cert-msc24-c,cert-msc33-c in storage_s3.c +- **depends_on**: [T7, T13, T7.139] +- **agent_type**: worker +- **ownership**: `src/storage/storage_s3.c`, `tests/unit/test_t7_142.c`, `tests/unit/cmake/eng/t7_142.cmake`, `quality/evidence/T7.142.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-3a081de1dd30ebb2 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.142 --regex '^test_t7_142$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.142`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.143: cert-err34-c in linux_device_map.c, linux_hardware.c +- **depends_on**: [T7, T13, T7.135] +- **agent_type**: worker +- **ownership**: `src/telemetry/providers/linux_device_map.c`, `src/telemetry/providers/linux_hardware.c`, `tests/unit/test_t7_143.c`, `tests/unit/cmake/eng/t7_143.cmake`, `quality/evidence/T7.143.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-c52ffccc8c0fb590, CLANGTIDY-811ab08155776051 +- **acceptance_criteria**: + - Exercise empty, trailing-junk, negative, out-of-range and valid numeric strings; conversion must check end pointer and range before applying configuration. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.143 --regex '^test_t7_143$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.143`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.144: cert-err34-c in ffmpeg_rss_guard.c +- **depends_on**: [T7, T13, T7.96] +- **agent_type**: worker +- **ownership**: `src/tools/ffmpeg_rss_guard.c`, `tests/unit/test_t7_144.c`, `tests/unit/cmake/eng/t7_144.cmake`, `quality/evidence/T7.144.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-11d1a497d98b8490 +- **acceptance_criteria**: + - Exercise empty, trailing-junk, negative, out-of-range and valid numeric strings; conversion must check end pointer and range before applying configuration. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.144 --regex '^test_t7_144$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.144`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.145: cert-err34-c in go2rtc_integration.c, go2rtc_process.c +- **depends_on**: [T7, T13, T7.98, T7.60] +- **agent_type**: worker +- **ownership**: `src/video/go2rtc/go2rtc_integration.c`, `src/video/go2rtc/go2rtc_process.c`, `tests/unit/test_t7_145.c`, `tests/unit/cmake/eng/t7_145.cmake`, `quality/evidence/T7.145.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-a7a71d348e2c49f5, CLANGTIDY-41876b44c3442c4b, CLANGTIDY-3a3cc8c9282e0fb5, CLANGTIDY-43d0d5170d6a8434 +- **acceptance_criteria**: + - Exercise empty, trailing-junk, negative, out-of-range and valid numeric strings; conversion must check end pointer and range before applying configuration. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.145 --regex '^test_t7_145$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.145`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.146: cert-err34-c in onvif_detection.c +- **depends_on**: [T7, T13, T7.100] +- **agent_type**: worker +- **ownership**: `src/video/onvif_detection.c`, `tests/unit/test_t7_146.c`, `tests/unit/cmake/eng/t7_146.cmake`, `quality/evidence/T7.146.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-a6e1105b549e0cf0 +- **acceptance_criteria**: + - Exercise empty, trailing-junk, negative, out-of-range and valid numeric strings; conversion must check end pointer and range before applying configuration. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.146 --regex '^test_t7_146$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.146`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.147: cert-err34-c in api_handlers_go2rtc_proxy.c +- **depends_on**: [T7, T13, T7.67] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_go2rtc_proxy.c`, `tests/unit/test_t7_147.c`, `tests/unit/cmake/eng/t7_147.cmake`, `quality/evidence/T7.147.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-ab5e571ba64af645 +- **acceptance_criteria**: + - Exercise empty, trailing-junk, negative, out-of-range and valid numeric strings; conversion must check end pointer and range before applying configuration. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.147 --regex '^test_t7_147$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.147`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.148: cert-err34-c in api_handlers_investigations.c +- **depends_on**: [T7, T13, T7.102] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_investigations.c`, `tests/unit/test_t7_148.c`, `tests/unit/cmake/eng/t7_148.cmake`, `quality/evidence/T7.148.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-e5ec24184e5b758c +- **acceptance_criteria**: + - Exercise empty, trailing-junk, negative, out-of-range and valid numeric strings; conversion must check end pointer and range before applying configuration. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.148 --regex '^test_t7_148$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.148`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.149: cert-err34-c in api_handlers_system_logs.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_system_logs.c`, `tests/unit/test_t7_149.c`, `tests/unit/cmake/eng/t7_149.cmake`, `quality/evidence/T7.149.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-0fda904c59353043 +- **acceptance_criteria**: + - Exercise empty, trailing-junk, negative, out-of-range and valid numeric strings; conversion must check end pointer and range before applying configuration. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.149 --regex '^test_t7_149$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.149`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.150: cert-err34-c in go2rtc_websocket.c +- **depends_on**: [T7, T13, T7.108] +- **agent_type**: worker +- **ownership**: `src/web/go2rtc_websocket.c`, `tests/unit/test_t7_150.c`, `tests/unit/cmake/eng/t7_150.cmake`, `quality/evidence/T7.150.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-5c42b38e8a9c25ff +- **acceptance_criteria**: + - Exercise empty, trailing-junk, negative, out-of-range and valid numeric strings; conversion must check end pointer and range before applying configuration. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.150 --regex '^test_t7_150$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.150`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.151: cert-int09-c in authorization.h +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `include/core/authorization.h`, `tests/unit/test_t7_151.c`, `tests/unit/cmake/eng/t7_151.cmake`, `quality/evidence/T7.151.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-1539a5c009afd0df +- **acceptance_criteria**: + - Verify enum constants remain representable and unique on the supported ABI without changing public numeric values. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.151 --regex '^test_t7_151$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.151`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.152: cert-int09-c in faac.h +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_152-upstream.json`, `quality/evidence/T7.152.md`. +- **priority**: low +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CLANGTIDY-b6947bb24c18c8ac, CLANGTIDY-ddf685d0be472b86, CLANGTIDY-296d5f7499179bc0, CLANGTIDY-4c6957160cb5ae0c +- **acceptance_criteria**: + - Verify enum constants remain representable and unique on the supported ABI without changing public numeric values. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_152-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.152`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.153: clang-analyzer-deadcode.DeadStores in db_system_health_incidents.c +- **depends_on**: [T7, T13, T7.79] +- **agent_type**: worker +- **ownership**: `src/database/db_system_health_incidents.c`, `tests/unit/test_t7_153.c`, `tests/unit/cmake/eng/t7_153.cmake`, `quality/evidence/T7.153.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-fe8af642c27ce051 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.153 --regex '^test_t7_153$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.153`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.154: clang-analyzer-deadcode.DeadStores in go2rtc_integration.c +- **depends_on**: [T7, T13, T7.145] +- **agent_type**: worker +- **ownership**: `src/video/go2rtc/go2rtc_integration.c`, `tests/unit/test_t7_154.c`, `tests/unit/cmake/eng/t7_154.cmake`, `quality/evidence/T7.154.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-88fbdf8930f67549 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.154 --regex '^test_t7_154$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.154`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.155: clang-analyzer-deadcode.DeadStores in mp4_segment_recorder.c +- **depends_on**: [T7, T13, T7.119] +- **agent_type**: worker +- **ownership**: `src/video/mp4_segment_recorder.c`, `tests/unit/test_t7_155.c`, `tests/unit/cmake/eng/t7_155.cmake`, `quality/evidence/T7.155.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-27ac318897664d8a +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.155 --regex '^test_t7_155$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.155`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.156: clang-analyzer-deadcode.DeadStores in onvif_ptz.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/onvif_ptz.c`, `tests/unit/test_t7_156.c`, `tests/unit/cmake/eng/t7_156.cmake`, `quality/evidence/T7.156.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-7d7d3a3c4f1824bd +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.156 --regex '^test_t7_156$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.156`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.157: clang-analyzer-deadcode.DeadStores in recording_path.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/recording_path.c`, `tests/unit/test_t7_157.c`, `tests/unit/cmake/eng/t7_157.cmake`, `quality/evidence/T7.157.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-44c350a8b7e2fd4a, CLANGTIDY-a7fa9aad275f9425 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.157 --regex '^test_t7_157$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.157`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.158: clang-analyzer-deadcode.DeadStores in api_handlers_health.c +- **depends_on**: [T7, T13, T7.44] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_health.c`, `tests/unit/test_t7_158.c`, `tests/unit/cmake/eng/t7_158.cmake`, `quality/evidence/T7.158.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CLANGTIDY-cf5f09b5a02a9bca +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.158 --regex '^test_t7_158$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.158`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.159: invalidPointerCast in sod.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_159-upstream.json`, `quality/evidence/T7.159.md`. +- **priority**: low +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-7975c2d572bc32c0, CPPCHECK-291bebc3b95eca4e +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_159-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.159`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.160: jsx-a11y/anchor-is-valid in Header.jsx +- **depends_on**: [T7, T10] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/Header.jsx`, `web/tests/remediation/t7_160.spec.jsx`, `quality/evidence/T7.160.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-366138c5d194685c +- **acceptance_criteria**: + - Use valid navigable hrefs for links and buttons for actions; verify keyboard behavior and no unexpected page navigation. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_160` + - `mkdir -p build/eng-artifacts/T7.160` + - `web/node_modules/.bin/eslint web/js/components/preact/Header.jsx --format json --output-file build/eng-artifacts/T7.160/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.160/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/anchor-is-valid'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.160`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.161: jsx-a11y/click-events-have-key-events in GridPicker.jsx, HLSVideoCell.jsx, HealthView.jsx, MSEVideoCell.jsx, StreamCard.jsx, StreamsView.jsx +- **depends_on**: [T7, T10] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/GridPicker.jsx`, `web/js/components/preact/HLSVideoCell.jsx`, `web/js/components/preact/HealthView.jsx`, `web/js/components/preact/MSEVideoCell.jsx`, `web/js/components/preact/StreamCard.jsx`, `web/js/components/preact/StreamsView.jsx`, `web/tests/remediation/t7_161.spec.jsx`, `quality/evidence/T7.161.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-ed278d9594c2abdb, ESLINT-BUCKET-67fcff31d1a4cf75, ESLINT-BUCKET-a642f51dfd2a124a, ESLINT-BUCKET-404de092ea97cc43, ESLINT-BUCKET-6243e36ec0fdb5cd, ESLINT-BUCKET-5c63d53fbef3ba6d +- **acceptance_criteria**: + - Assert Enter and Space activation where the control semantics require it, focus visibility, no double dispatch, and unchanged pointer interaction. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_161` + - `mkdir -p build/eng-artifacts/T7.161` + - `web/node_modules/.bin/eslint web/js/components/preact/GridPicker.jsx web/js/components/preact/HLSVideoCell.jsx web/js/components/preact/HealthView.jsx web/js/components/preact/MSEVideoCell.jsx web/js/components/preact/StreamCard.jsx web/js/components/preact/StreamsView.jsx --format json --output-file build/eng-artifacts/T7.161/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.161/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/click-events-have-key-events'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.161`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.162: jsx-a11y/click-events-have-key-events in ToastContainer.jsx, UI.jsx, WebRTCVideoCell.jsx, ZoneEditor.jsx, LanguageSelector.jsx, ModalDialog.jsx +- **depends_on**: [T7, T10] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/ToastContainer.jsx`, `web/js/components/preact/UI.jsx`, `web/js/components/preact/WebRTCVideoCell.jsx`, `web/js/components/preact/ZoneEditor.jsx`, `web/js/components/preact/common/LanguageSelector.jsx`, `web/js/components/preact/common/ModalDialog.jsx`, `web/tests/remediation/t7_162.spec.jsx`, `quality/evidence/T7.162.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-ab2c863c82952346, ESLINT-BUCKET-f53a71c368c33ab9, ESLINT-BUCKET-45887456841ead8b, ESLINT-BUCKET-cb235968867c79e3, ESLINT-BUCKET-02418efc105b6ab9, ESLINT-BUCKET-4e8530c09d5fd082 +- **acceptance_criteria**: + - Assert Enter and Space activation where the control semantics require it, focus visibility, no double dispatch, and unchanged pointer interaction. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_162` + - `mkdir -p build/eng-artifacts/T7.162` + - `web/node_modules/.bin/eslint web/js/components/preact/ToastContainer.jsx web/js/components/preact/UI.jsx web/js/components/preact/WebRTCVideoCell.jsx web/js/components/preact/ZoneEditor.jsx web/js/components/preact/common/LanguageSelector.jsx web/js/components/preact/common/ModalDialog.jsx --format json --output-file build/eng-artifacts/T7.162/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.162/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/click-events-have-key-events'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.162`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.163: jsx-a11y/click-events-have-key-events in LiveOperatorNavigator.jsx, RecordingsGrid.jsx, Go2rtcTab.jsx, ClearLogsModal.jsx, RestartModal.jsx, TimelinePlayer.jsx +- **depends_on**: [T7, T10] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/live/LiveOperatorNavigator.jsx`, `web/js/components/preact/recordings/RecordingsGrid.jsx`, `web/js/components/preact/settings/Go2rtcTab.jsx`, `web/js/components/preact/system/ClearLogsModal.jsx`, `web/js/components/preact/system/RestartModal.jsx`, `web/js/components/preact/timeline/TimelinePlayer.jsx`, `web/tests/remediation/t7_163.spec.jsx`, `quality/evidence/T7.163.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-f16c5e93d86bc6f9, ESLINT-BUCKET-41381cd9bd64279e, ESLINT-BUCKET-422485a76dc61a9b, ESLINT-BUCKET-44ea0e63c82a7151, ESLINT-BUCKET-155480cbfd270011, ESLINT-BUCKET-79b6e7adf4959fbc +- **acceptance_criteria**: + - Assert Enter and Space activation where the control semantics require it, focus visibility, no double dispatch, and unchanged pointer interaction. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_163` + - `mkdir -p build/eng-artifacts/T7.163` + - `web/node_modules/.bin/eslint web/js/components/preact/live/LiveOperatorNavigator.jsx web/js/components/preact/recordings/RecordingsGrid.jsx web/js/components/preact/settings/Go2rtcTab.jsx web/js/components/preact/system/ClearLogsModal.jsx web/js/components/preact/system/RestartModal.jsx web/js/components/preact/timeline/TimelinePlayer.jsx --format json --output-file build/eng-artifacts/T7.163/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.163/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/click-events-have-key-events'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.163`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.164: jsx-a11y/click-events-have-key-events in AccessPolicyModal.jsx, AddUserModal.jsx, ApiKeyModal.jsx, AuditHistoryModal.jsx, DeleteUserModal.jsx, EditUserModal.jsx +- **depends_on**: [T7, T10] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/users/AccessPolicyModal.jsx`, `web/js/components/preact/users/AddUserModal.jsx`, `web/js/components/preact/users/ApiKeyModal.jsx`, `web/js/components/preact/users/AuditHistoryModal.jsx`, `web/js/components/preact/users/DeleteUserModal.jsx`, `web/js/components/preact/users/EditUserModal.jsx`, `web/tests/remediation/t7_164.spec.jsx`, `quality/evidence/T7.164.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-0a786d21e1ee7bd2, ESLINT-BUCKET-c2dc58af6543d1f5, ESLINT-BUCKET-3b71a4c47dfd1075, ESLINT-BUCKET-ea11ae604e62541e, ESLINT-BUCKET-8d573ae471211e73, ESLINT-BUCKET-22666b8c08cd887e +- **acceptance_criteria**: + - Assert Enter and Space activation where the control semantics require it, focus visibility, no double dispatch, and unchanged pointer interaction. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_164` + - `mkdir -p build/eng-artifacts/T7.164` + - `web/node_modules/.bin/eslint web/js/components/preact/users/AccessPolicyModal.jsx web/js/components/preact/users/AddUserModal.jsx web/js/components/preact/users/ApiKeyModal.jsx web/js/components/preact/users/AuditHistoryModal.jsx web/js/components/preact/users/DeleteUserModal.jsx web/js/components/preact/users/EditUserModal.jsx --format json --output-file build/eng-artifacts/T7.164/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.164/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/click-events-have-key-events'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.164`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.165: jsx-a11y/click-events-have-key-events in RoleManagerModal.jsx, TotpSetupModal.jsx +- **depends_on**: [T7, T10] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/users/RoleManagerModal.jsx`, `web/js/components/preact/users/TotpSetupModal.jsx`, `web/tests/remediation/t7_165.spec.jsx`, `quality/evidence/T7.165.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-9190884804c0c65d, ESLINT-BUCKET-e8ce699e42be07b3 +- **acceptance_criteria**: + - Assert Enter and Space activation where the control semantics require it, focus visibility, no double dispatch, and unchanged pointer interaction. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_165` + - `mkdir -p build/eng-artifacts/T7.165` + - `web/node_modules/.bin/eslint web/js/components/preact/users/RoleManagerModal.jsx web/js/components/preact/users/TotpSetupModal.jsx --format json --output-file build/eng-artifacts/T7.165/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.165/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/click-events-have-key-events'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.165`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.166: jsx-a11y/control-has-associated-label in AuthGate.jsx, BatchDownloadModal.jsx, DetectionOverlay.jsx, FleetView.jsx, FullscreenManager.jsx, HLSVideoCell.jsx +- **depends_on**: [T7, T10, T7.161] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/AuthGate.jsx`, `web/js/components/preact/BatchDownloadModal.jsx`, `web/js/components/preact/DetectionOverlay.jsx`, `web/js/components/preact/FleetView.jsx`, `web/js/components/preact/FullscreenManager.jsx`, `web/js/components/preact/HLSVideoCell.jsx`, `web/tests/remediation/t7_166.spec.jsx`, `quality/evidence/T7.166.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-0f4bbeb4ab715fee, ESLINT-BUCKET-ef00a494fd69875c, ESLINT-BUCKET-e93ca9cb727a0aee, ESLINT-BUCKET-20e1a03b32e40002, ESLINT-BUCKET-e7e0cc4f8fd4c513, ESLINT-BUCKET-aa839344c6e5b30d +- **acceptance_criteria**: + - Render each reported control and assert a stable accessible name, including icon-only actions, without relying on title alone; retain localized labels and original action callbacks. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_166` + - `mkdir -p build/eng-artifacts/T7.166` + - `web/node_modules/.bin/eslint web/js/components/preact/AuthGate.jsx web/js/components/preact/BatchDownloadModal.jsx web/js/components/preact/DetectionOverlay.jsx web/js/components/preact/FleetView.jsx web/js/components/preact/FullscreenManager.jsx web/js/components/preact/HLSVideoCell.jsx --format json --output-file build/eng-artifacts/T7.166/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.166/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/control-has-associated-label'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.166`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.167: jsx-a11y/control-has-associated-label in LiveView.jsx, LoginView.jsx, MSEVideoCell.jsx, SetupWizard.jsx, SnapshotManager.jsx, StreamConfigModal.jsx +- **depends_on**: [T7, T10, T7.161] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/LiveView.jsx`, `web/js/components/preact/LoginView.jsx`, `web/js/components/preact/MSEVideoCell.jsx`, `web/js/components/preact/SetupWizard.jsx`, `web/js/components/preact/SnapshotManager.jsx`, `web/js/components/preact/StreamConfigModal.jsx`, `web/tests/remediation/t7_167.spec.jsx`, `quality/evidence/T7.167.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-ae74d74f4f8f96b4, ESLINT-BUCKET-33c31857a85153c5, ESLINT-BUCKET-2b401ef7608cff74, ESLINT-BUCKET-6b623e0db3f455c7, ESLINT-BUCKET-63e9c68b97a2b704, ESLINT-BUCKET-3d882f111ea61422 +- **acceptance_criteria**: + - Render each reported control and assert a stable accessible name, including icon-only actions, without relying on title alone; retain localized labels and original action callbacks. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_167` + - `mkdir -p build/eng-artifacts/T7.167` + - `web/node_modules/.bin/eslint web/js/components/preact/LiveView.jsx web/js/components/preact/LoginView.jsx web/js/components/preact/MSEVideoCell.jsx web/js/components/preact/SetupWizard.jsx web/js/components/preact/SnapshotManager.jsx web/js/components/preact/StreamConfigModal.jsx --format json --output-file build/eng-artifacts/T7.167/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.167/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/control-has-associated-label'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.167`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.168: jsx-a11y/control-has-associated-label in StreamsView.jsx, ThemeCustomizer.jsx, UI.jsx, WebRTCVideoCell.jsx, ZoneEditor.jsx, ModalDialog.jsx +- **depends_on**: [T7, T10, T7.161, T7.162] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/StreamsView.jsx`, `web/js/components/preact/ThemeCustomizer.jsx`, `web/js/components/preact/UI.jsx`, `web/js/components/preact/WebRTCVideoCell.jsx`, `web/js/components/preact/ZoneEditor.jsx`, `web/js/components/preact/common/ModalDialog.jsx`, `web/tests/remediation/t7_168.spec.jsx`, `quality/evidence/T7.168.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-ba71da8483425ebf, ESLINT-BUCKET-6ffa955639ab6418, ESLINT-BUCKET-6faae6bddf434aab, ESLINT-BUCKET-9bd9a8994dceced4, ESLINT-BUCKET-e845a2e465702318, ESLINT-BUCKET-1f35f119bab13f92 +- **acceptance_criteria**: + - Render each reported control and assert a stable accessible name, including icon-only actions, without relying on title alone; retain localized labels and original action callbacks. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_168` + - `mkdir -p build/eng-artifacts/T7.168` + - `web/node_modules/.bin/eslint web/js/components/preact/StreamsView.jsx web/js/components/preact/ThemeCustomizer.jsx web/js/components/preact/UI.jsx web/js/components/preact/WebRTCVideoCell.jsx web/js/components/preact/ZoneEditor.jsx web/js/components/preact/common/ModalDialog.jsx --format json --output-file build/eng-artifacts/T7.168/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.168/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/control-has-associated-label'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.168`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.169: jsx-a11y/control-has-associated-label in EventDestinationEditor.jsx, EventRouteEditor.jsx, BulkOrganizeModal.jsx, CollectionManager.jsx, CollectionSelectorBuilder.jsx, FleetFilters.jsx +- **depends_on**: [T7, T10] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/events/EventDestinationEditor.jsx`, `web/js/components/preact/events/EventRouteEditor.jsx`, `web/js/components/preact/fleet/BulkOrganizeModal.jsx`, `web/js/components/preact/fleet/CollectionManager.jsx`, `web/js/components/preact/fleet/CollectionSelectorBuilder.jsx`, `web/js/components/preact/fleet/FleetFilters.jsx`, `web/tests/remediation/t7_169.spec.jsx`, `quality/evidence/T7.169.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-5088d976b993e707, ESLINT-BUCKET-fea403cece7fffa3, ESLINT-BUCKET-20d0442e85244a5d, ESLINT-BUCKET-03b8b95f3bd44235, ESLINT-BUCKET-993ef9a219cc29a2, ESLINT-BUCKET-eaa9041228587f50 +- **acceptance_criteria**: + - Render each reported control and assert a stable accessible name, including icon-only actions, without relying on title alone; retain localized labels and original action callbacks. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_169` + - `mkdir -p build/eng-artifacts/T7.169` + - `web/node_modules/.bin/eslint web/js/components/preact/events/EventDestinationEditor.jsx web/js/components/preact/events/EventRouteEditor.jsx web/js/components/preact/fleet/BulkOrganizeModal.jsx web/js/components/preact/fleet/CollectionManager.jsx web/js/components/preact/fleet/CollectionSelectorBuilder.jsx web/js/components/preact/fleet/FleetFilters.jsx --format json --output-file build/eng-artifacts/T7.169/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.169/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/control-has-associated-label'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.169`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.170: jsx-a11y/control-has-associated-label in OrganizationManager.jsx, SavedViewsBar.jsx, StaticCollectionMembers.jsx, InvestigationActions.jsx, InvestigationBookmarks.jsx, InvestigationView.jsx +- **depends_on**: [T7, T10] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/fleet/OrganizationManager.jsx`, `web/js/components/preact/fleet/SavedViewsBar.jsx`, `web/js/components/preact/fleet/StaticCollectionMembers.jsx`, `web/js/components/preact/investigation/InvestigationActions.jsx`, `web/js/components/preact/investigation/InvestigationBookmarks.jsx`, `web/js/components/preact/investigation/InvestigationView.jsx`, `web/tests/remediation/t7_170.spec.jsx`, `quality/evidence/T7.170.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-19d5fc636e3f15e6, ESLINT-BUCKET-2cdd7ef73529551e, ESLINT-BUCKET-5a25b9ace393f230, ESLINT-BUCKET-12c7bb31966e53aa, ESLINT-BUCKET-274240d1fc0300f7, ESLINT-BUCKET-2a20bf23c61a102e +- **acceptance_criteria**: + - Render each reported control and assert a stable accessible name, including icon-only actions, without relying on title alone; retain localized labels and original action callbacks. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_170` + - `mkdir -p build/eng-artifacts/T7.170` + - `web/node_modules/.bin/eslint web/js/components/preact/fleet/OrganizationManager.jsx web/js/components/preact/fleet/SavedViewsBar.jsx web/js/components/preact/fleet/StaticCollectionMembers.jsx web/js/components/preact/investigation/InvestigationActions.jsx web/js/components/preact/investigation/InvestigationBookmarks.jsx web/js/components/preact/investigation/InvestigationView.jsx --format json --output-file build/eng-artifacts/T7.170/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.170/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/control-has-associated-label'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.170`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.171: jsx-a11y/control-has-associated-label in LiveBuildingPlan.jsx, LiveOperatorNavigator.jsx, PlanSketchControls.jsx, FiltersSidebar.jsx, RecordingsGrid.jsx, RecordingsTable.jsx +- **depends_on**: [T7, T10, T7.163] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/live/LiveBuildingPlan.jsx`, `web/js/components/preact/live/LiveOperatorNavigator.jsx`, `web/js/components/preact/live/PlanSketchControls.jsx`, `web/js/components/preact/recordings/FiltersSidebar.jsx`, `web/js/components/preact/recordings/RecordingsGrid.jsx`, `web/js/components/preact/recordings/RecordingsTable.jsx`, `web/tests/remediation/t7_171.spec.jsx`, `quality/evidence/T7.171.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-bb1a968a245405ec, ESLINT-BUCKET-3a6fb0a94ef6ffdf, ESLINT-BUCKET-e0e4b387af698b40, ESLINT-BUCKET-389226ea0147ea5d, ESLINT-BUCKET-aab67d5bbb7b5489, ESLINT-BUCKET-f492731b13ec277c +- **acceptance_criteria**: + - Render each reported control and assert a stable accessible name, including icon-only actions, without relying on title alone; retain localized labels and original action callbacks. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_171` + - `mkdir -p build/eng-artifacts/T7.171` + - `web/node_modules/.bin/eslint web/js/components/preact/live/LiveBuildingPlan.jsx web/js/components/preact/live/LiveOperatorNavigator.jsx web/js/components/preact/live/PlanSketchControls.jsx web/js/components/preact/recordings/FiltersSidebar.jsx web/js/components/preact/recordings/RecordingsGrid.jsx web/js/components/preact/recordings/RecordingsTable.jsx --format json --output-file build/eng-artifacts/T7.171/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.171/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/control-has-associated-label'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.171`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.172: jsx-a11y/control-has-associated-label in TagsOverlay.jsx, AdvancedTab.jsx, AuthTab.jsx, DetectionTab.jsx, GeneralTab.jsx, Go2rtcTab.jsx +- **depends_on**: [T7, T10, T7.163] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/recordings/TagsOverlay.jsx`, `web/js/components/preact/settings/AdvancedTab.jsx`, `web/js/components/preact/settings/AuthTab.jsx`, `web/js/components/preact/settings/DetectionTab.jsx`, `web/js/components/preact/settings/GeneralTab.jsx`, `web/js/components/preact/settings/Go2rtcTab.jsx`, `web/tests/remediation/t7_172.spec.jsx`, `quality/evidence/T7.172.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-d03afa69ead3203e, ESLINT-BUCKET-8ce22b0413a485e1, ESLINT-BUCKET-40ef7b2f328bb9ef, ESLINT-BUCKET-93d2b8db97a42555, ESLINT-BUCKET-ea86635ccd79513e, ESLINT-BUCKET-5ec0649750441f81 +- **acceptance_criteria**: + - Render each reported control and assert a stable accessible name, including icon-only actions, without relying on title alone; retain localized labels and original action callbacks. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_172` + - `mkdir -p build/eng-artifacts/T7.172` + - `web/node_modules/.bin/eslint web/js/components/preact/recordings/TagsOverlay.jsx web/js/components/preact/settings/AdvancedTab.jsx web/js/components/preact/settings/AuthTab.jsx web/js/components/preact/settings/DetectionTab.jsx web/js/components/preact/settings/GeneralTab.jsx web/js/components/preact/settings/Go2rtcTab.jsx --format json --output-file build/eng-artifacts/T7.172/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.172/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/control-has-associated-label'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.172`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.173: jsx-a11y/control-has-associated-label in HealthTab.jsx, MqttTab.jsx, StorageTab.jsx, StreamsDefaultsTab.jsx, StreamStorage.jsx, CalendarPicker.jsx +- **depends_on**: [T7, T10] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/settings/HealthTab.jsx`, `web/js/components/preact/settings/MqttTab.jsx`, `web/js/components/preact/settings/StorageTab.jsx`, `web/js/components/preact/settings/StreamsDefaultsTab.jsx`, `web/js/components/preact/system/StreamStorage.jsx`, `web/js/components/preact/timeline/CalendarPicker.jsx`, `web/tests/remediation/t7_173.spec.jsx`, `quality/evidence/T7.173.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-fe8c1e237393fb23, ESLINT-BUCKET-59e343114dc251b1, ESLINT-BUCKET-5a1cbbfddf8f3fcc, ESLINT-BUCKET-350da16b1c3b2274, ESLINT-BUCKET-44b516dc2eeb97bf, ESLINT-BUCKET-5da42ce096a9fa82 +- **acceptance_criteria**: + - Render each reported control and assert a stable accessible name, including icon-only actions, without relying on title alone; retain localized labels and original action callbacks. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_173` + - `mkdir -p build/eng-artifacts/T7.173` + - `web/node_modules/.bin/eslint web/js/components/preact/settings/HealthTab.jsx web/js/components/preact/settings/MqttTab.jsx web/js/components/preact/settings/StorageTab.jsx web/js/components/preact/settings/StreamsDefaultsTab.jsx web/js/components/preact/system/StreamStorage.jsx web/js/components/preact/timeline/CalendarPicker.jsx --format json --output-file build/eng-artifacts/T7.173/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.173/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/control-has-associated-label'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.173`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.174: jsx-a11y/control-has-associated-label in TimelineControls.jsx, TimelinePlayer.jsx, AddUserModal.jsx, ApiKeyModal.jsx, AuditHistoryModal.jsx, EditUserModal.jsx +- **depends_on**: [T7, T10, T7.163, T7.164] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/timeline/TimelineControls.jsx`, `web/js/components/preact/timeline/TimelinePlayer.jsx`, `web/js/components/preact/users/AddUserModal.jsx`, `web/js/components/preact/users/ApiKeyModal.jsx`, `web/js/components/preact/users/AuditHistoryModal.jsx`, `web/js/components/preact/users/EditUserModal.jsx`, `web/tests/remediation/t7_174.spec.jsx`, `quality/evidence/T7.174.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-7b00d558899dd292, ESLINT-BUCKET-4e38c49052b49016, ESLINT-BUCKET-6af902622576c683, ESLINT-BUCKET-098293b0fb5320bb, ESLINT-BUCKET-f25f197e02c782fc, ESLINT-BUCKET-ccf3e6e7959d2bd7 +- **acceptance_criteria**: + - Render each reported control and assert a stable accessible name, including icon-only actions, without relying on title alone; retain localized labels and original action callbacks. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_174` + - `mkdir -p build/eng-artifacts/T7.174` + - `web/node_modules/.bin/eslint web/js/components/preact/timeline/TimelineControls.jsx web/js/components/preact/timeline/TimelinePlayer.jsx web/js/components/preact/users/AddUserModal.jsx web/js/components/preact/users/ApiKeyModal.jsx web/js/components/preact/users/AuditHistoryModal.jsx web/js/components/preact/users/EditUserModal.jsx --format json --output-file build/eng-artifacts/T7.174/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.174/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/control-has-associated-label'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.174`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.175: jsx-a11y/control-has-associated-label in RoleManagerModal.jsx, TotpSetupModal.jsx, UsersTable.jsx +- **depends_on**: [T7, T10, T7.165] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/users/RoleManagerModal.jsx`, `web/js/components/preact/users/TotpSetupModal.jsx`, `web/js/components/preact/users/UsersTable.jsx`, `web/tests/remediation/t7_175.spec.jsx`, `quality/evidence/T7.175.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-400e44e71536be4e, ESLINT-BUCKET-d3aede71a08c3a5f, ESLINT-BUCKET-fcf1de019f6b4533 +- **acceptance_criteria**: + - Render each reported control and assert a stable accessible name, including icon-only actions, without relying on title alone; retain localized labels and original action callbacks. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_175` + - `mkdir -p build/eng-artifacts/T7.175` + - `web/node_modules/.bin/eslint web/js/components/preact/users/RoleManagerModal.jsx web/js/components/preact/users/TotpSetupModal.jsx web/js/components/preact/users/UsersTable.jsx --format json --output-file build/eng-artifacts/T7.175/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.175/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/control-has-associated-label'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.175`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.176: jsx-a11y/interactive-supports-focus in MobileTileGestures.jsx +- **depends_on**: [T7, T10] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/MobileTileGestures.jsx`, `web/tests/remediation/t7_176.spec.jsx`, `quality/evidence/T7.176.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-3469a0a703cdbc12 +- **acceptance_criteria**: + - Assert each interactive control is keyboard focusable and acts once for its expected activation keys. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_176` + - `mkdir -p build/eng-artifacts/T7.176` + - `web/node_modules/.bin/eslint web/js/components/preact/MobileTileGestures.jsx --format json --output-file build/eng-artifacts/T7.176/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.176/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/interactive-supports-focus'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.176`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.177: jsx-a11y/label-has-associated-control in BatchDownloadModal.jsx, StreamConfigModal.jsx, EventDestinationEditor.jsx, EventRouteEditor.jsx, CollectionManager.jsx, StaticCollectionMembers.jsx +- **depends_on**: [T7, T10, T7.166, T7.167, T7.169, T7.170] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/BatchDownloadModal.jsx`, `web/js/components/preact/StreamConfigModal.jsx`, `web/js/components/preact/events/EventDestinationEditor.jsx`, `web/js/components/preact/events/EventRouteEditor.jsx`, `web/js/components/preact/fleet/CollectionManager.jsx`, `web/js/components/preact/fleet/StaticCollectionMembers.jsx`, `web/tests/remediation/t7_177.spec.jsx`, `quality/evidence/T7.177.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-199d3d91208953b4, ESLINT-BUCKET-81a756fe7228ad5b, ESLINT-BUCKET-ddc6803a9b16e391, ESLINT-BUCKET-7cde28afaa9ffb65, ESLINT-BUCKET-7dcecd444f491721, ESLINT-BUCKET-9308fe6583bcdce7 +- **acceptance_criteria**: + - Assert label/input association is programmatic, unique in repeated forms, localized and preserved during conditional rendering. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_177` + - `mkdir -p build/eng-artifacts/T7.177` + - `web/node_modules/.bin/eslint web/js/components/preact/BatchDownloadModal.jsx web/js/components/preact/StreamConfigModal.jsx web/js/components/preact/events/EventDestinationEditor.jsx web/js/components/preact/events/EventRouteEditor.jsx web/js/components/preact/fleet/CollectionManager.jsx web/js/components/preact/fleet/StaticCollectionMembers.jsx --format json --output-file build/eng-artifacts/T7.177/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.177/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/label-has-associated-control'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.177`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.178: jsx-a11y/label-has-associated-control in HealthTab.jsx, StorageTab.jsx, ApiKeyModal.jsx +- **depends_on**: [T7, T10, T7.173, T7.174] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/settings/HealthTab.jsx`, `web/js/components/preact/settings/StorageTab.jsx`, `web/js/components/preact/users/ApiKeyModal.jsx`, `web/tests/remediation/t7_178.spec.jsx`, `quality/evidence/T7.178.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-5e7cfcb56208eaa9, ESLINT-BUCKET-e84d458d8fcd3eef, ESLINT-BUCKET-cf4b93673820960b +- **acceptance_criteria**: + - Assert label/input association is programmatic, unique in repeated forms, localized and preserved during conditional rendering. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_178` + - `mkdir -p build/eng-artifacts/T7.178` + - `web/node_modules/.bin/eslint web/js/components/preact/settings/HealthTab.jsx web/js/components/preact/settings/StorageTab.jsx web/js/components/preact/users/ApiKeyModal.jsx --format json --output-file build/eng-artifacts/T7.178/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.178/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/label-has-associated-control'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.178`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.179: jsx-a11y/label-has-for in AuthGate.jsx, BatchDownloadModal.jsx, FleetView.jsx, LiveView.jsx, LoginView.jsx, SetupWizard.jsx +- **depends_on**: [T7, T10, T7.166, T7.177, T7.167] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/AuthGate.jsx`, `web/js/components/preact/BatchDownloadModal.jsx`, `web/js/components/preact/FleetView.jsx`, `web/js/components/preact/LiveView.jsx`, `web/js/components/preact/LoginView.jsx`, `web/js/components/preact/SetupWizard.jsx`, `web/tests/remediation/t7_179.spec.jsx`, `quality/evidence/T7.179.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-00c9eb79387b90d1, ESLINT-BUCKET-c603f4c09210c0bd, ESLINT-BUCKET-07e48ad6ea9ce45e, ESLINT-BUCKET-dfeaa6c4a9abf5fa, ESLINT-BUCKET-98f2a6813a7ad225, ESLINT-BUCKET-e73c0530b2243573 +- **acceptance_criteria**: + - Assert each label resolves to its intended input by id/for with unique IDs across repeated components and that clicking it focuses the input. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_179` + - `mkdir -p build/eng-artifacts/T7.179` + - `web/node_modules/.bin/eslint web/js/components/preact/AuthGate.jsx web/js/components/preact/BatchDownloadModal.jsx web/js/components/preact/FleetView.jsx web/js/components/preact/LiveView.jsx web/js/components/preact/LoginView.jsx web/js/components/preact/SetupWizard.jsx --format json --output-file build/eng-artifacts/T7.179/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.179/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/label-has-for'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.179`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.180: jsx-a11y/label-has-for in StreamCard.jsx, StreamConfigModal.jsx, StreamsView.jsx, UI.jsx, ZoneEditor.jsx, ModalDialog.jsx +- **depends_on**: [T7, T10, T7.161, T7.177, T7.168] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/StreamCard.jsx`, `web/js/components/preact/StreamConfigModal.jsx`, `web/js/components/preact/StreamsView.jsx`, `web/js/components/preact/UI.jsx`, `web/js/components/preact/ZoneEditor.jsx`, `web/js/components/preact/common/ModalDialog.jsx`, `web/tests/remediation/t7_180.spec.jsx`, `quality/evidence/T7.180.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-c4c40aa44f4e62e4, ESLINT-BUCKET-d900a116e1f06cf4, ESLINT-BUCKET-de63541e57266afb, ESLINT-BUCKET-e810ef87137eb5d8, ESLINT-BUCKET-38ac9714530327f7, ESLINT-BUCKET-b1a74f710eb47a22 +- **acceptance_criteria**: + - Assert each label resolves to its intended input by id/for with unique IDs across repeated components and that clicking it focuses the input. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_180` + - `mkdir -p build/eng-artifacts/T7.180` + - `web/node_modules/.bin/eslint web/js/components/preact/StreamCard.jsx web/js/components/preact/StreamConfigModal.jsx web/js/components/preact/StreamsView.jsx web/js/components/preact/UI.jsx web/js/components/preact/ZoneEditor.jsx web/js/components/preact/common/ModalDialog.jsx --format json --output-file build/eng-artifacts/T7.180/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.180/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/label-has-for'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.180`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.181: jsx-a11y/label-has-for in EventDestinationEditor.jsx, EventRouteEditor.jsx, BulkOrganizeModal.jsx, CollectionManager.jsx, CollectionSelectorBuilder.jsx, FleetTable.jsx +- **depends_on**: [T7, T10, T7.177, T7.169] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/events/EventDestinationEditor.jsx`, `web/js/components/preact/events/EventRouteEditor.jsx`, `web/js/components/preact/fleet/BulkOrganizeModal.jsx`, `web/js/components/preact/fleet/CollectionManager.jsx`, `web/js/components/preact/fleet/CollectionSelectorBuilder.jsx`, `web/js/components/preact/fleet/FleetTable.jsx`, `web/tests/remediation/t7_181.spec.jsx`, `quality/evidence/T7.181.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-2d6e882afea8fed1, ESLINT-BUCKET-f3bd5129ab03f352, ESLINT-BUCKET-7ba2e66a4eb3914f, ESLINT-BUCKET-05ad31a80cc2b3a2, ESLINT-BUCKET-30a2e484727d4a5a, ESLINT-BUCKET-b32370126e568d01 +- **acceptance_criteria**: + - Assert each label resolves to its intended input by id/for with unique IDs across repeated components and that clicking it focuses the input. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_181` + - `mkdir -p build/eng-artifacts/T7.181` + - `web/node_modules/.bin/eslint web/js/components/preact/events/EventDestinationEditor.jsx web/js/components/preact/events/EventRouteEditor.jsx web/js/components/preact/fleet/BulkOrganizeModal.jsx web/js/components/preact/fleet/CollectionManager.jsx web/js/components/preact/fleet/CollectionSelectorBuilder.jsx web/js/components/preact/fleet/FleetTable.jsx --format json --output-file build/eng-artifacts/T7.181/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.181/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/label-has-for'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.181`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.182: jsx-a11y/label-has-for in OrganizationManager.jsx, SavedViewsBar.jsx, StaticCollectionMembers.jsx, InvestigationActions.jsx, InvestigationBookmarks.jsx, InvestigationView.jsx +- **depends_on**: [T7, T10, T7.170, T7.177] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/fleet/OrganizationManager.jsx`, `web/js/components/preact/fleet/SavedViewsBar.jsx`, `web/js/components/preact/fleet/StaticCollectionMembers.jsx`, `web/js/components/preact/investigation/InvestigationActions.jsx`, `web/js/components/preact/investigation/InvestigationBookmarks.jsx`, `web/js/components/preact/investigation/InvestigationView.jsx`, `web/tests/remediation/t7_182.spec.jsx`, `quality/evidence/T7.182.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-f77074e66ed65721, ESLINT-BUCKET-e26c8068ece9c0e0, ESLINT-BUCKET-4246d4277a0b8f04, ESLINT-BUCKET-642b5326a1034302, ESLINT-BUCKET-c0802f3ddbb20b2e, ESLINT-BUCKET-137cbeae12c87193 +- **acceptance_criteria**: + - Assert each label resolves to its intended input by id/for with unique IDs across repeated components and that clicking it focuses the input. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_182` + - `mkdir -p build/eng-artifacts/T7.182` + - `web/node_modules/.bin/eslint web/js/components/preact/fleet/OrganizationManager.jsx web/js/components/preact/fleet/SavedViewsBar.jsx web/js/components/preact/fleet/StaticCollectionMembers.jsx web/js/components/preact/investigation/InvestigationActions.jsx web/js/components/preact/investigation/InvestigationBookmarks.jsx web/js/components/preact/investigation/InvestigationView.jsx --format json --output-file build/eng-artifacts/T7.182/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.182/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/label-has-for'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.182`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.183: jsx-a11y/label-has-for in LiveBuildingPlan.jsx, LiveOperatorNavigator.jsx, FiltersSidebar.jsx, RecordingsGrid.jsx, RecordingsTable.jsx, TagsOverlay.jsx +- **depends_on**: [T7, T10, T7.171, T7.172] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/live/LiveBuildingPlan.jsx`, `web/js/components/preact/live/LiveOperatorNavigator.jsx`, `web/js/components/preact/recordings/FiltersSidebar.jsx`, `web/js/components/preact/recordings/RecordingsGrid.jsx`, `web/js/components/preact/recordings/RecordingsTable.jsx`, `web/js/components/preact/recordings/TagsOverlay.jsx`, `web/tests/remediation/t7_183.spec.jsx`, `quality/evidence/T7.183.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-a167dfb879b1b9cf, ESLINT-BUCKET-b0e1dbc8e8cc536e, ESLINT-BUCKET-50994f387baeaa69, ESLINT-BUCKET-dcde47440ba091e3, ESLINT-BUCKET-114c375fcc3b4802, ESLINT-BUCKET-8b431e9fa35d81ba +- **acceptance_criteria**: + - Assert each label resolves to its intended input by id/for with unique IDs across repeated components and that clicking it focuses the input. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_183` + - `mkdir -p build/eng-artifacts/T7.183` + - `web/node_modules/.bin/eslint web/js/components/preact/live/LiveBuildingPlan.jsx web/js/components/preact/live/LiveOperatorNavigator.jsx web/js/components/preact/recordings/FiltersSidebar.jsx web/js/components/preact/recordings/RecordingsGrid.jsx web/js/components/preact/recordings/RecordingsTable.jsx web/js/components/preact/recordings/TagsOverlay.jsx --format json --output-file build/eng-artifacts/T7.183/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.183/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/label-has-for'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.183`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.184: jsx-a11y/label-has-for in AdvancedTab.jsx, AuthTab.jsx, DetectionTab.jsx, GeneralTab.jsx, Go2rtcTab.jsx, HealthTab.jsx +- **depends_on**: [T7, T10, T7.172, T7.178] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/settings/AdvancedTab.jsx`, `web/js/components/preact/settings/AuthTab.jsx`, `web/js/components/preact/settings/DetectionTab.jsx`, `web/js/components/preact/settings/GeneralTab.jsx`, `web/js/components/preact/settings/Go2rtcTab.jsx`, `web/js/components/preact/settings/HealthTab.jsx`, `web/tests/remediation/t7_184.spec.jsx`, `quality/evidence/T7.184.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-a4e1217d107c230c, ESLINT-BUCKET-4a0d0e1ea3635a24, ESLINT-BUCKET-d6ed69efe339ce37, ESLINT-BUCKET-61d1473d84fbeea6, ESLINT-BUCKET-dd680edebf6809ff, ESLINT-BUCKET-e267f8f47c3806d3 +- **acceptance_criteria**: + - Assert each label resolves to its intended input by id/for with unique IDs across repeated components and that clicking it focuses the input. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_184` + - `mkdir -p build/eng-artifacts/T7.184` + - `web/node_modules/.bin/eslint web/js/components/preact/settings/AdvancedTab.jsx web/js/components/preact/settings/AuthTab.jsx web/js/components/preact/settings/DetectionTab.jsx web/js/components/preact/settings/GeneralTab.jsx web/js/components/preact/settings/Go2rtcTab.jsx web/js/components/preact/settings/HealthTab.jsx --format json --output-file build/eng-artifacts/T7.184/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.184/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/label-has-for'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.184`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.185: jsx-a11y/label-has-for in MqttTab.jsx, StorageTab.jsx, StreamsDefaultsTab.jsx, WorkspacesTab.jsx, TimelinePage.jsx, TimelinePlayer.jsx +- **depends_on**: [T7, T10, T7.173, T7.178, T7.174] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/settings/MqttTab.jsx`, `web/js/components/preact/settings/StorageTab.jsx`, `web/js/components/preact/settings/StreamsDefaultsTab.jsx`, `web/js/components/preact/settings/WorkspacesTab.jsx`, `web/js/components/preact/timeline/TimelinePage.jsx`, `web/js/components/preact/timeline/TimelinePlayer.jsx`, `web/tests/remediation/t7_185.spec.jsx`, `quality/evidence/T7.185.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-d5ecbc0292c55216, ESLINT-BUCKET-c067bb3093f57d49, ESLINT-BUCKET-4e8b56001c3a0722, ESLINT-BUCKET-223399111dfd4016, ESLINT-BUCKET-7d2f50f4d066f6e4, ESLINT-BUCKET-00d366c5691b4bb5 +- **acceptance_criteria**: + - Assert each label resolves to its intended input by id/for with unique IDs across repeated components and that clicking it focuses the input. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_185` + - `mkdir -p build/eng-artifacts/T7.185` + - `web/node_modules/.bin/eslint web/js/components/preact/settings/MqttTab.jsx web/js/components/preact/settings/StorageTab.jsx web/js/components/preact/settings/StreamsDefaultsTab.jsx web/js/components/preact/settings/WorkspacesTab.jsx web/js/components/preact/timeline/TimelinePage.jsx web/js/components/preact/timeline/TimelinePlayer.jsx --format json --output-file build/eng-artifacts/T7.185/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.185/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/label-has-for'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.185`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.186: jsx-a11y/label-has-for in AccessPolicyModal.jsx, AddUserModal.jsx, ApiKeyModal.jsx, AuditDecisionModes.jsx, AuditHistoryModal.jsx, EditUserModal.jsx +- **depends_on**: [T7, T10, T7.164, T7.174, T7.178] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/users/AccessPolicyModal.jsx`, `web/js/components/preact/users/AddUserModal.jsx`, `web/js/components/preact/users/ApiKeyModal.jsx`, `web/js/components/preact/users/AuditDecisionModes.jsx`, `web/js/components/preact/users/AuditHistoryModal.jsx`, `web/js/components/preact/users/EditUserModal.jsx`, `web/tests/remediation/t7_186.spec.jsx`, `quality/evidence/T7.186.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-7f43090b7b01626a, ESLINT-BUCKET-17ad0e14291e8ec3, ESLINT-BUCKET-18b7f3add93999e4, ESLINT-BUCKET-d3157833e1568912, ESLINT-BUCKET-184f5809a1f3d621, ESLINT-BUCKET-682efc8151a90daf +- **acceptance_criteria**: + - Assert each label resolves to its intended input by id/for with unique IDs across repeated components and that clicking it focuses the input. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_186` + - `mkdir -p build/eng-artifacts/T7.186` + - `web/node_modules/.bin/eslint web/js/components/preact/users/AccessPolicyModal.jsx web/js/components/preact/users/AddUserModal.jsx web/js/components/preact/users/ApiKeyModal.jsx web/js/components/preact/users/AuditDecisionModes.jsx web/js/components/preact/users/AuditHistoryModal.jsx web/js/components/preact/users/EditUserModal.jsx --format json --output-file build/eng-artifacts/T7.186/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.186/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/label-has-for'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.186`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.187: jsx-a11y/label-has-for in RoleManagerModal.jsx, TotpSetupModal.jsx +- **depends_on**: [T7, T10, T7.175] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/users/RoleManagerModal.jsx`, `web/js/components/preact/users/TotpSetupModal.jsx`, `web/tests/remediation/t7_187.spec.jsx`, `quality/evidence/T7.187.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-2e14d60ae388c180, ESLINT-BUCKET-9a54a74c58d29d4c +- **acceptance_criteria**: + - Assert each label resolves to its intended input by id/for with unique IDs across repeated components and that clicking it focuses the input. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_187` + - `mkdir -p build/eng-artifacts/T7.187` + - `web/node_modules/.bin/eslint web/js/components/preact/users/RoleManagerModal.jsx web/js/components/preact/users/TotpSetupModal.jsx --format json --output-file build/eng-artifacts/T7.187/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.187/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/label-has-for'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.187`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.188: jsx-a11y/media-has-caption in HLSVideoCell.jsx, MSEVideoCell.jsx, UI.jsx, WebRTCVideoCell.jsx, InvestigationView.jsx, TimelinePlayer.jsx +- **depends_on**: [T7, T10, T7.166, T7.167, T7.180, T7.168, T7.182, T7.185] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/HLSVideoCell.jsx`, `web/js/components/preact/MSEVideoCell.jsx`, `web/js/components/preact/UI.jsx`, `web/js/components/preact/WebRTCVideoCell.jsx`, `web/js/components/preact/investigation/InvestigationView.jsx`, `web/js/components/preact/timeline/TimelinePlayer.jsx`, `web/tests/remediation/t7_188.spec.jsx`, `quality/evidence/T7.188.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-165a348ebdcecd71, ESLINT-BUCKET-1760eab07e0cce49, ESLINT-BUCKET-df0c5f209b6ef6ab, ESLINT-BUCKET-c464a6c1e23bf196, ESLINT-BUCKET-de50a4c99ae7d421, ESLINT-BUCKET-7189b497b5a855df +- **acceptance_criteria**: + - Identify prerecorded speech versus live/silent surveillance streams; provide applicable caption support, or an explicitly reviewed narrow semantic exception with evidence. Never add a fake empty caption track. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_188` + - `mkdir -p build/eng-artifacts/T7.188` + - `web/node_modules/.bin/eslint web/js/components/preact/HLSVideoCell.jsx web/js/components/preact/MSEVideoCell.jsx web/js/components/preact/UI.jsx web/js/components/preact/WebRTCVideoCell.jsx web/js/components/preact/investigation/InvestigationView.jsx web/js/components/preact/timeline/TimelinePlayer.jsx --format json --output-file build/eng-artifacts/T7.188/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.188/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/media-has-caption'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.188`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.189: jsx-a11y/mouse-events-have-key-events in DayNightControl.jsx, HLSVideoCell.jsx, SnapshotManager.jsx, StreamCard.jsx, StreamsView.jsx, Toast.jsx +- **depends_on**: [T7, T10, T7.188, T7.167, T7.180] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/DayNightControl.jsx`, `web/js/components/preact/HLSVideoCell.jsx`, `web/js/components/preact/SnapshotManager.jsx`, `web/js/components/preact/StreamCard.jsx`, `web/js/components/preact/StreamsView.jsx`, `web/js/components/preact/Toast.jsx`, `web/tests/remediation/t7_189.spec.jsx`, `quality/evidence/T7.189.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-bc4e9a8b10d83163, ESLINT-BUCKET-c31a4d9816cac7ce, ESLINT-BUCKET-e715a00f3dbe2f4f, ESLINT-BUCKET-9a70a1ccf37b9405, ESLINT-BUCKET-e876245abbef0a79, ESLINT-BUCKET-c811624672d6bfff +- **acceptance_criteria**: + - Assert focus/blur and mouse enter/leave expose and dismiss the same content without trapping focus. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_189` + - `mkdir -p build/eng-artifacts/T7.189` + - `web/node_modules/.bin/eslint web/js/components/preact/DayNightControl.jsx web/js/components/preact/HLSVideoCell.jsx web/js/components/preact/SnapshotManager.jsx web/js/components/preact/StreamCard.jsx web/js/components/preact/StreamsView.jsx web/js/components/preact/Toast.jsx --format json --output-file build/eng-artifacts/T7.189/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.189/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/mouse-events-have-key-events'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.189`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.190: jsx-a11y/mouse-events-have-key-events in WebRTCVideoCell.jsx, RecordingsTable.jsx, TimelinePage.jsx +- **depends_on**: [T7, T10, T7.188, T7.183, T7.185] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/WebRTCVideoCell.jsx`, `web/js/components/preact/recordings/RecordingsTable.jsx`, `web/js/components/preact/timeline/TimelinePage.jsx`, `web/tests/remediation/t7_190.spec.jsx`, `quality/evidence/T7.190.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-a4f59c579d19ce1e, ESLINT-BUCKET-7a540f91903a1e57, ESLINT-BUCKET-dcdb657c2038e332 +- **acceptance_criteria**: + - Assert focus/blur and mouse enter/leave expose and dismiss the same content without trapping focus. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_190` + - `mkdir -p build/eng-artifacts/T7.190` + - `web/node_modules/.bin/eslint web/js/components/preact/WebRTCVideoCell.jsx web/js/components/preact/recordings/RecordingsTable.jsx web/js/components/preact/timeline/TimelinePage.jsx --format json --output-file build/eng-artifacts/T7.190/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.190/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/mouse-events-have-key-events'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.190`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.191: jsx-a11y/no-autofocus in AuthGate.jsx, LoginView.jsx, EventDestinationEditor.jsx, EventRouteEditor.jsx, CollectionManager.jsx, OrganizationManager.jsx +- **depends_on**: [T7, T10, T7.179, T7.181, T7.182] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/AuthGate.jsx`, `web/js/components/preact/LoginView.jsx`, `web/js/components/preact/events/EventDestinationEditor.jsx`, `web/js/components/preact/events/EventRouteEditor.jsx`, `web/js/components/preact/fleet/CollectionManager.jsx`, `web/js/components/preact/fleet/OrganizationManager.jsx`, `web/tests/remediation/t7_191.spec.jsx`, `quality/evidence/T7.191.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-20016996a3c7e096, ESLINT-BUCKET-92718cbd3fc79c29, ESLINT-BUCKET-71520b6429344586, ESLINT-BUCKET-82f90000b805b238, ESLINT-BUCKET-2acf09b0886c70c8, ESLINT-BUCKET-e6884093b3a77737 +- **acceptance_criteria**: + - Assert initial render does not steal focus; explicit dialog-open focus management must return focus to the invoker on close. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_191` + - `mkdir -p build/eng-artifacts/T7.191` + - `web/node_modules/.bin/eslint web/js/components/preact/AuthGate.jsx web/js/components/preact/LoginView.jsx web/js/components/preact/events/EventDestinationEditor.jsx web/js/components/preact/events/EventRouteEditor.jsx web/js/components/preact/fleet/CollectionManager.jsx web/js/components/preact/fleet/OrganizationManager.jsx --format json --output-file build/eng-artifacts/T7.191/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.191/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-autofocus'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.191`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.192: jsx-a11y/no-autofocus in InvestigationBookmarks.jsx, TotpSetupModal.jsx +- **depends_on**: [T7, T10, T7.182, T7.187] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/investigation/InvestigationBookmarks.jsx`, `web/js/components/preact/users/TotpSetupModal.jsx`, `web/tests/remediation/t7_192.spec.jsx`, `quality/evidence/T7.192.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-24d767472f9eac0b, ESLINT-BUCKET-6040ad491a730d6d +- **acceptance_criteria**: + - Assert initial render does not steal focus; explicit dialog-open focus management must return focus to the invoker on close. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_192` + - `mkdir -p build/eng-artifacts/T7.192` + - `web/node_modules/.bin/eslint web/js/components/preact/investigation/InvestigationBookmarks.jsx web/js/components/preact/users/TotpSetupModal.jsx --format json --output-file build/eng-artifacts/T7.192/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.192/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-autofocus'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.192`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.193: jsx-a11y/no-noninteractive-element-interactions in FisheyeEptzCanvas.jsx, StreamCard.jsx, ZoneEditor.jsx, LanguageSelector.jsx, InvestigationView.jsx, LiveBuildingPlan.jsx +- **depends_on**: [T7, T10, T7.189, T7.180, T7.162, T7.188, T7.183] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/FisheyeEptzCanvas.jsx`, `web/js/components/preact/StreamCard.jsx`, `web/js/components/preact/ZoneEditor.jsx`, `web/js/components/preact/common/LanguageSelector.jsx`, `web/js/components/preact/investigation/InvestigationView.jsx`, `web/js/components/preact/live/LiveBuildingPlan.jsx`, `web/tests/remediation/t7_193.spec.jsx`, `quality/evidence/T7.193.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-d8c2127f8046b560, ESLINT-BUCKET-e4342be069acaf24, ESLINT-BUCKET-141e103765b7c505, ESLINT-BUCKET-370c727cb2690828, ESLINT-BUCKET-bf7012d93c48094c, ESLINT-BUCKET-11c6ba5b7bf02e40 +- **acceptance_criteria**: + - Remove unintended interactive behavior from structural elements or expose correct interactive semantics; preserve nested-control propagation and keyboard behavior. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_193` + - `mkdir -p build/eng-artifacts/T7.193` + - `web/node_modules/.bin/eslint web/js/components/preact/FisheyeEptzCanvas.jsx web/js/components/preact/StreamCard.jsx web/js/components/preact/ZoneEditor.jsx web/js/components/preact/common/LanguageSelector.jsx web/js/components/preact/investigation/InvestigationView.jsx web/js/components/preact/live/LiveBuildingPlan.jsx --format json --output-file build/eng-artifacts/T7.193/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.193/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-noninteractive-element-interactions'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.193`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.194: jsx-a11y/no-noninteractive-element-interactions in LiveOperatorNavigator.jsx, RecordingsGrid.jsx, TimelineCursor.jsx, TimelineSegments.jsx, AccessPolicyModal.jsx, AddUserModal.jsx +- **depends_on**: [T7, T10, T7.183, T7.186] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/live/LiveOperatorNavigator.jsx`, `web/js/components/preact/recordings/RecordingsGrid.jsx`, `web/js/components/preact/timeline/TimelineCursor.jsx`, `web/js/components/preact/timeline/TimelineSegments.jsx`, `web/js/components/preact/users/AccessPolicyModal.jsx`, `web/js/components/preact/users/AddUserModal.jsx`, `web/tests/remediation/t7_194.spec.jsx`, `quality/evidence/T7.194.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-87cfe9ce5d499faf, ESLINT-BUCKET-4d679d89b4da6865, ESLINT-BUCKET-d670cad0625d4f2c, ESLINT-BUCKET-03caeab009bdc4fd, ESLINT-BUCKET-939df4abd7adefdd, ESLINT-BUCKET-4cf2eab3dda13b90 +- **acceptance_criteria**: + - Remove unintended interactive behavior from structural elements or expose correct interactive semantics; preserve nested-control propagation and keyboard behavior. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_194` + - `mkdir -p build/eng-artifacts/T7.194` + - `web/node_modules/.bin/eslint web/js/components/preact/live/LiveOperatorNavigator.jsx web/js/components/preact/recordings/RecordingsGrid.jsx web/js/components/preact/timeline/TimelineCursor.jsx web/js/components/preact/timeline/TimelineSegments.jsx web/js/components/preact/users/AccessPolicyModal.jsx web/js/components/preact/users/AddUserModal.jsx --format json --output-file build/eng-artifacts/T7.194/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.194/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-noninteractive-element-interactions'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.194`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.195: jsx-a11y/no-noninteractive-element-interactions in ApiKeyModal.jsx, AuditHistoryModal.jsx, EditUserModal.jsx, RoleManagerModal.jsx +- **depends_on**: [T7, T10, T7.186, T7.187] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/users/ApiKeyModal.jsx`, `web/js/components/preact/users/AuditHistoryModal.jsx`, `web/js/components/preact/users/EditUserModal.jsx`, `web/js/components/preact/users/RoleManagerModal.jsx`, `web/tests/remediation/t7_195.spec.jsx`, `quality/evidence/T7.195.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-68103860cfe78d89, ESLINT-BUCKET-be996c224380b85e, ESLINT-BUCKET-65f403c439392041, ESLINT-BUCKET-752682010e0c301c +- **acceptance_criteria**: + - Remove unintended interactive behavior from structural elements or expose correct interactive semantics; preserve nested-control propagation and keyboard behavior. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_195` + - `mkdir -p build/eng-artifacts/T7.195` + - `web/node_modules/.bin/eslint web/js/components/preact/users/ApiKeyModal.jsx web/js/components/preact/users/AuditHistoryModal.jsx web/js/components/preact/users/EditUserModal.jsx web/js/components/preact/users/RoleManagerModal.jsx --format json --output-file build/eng-artifacts/T7.195/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.195/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-noninteractive-element-interactions'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.195`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.196: jsx-a11y/no-noninteractive-tabindex in FisheyeEptzCanvas.jsx, LanguageSelector.jsx +- **depends_on**: [T7, T10, T7.193] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/FisheyeEptzCanvas.jsx`, `web/js/components/preact/common/LanguageSelector.jsx`, `web/tests/remediation/t7_196.spec.jsx`, `quality/evidence/T7.196.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-f32c4fd5a51337d3, ESLINT-BUCKET-d5958c65428cdc31 +- **acceptance_criteria**: + - Assert the tab order includes only intended interactive controls; keyboard navigation of composite widgets must follow their documented role. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_196` + - `mkdir -p build/eng-artifacts/T7.196` + - `web/node_modules/.bin/eslint web/js/components/preact/FisheyeEptzCanvas.jsx web/js/components/preact/common/LanguageSelector.jsx --format json --output-file build/eng-artifacts/T7.196/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.196/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-noninteractive-tabindex'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.196`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.197: jsx-a11y/no-static-element-interactions in GridPicker.jsx, HLSVideoCell.jsx, HealthView.jsx, LiveView.jsx, MSEVideoCell.jsx, StreamCard.jsx +- **depends_on**: [T7, T10, T7.161, T7.189, T7.179, T7.188, T7.193] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/GridPicker.jsx`, `web/js/components/preact/HLSVideoCell.jsx`, `web/js/components/preact/HealthView.jsx`, `web/js/components/preact/LiveView.jsx`, `web/js/components/preact/MSEVideoCell.jsx`, `web/js/components/preact/StreamCard.jsx`, `web/tests/remediation/t7_197.spec.jsx`, `quality/evidence/T7.197.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-45ebdb33421d89d5, ESLINT-BUCKET-d6af678aacfbb026, ESLINT-BUCKET-e48ab90f6d76f69a, ESLINT-BUCKET-6cf65d94c0e817c8, ESLINT-BUCKET-d0493f3174391c77, ESLINT-BUCKET-134e1087e8cda477 +- **acceptance_criteria**: + - Make reported actions native interactive controls or provide correct role, focus and keyboard activation; pointer and keyboard must execute the same action once. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_197` + - `mkdir -p build/eng-artifacts/T7.197` + - `web/node_modules/.bin/eslint web/js/components/preact/GridPicker.jsx web/js/components/preact/HLSVideoCell.jsx web/js/components/preact/HealthView.jsx web/js/components/preact/LiveView.jsx web/js/components/preact/MSEVideoCell.jsx web/js/components/preact/StreamCard.jsx --format json --output-file build/eng-artifacts/T7.197/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.197/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-static-element-interactions'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.197`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.198: jsx-a11y/no-static-element-interactions in StreamConfigModal.jsx, StreamsView.jsx, ToastContainer.jsx, UI.jsx, WebRTCVideoCell.jsx, ZoneEditor.jsx +- **depends_on**: [T7, T10, T7.180, T7.189, T7.162, T7.188, T7.190, T7.193] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/StreamConfigModal.jsx`, `web/js/components/preact/StreamsView.jsx`, `web/js/components/preact/ToastContainer.jsx`, `web/js/components/preact/UI.jsx`, `web/js/components/preact/WebRTCVideoCell.jsx`, `web/js/components/preact/ZoneEditor.jsx`, `web/tests/remediation/t7_198.spec.jsx`, `quality/evidence/T7.198.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-8a059d804561f236, ESLINT-BUCKET-21e6c2fa9c26c964, ESLINT-BUCKET-b18881a630321191, ESLINT-BUCKET-d9d81163d1e1193d, ESLINT-BUCKET-3322f39793a9258c, ESLINT-BUCKET-6bdf7c909180cb5e +- **acceptance_criteria**: + - Make reported actions native interactive controls or provide correct role, focus and keyboard activation; pointer and keyboard must execute the same action once. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_198` + - `mkdir -p build/eng-artifacts/T7.198` + - `web/node_modules/.bin/eslint web/js/components/preact/StreamConfigModal.jsx web/js/components/preact/StreamsView.jsx web/js/components/preact/ToastContainer.jsx web/js/components/preact/UI.jsx web/js/components/preact/WebRTCVideoCell.jsx web/js/components/preact/ZoneEditor.jsx --format json --output-file build/eng-artifacts/T7.198/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.198/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-static-element-interactions'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.198`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.199: jsx-a11y/no-static-element-interactions in ModalDialog.jsx, BulkOrganizeModal.jsx, CollectionManager.jsx, OrganizationManager.jsx, LiveBuildingPlan.jsx, LiveOperatorNavigator.jsx +- **depends_on**: [T7, T10, T7.180, T7.181, T7.191, T7.193, T7.194] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/common/ModalDialog.jsx`, `web/js/components/preact/fleet/BulkOrganizeModal.jsx`, `web/js/components/preact/fleet/CollectionManager.jsx`, `web/js/components/preact/fleet/OrganizationManager.jsx`, `web/js/components/preact/live/LiveBuildingPlan.jsx`, `web/js/components/preact/live/LiveOperatorNavigator.jsx`, `web/tests/remediation/t7_199.spec.jsx`, `quality/evidence/T7.199.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-243fa74ece4acc83, ESLINT-BUCKET-aa87081e964848f0, ESLINT-BUCKET-b9126919c0a748d2, ESLINT-BUCKET-ac70bbab0047fa80, ESLINT-BUCKET-23073b0c71d7d2e3, ESLINT-BUCKET-be705595f12d1850 +- **acceptance_criteria**: + - Make reported actions native interactive controls or provide correct role, focus and keyboard activation; pointer and keyboard must execute the same action once. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_199` + - `mkdir -p build/eng-artifacts/T7.199` + - `web/node_modules/.bin/eslint web/js/components/preact/common/ModalDialog.jsx web/js/components/preact/fleet/BulkOrganizeModal.jsx web/js/components/preact/fleet/CollectionManager.jsx web/js/components/preact/fleet/OrganizationManager.jsx web/js/components/preact/live/LiveBuildingPlan.jsx web/js/components/preact/live/LiveOperatorNavigator.jsx --format json --output-file build/eng-artifacts/T7.199/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.199/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-static-element-interactions'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.199`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.200: jsx-a11y/no-static-element-interactions in RecordingsGrid.jsx, Go2rtcTab.jsx, ClearLogsModal.jsx, RestartModal.jsx, TimelinePlayer.jsx, AccessPolicyModal.jsx +- **depends_on**: [T7, T10, T7.194, T7.184, T7.163, T7.188] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/recordings/RecordingsGrid.jsx`, `web/js/components/preact/settings/Go2rtcTab.jsx`, `web/js/components/preact/system/ClearLogsModal.jsx`, `web/js/components/preact/system/RestartModal.jsx`, `web/js/components/preact/timeline/TimelinePlayer.jsx`, `web/js/components/preact/users/AccessPolicyModal.jsx`, `web/tests/remediation/t7_200.spec.jsx`, `quality/evidence/T7.200.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-55a74c5d3180cf15, ESLINT-BUCKET-fd743aa60d9abb1f, ESLINT-BUCKET-fbc7ca1e0083c1d1, ESLINT-BUCKET-259ca1824a1d1447, ESLINT-BUCKET-c06de8e6c5473e61, ESLINT-BUCKET-6bab06cb3c8102a9 +- **acceptance_criteria**: + - Make reported actions native interactive controls or provide correct role, focus and keyboard activation; pointer and keyboard must execute the same action once. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_200` + - `mkdir -p build/eng-artifacts/T7.200` + - `web/node_modules/.bin/eslint web/js/components/preact/recordings/RecordingsGrid.jsx web/js/components/preact/settings/Go2rtcTab.jsx web/js/components/preact/system/ClearLogsModal.jsx web/js/components/preact/system/RestartModal.jsx web/js/components/preact/timeline/TimelinePlayer.jsx web/js/components/preact/users/AccessPolicyModal.jsx --format json --output-file build/eng-artifacts/T7.200/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.200/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-static-element-interactions'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.200`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.201: jsx-a11y/no-static-element-interactions in AddUserModal.jsx, ApiKeyModal.jsx, AuditHistoryModal.jsx, DeleteUserModal.jsx, EditUserModal.jsx, RoleManagerModal.jsx +- **depends_on**: [T7, T10, T7.194, T7.195, T7.164] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/users/AddUserModal.jsx`, `web/js/components/preact/users/ApiKeyModal.jsx`, `web/js/components/preact/users/AuditHistoryModal.jsx`, `web/js/components/preact/users/DeleteUserModal.jsx`, `web/js/components/preact/users/EditUserModal.jsx`, `web/js/components/preact/users/RoleManagerModal.jsx`, `web/tests/remediation/t7_201.spec.jsx`, `quality/evidence/T7.201.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-3ace786e8c2cd1a8, ESLINT-BUCKET-08d8785eb7476330, ESLINT-BUCKET-51093f104f4e1cbb, ESLINT-BUCKET-7c82f257c4fb1103, ESLINT-BUCKET-c4dd2be3483455e5, ESLINT-BUCKET-5c8c07852ed0b107 +- **acceptance_criteria**: + - Make reported actions native interactive controls or provide correct role, focus and keyboard activation; pointer and keyboard must execute the same action once. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_201` + - `mkdir -p build/eng-artifacts/T7.201` + - `web/node_modules/.bin/eslint web/js/components/preact/users/AddUserModal.jsx web/js/components/preact/users/ApiKeyModal.jsx web/js/components/preact/users/AuditHistoryModal.jsx web/js/components/preact/users/DeleteUserModal.jsx web/js/components/preact/users/EditUserModal.jsx web/js/components/preact/users/RoleManagerModal.jsx --format json --output-file build/eng-artifacts/T7.201/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.201/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-static-element-interactions'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.201`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.202: jsx-a11y/no-static-element-interactions in TotpSetupModal.jsx +- **depends_on**: [T7, T10, T7.192] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/users/TotpSetupModal.jsx`, `web/tests/remediation/t7_202.spec.jsx`, `quality/evidence/T7.202.md`. +- **priority**: low +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: ESLINT-BUCKET-e046fbe269eed0dc +- **acceptance_criteria**: + - Make reported actions native interactive controls or provide correct role, focus and keyboard activation; pointer and keyboard must execute the same action once. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_202` + - `mkdir -p build/eng-artifacts/T7.202` + - `web/node_modules/.bin/eslint web/js/components/preact/users/TotpSetupModal.jsx --format json --output-file build/eng-artifacts/T7.202/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.202/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'jsx-a11y/no-static-element-interactions'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.202`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.203: nullPointerArithmeticRedundantCheck in sod_img_writer.h +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_203-upstream.json`, `quality/evidence/T7.203.md`. +- **priority**: low +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-38d664fd8e77f607, CPPCHECK-3d1693ad77a15fa2, CPPCHECK-3508a7db3ef7fc03, CPPCHECK-ca79e52beb5f22bb, CPPCHECK-5941fdb9ccb989f3 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_203-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.203`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.204: nullPointerRedundantCheck in sod_img_writer.h +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_204-upstream.json`, `quality/evidence/T7.204.md`. +- **priority**: low +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-10a0fa2f24fefc90, CPPCHECK-ffdd97ac6ebb6b4b, CPPCHECK-7dc87bf617f52146, CPPCHECK-347fec696ca3fcab, CPPCHECK-1980a8233237856a +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_204-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.204`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.205: wrongPrintfScanfArgNum in linux_thermal.c +- **depends_on**: [T7, T13, T7.95] +- **agent_type**: worker +- **ownership**: `src/telemetry/collectors/linux_thermal.c`, `tests/unit/test_t7_205.c`, `tests/unit/cmake/eng/t7_205.cmake`, `quality/evidence/T7.205.md`. +- **priority**: low +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-e9cd8f29e136cbb8 +- **acceptance_criteria**: + - Exercise every reported format/library call with boundary values; argument types/counts, buffer extents and returned errors must match the library contract with no UB. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.205 --regex '^test_t7_205$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.205`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.206: zerodivcond in sod_img_reader.h +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_206-upstream.json`, `quality/evidence/T7.206.md`. +- **priority**: low +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-ac6f81ae03a685f3 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_206-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.206`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.207: arrayIndexThenCheck in sod_img_writer.h +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_207-upstream.json`, `quality/evidence/T7.207.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-8bb35cef096bd68d +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_207-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.207`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.208: constParameter in linux_network.c +- **depends_on**: [T7, T13, T7.95] +- **agent_type**: worker +- **ownership**: `src/telemetry/collectors/linux_network.c`, `tests/unit/test_t7_208.c`, `tests/unit/cmake/eng/t7_208.cmake`, `quality/evidence/T7.208.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-7e66ded89b37cb4f +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.208 --regex '^test_t7_208$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.208`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.209: constParameter in api_handlers_investigations.c +- **depends_on**: [T7, T13, T7.148] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_investigations.c`, `tests/unit/test_t7_209.c`, `tests/unit/cmake/eng/t7_209.cmake`, `quality/evidence/T7.209.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-c6d1df4e6770f40e +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.209 --regex '^test_t7_209$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.209`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.210: constParameterCallback in sod_img_reader.h, sod_img_writer.h +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_210-upstream.json`, `quality/evidence/T7.210.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-fb37582a72f59582, CPPCHECK-BUCKET-c7b3ef530f996e26 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_210-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.210`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.211: constParameterCallback in storage_migration.c +- **depends_on**: [T7, T13, T7.138] +- **agent_type**: worker +- **ownership**: `src/storage/storage_migration.c`, `tests/unit/test_t7_211.c`, `tests/unit/cmake/eng/t7_211.cmake`, `quality/evidence/T7.211.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-90ec02278e01bcac +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.211 --regex '^test_t7_211$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.211`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.212: constParameterCallback in yaml_redact.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/utils/yaml_redact.c`, `tests/unit/test_t7_212.c`, `tests/unit/cmake/eng/t7_212.cmake`, `quality/evidence/T7.212.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-6291a48798ed350c +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.212 --regex '^test_t7_212$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.212`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.213: constParameterCallback in api_detection.c +- **depends_on**: [T7, T13, T7.112] +- **agent_type**: worker +- **ownership**: `src/video/api_detection.c`, `tests/unit/test_t7_213.c`, `tests/unit/cmake/eng/t7_213.cmake`, `quality/evidence/T7.213.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-681aedac30d87a1e +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.213 --regex '^test_t7_213$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.213`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.214: constParameterCallback in go2rtc_api.c, go2rtc_integration.c, go2rtc_snapshot.c +- **depends_on**: [T7, T13, T7.98, T7.154] +- **agent_type**: worker +- **ownership**: `src/video/go2rtc/go2rtc_api.c`, `src/video/go2rtc/go2rtc_integration.c`, `src/video/go2rtc/go2rtc_snapshot.c`, `tests/unit/test_t7_214.c`, `tests/unit/cmake/eng/t7_214.cmake`, `quality/evidence/T7.214.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-ee781b371da39bf5, CPPCHECK-BUCKET-dc056676c7084f53, CPPCHECK-BUCKET-0130dae8fb623afa +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.214 --regex '^test_t7_214$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.214`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.215: constParameterCallback in onvif_detection.c +- **depends_on**: [T7, T13, T7.146] +- **agent_type**: worker +- **ownership**: `src/video/onvif_detection.c`, `tests/unit/test_t7_215.c`, `tests/unit/cmake/eng/t7_215.cmake`, `quality/evidence/T7.215.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-365ebbda46eacf74 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.215 --regex '^test_t7_215$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.215`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.216: constParameterCallback in onvif_device_management.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/onvif_device_management.c`, `tests/unit/test_t7_216.c`, `tests/unit/cmake/eng/t7_216.cmake`, `quality/evidence/T7.216.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-8737ababcc06f484 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.216 --regex '^test_t7_216$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.216`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.217: constParameterCallback in onvif_imaging.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/onvif_imaging.c`, `tests/unit/test_t7_217.c`, `tests/unit/cmake/eng/t7_217.cmake`, `quality/evidence/T7.217.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-baf28ba17bc25dd0 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.217 --regex '^test_t7_217$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.217`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.218: constParameterCallback in onvif_ptz.c +- **depends_on**: [T7, T13, T7.156] +- **agent_type**: worker +- **ownership**: `src/video/onvif_ptz.c`, `tests/unit/test_t7_218.c`, `tests/unit/cmake/eng/t7_218.cmake`, `quality/evidence/T7.218.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-462bf13ae3867115 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.218 --regex '^test_t7_218$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.218`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.219: constParameterCallback in api_handlers_go2rtc_proxy.c +- **depends_on**: [T7, T13, T7.147] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_go2rtc_proxy.c`, `tests/unit/test_t7_219.c`, `tests/unit/cmake/eng/t7_219.cmake`, `quality/evidence/T7.219.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-b6f82c4c9b287eba +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.219 --regex '^test_t7_219$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.219`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.220: constParameterCallback in api_handlers_health.c +- **depends_on**: [T7, T13, T7.158] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_health.c`, `tests/unit/test_t7_220.c`, `tests/unit/cmake/eng/t7_220.cmake`, `quality/evidence/T7.220.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-c7a8e9a51802c60d +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.220 --regex '^test_t7_220$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.220`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.221: constParameterCallback in go2rtc_proxy_thread.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/go2rtc_proxy_thread.c`, `tests/unit/test_t7_221.c`, `tests/unit/cmake/eng/t7_221.cmake`, `quality/evidence/T7.221.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-d3985740b2ac6585 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.221 --regex '^test_t7_221$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.221`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.222: constParameterPointer in sod_img_reader.h, sod_img_writer.h +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_222-upstream.json`, `quality/evidence/T7.222.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-82a085f0cc04468f, CPPCHECK-BUCKET-27ab7ab1e74c2e72 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_222-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.222`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.223: constParameterPointer in authorization.c +- **depends_on**: [T7, T13, T7.114] +- **agent_type**: worker +- **ownership**: `src/core/authorization.c`, `tests/unit/test_t7_223.c`, `tests/unit/cmake/eng/t7_223.cmake`, `quality/evidence/T7.223.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-d0de2e4ac47c3191 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.223 --regex '^test_t7_223$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.223`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.224: constParameterPointer in mqtt_destination_client.c +- **depends_on**: [T7, T13, T7.134] +- **agent_type**: worker +- **ownership**: `src/core/mqtt_destination_client.c`, `tests/unit/test_t7_224.c`, `tests/unit/cmake/eng/t7_224.cmake`, `quality/evidence/T7.224.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-fbb9e9402242eaba +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.224 --regex '^test_t7_224$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.224`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.225: constParameterPointer in db_camera_collections.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_camera_collections.c`, `tests/unit/test_t7_225.c`, `tests/unit/cmake/eng/t7_225.cmake`, `quality/evidence/T7.225.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-fd8d6a4b8cc77400 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.225 --regex '^test_t7_225$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.225`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.226: constParameterPointer in ezxml.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_226-upstream.json`, `quality/evidence/T7.226.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-43fcd9340a9e63ed +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_226-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.226`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.227: constParameterPointer in sod.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_227-upstream.json`, `quality/evidence/T7.227.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-e7f8f80f0cd95f0d +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_227-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.227`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.228: constParameterPointer in linux_cgroup.c +- **depends_on**: [T7, T13, T7.83] +- **agent_type**: worker +- **ownership**: `src/telemetry/collectors/linux_cgroup.c`, `tests/unit/test_t7_228.c`, `tests/unit/cmake/eng/t7_228.cmake`, `quality/evidence/T7.228.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-70e0496568faa30f +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.228 --regex '^test_t7_228$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.228`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.229: constParameterPointer in nvme_provider.c +- **depends_on**: [T7, T13, T7.76] +- **agent_type**: worker +- **ownership**: `src/telemetry/providers/nvme_provider.c`, `tests/unit/test_t7_229.c`, `tests/unit/cmake/eng/t7_229.cmake`, `quality/evidence/T7.229.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-5bdf073f41a6c65d +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.229 --regex '^test_t7_229$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.229`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.230: constParameterPointer in system_health_evaluator.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/telemetry/system_health_evaluator.c`, `tests/unit/test_t7_230.c`, `tests/unit/cmake/eng/t7_230.cmake`, `quality/evidence/T7.230.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-527aa4750d3ac84a +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.230 --regex '^test_t7_230$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.230`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.231: constParameterPointer in go2rtc_base_path.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/utils/go2rtc_base_path.c`, `tests/unit/test_t7_231.c`, `tests/unit/cmake/eng/t7_231.cmake`, `quality/evidence/T7.231.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-d9684d3aa203568c +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.231 --regex '^test_t7_231$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.231`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.232: constParameterPointer in strings.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/utils/strings.c`, `tests/unit/test_t7_232.c`, `tests/unit/cmake/eng/t7_232.cmake`, `quality/evidence/T7.232.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-e228634622467328 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.232 --regex '^test_t7_232$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.232`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.233: constParameterPointer in faac_encoder.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/faac_encoder.c`, `tests/unit/test_t7_233.c`, `tests/unit/cmake/eng/t7_233.cmake`, `quality/evidence/T7.233.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-bdb708e597b5cade +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.233 --regex '^test_t7_233$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.233`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.234: constParameterPointer in hls_unified_thread.c +- **depends_on**: [T7, T13, T7.69] +- **agent_type**: worker +- **ownership**: `src/video/hls/hls_unified_thread.c`, `tests/unit/test_t7_234.c`, `tests/unit/cmake/eng/t7_234.cmake`, `quality/evidence/T7.234.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-cbab871259b9963d +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.234 --regex '^test_t7_234$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.234`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.235: constParameterPointer in unified_detection_thread.c +- **depends_on**: [T7, T13, T7.122] +- **agent_type**: worker +- **ownership**: `src/video/unified_detection_thread.c`, `tests/unit/test_t7_235.c`, `tests/unit/cmake/eng/t7_235.cmake`, `quality/evidence/T7.235.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-8c644cc847574bfe +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.235 --regex '^test_t7_235$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.235`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.236: constParameterPointer in go2rtc_websocket.c +- **depends_on**: [T7, T13, T7.150] +- **agent_type**: worker +- **ownership**: `src/web/go2rtc_websocket.c`, `tests/unit/test_t7_236.c`, `tests/unit/cmake/eng/t7_236.cmake`, `quality/evidence/T7.236.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-4c0052bc9de6e496 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.236 --regex '^test_t7_236$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.236`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.237: constParameterPointer in recording_archive.c +- **depends_on**: [T7, T13, T7.141] +- **agent_type**: worker +- **ownership**: `src/web/recording_archive.c`, `tests/unit/test_t7_237.c`, `tests/unit/cmake/eng/t7_237.cmake`, `quality/evidence/T7.237.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-45cfee19afe8668f +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.237 --regex '^test_t7_237$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.237`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.238: constVariable in sod_img_reader.h, sod_img_writer.h +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_238-upstream.json`, `quality/evidence/T7.238.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-933d7ae37be3c395, CPPCHECK-BUCKET-b1c0c559c6e17a23 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_238-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.238`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.239: constVariable in mqtt_delivery_worker.c +- **depends_on**: [T7, T13, T7.91] +- **agent_type**: worker +- **ownership**: `src/core/mqtt_delivery_worker.c`, `tests/unit/test_t7_239.c`, `tests/unit/cmake/eng/t7_239.cmake`, `quality/evidence/T7.239.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-8596888f0dd1cc7e +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.239 --regex '^test_t7_239$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.239`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.240: constVariable in sod.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_240-upstream.json`, `quality/evidence/T7.240.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-298feb4a490d6252 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_240-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.240`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.241: constVariable in sod_ingenic_mxu.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_241-upstream.json`, `quality/evidence/T7.241.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-a8ce2c3168c021de +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_241-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.241`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.242: constVariablePointer in sod_img_reader.h, sod_img_writer.h +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_242-upstream.json`, `quality/evidence/T7.242.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-9575437f939001d5, CPPCHECK-BUCKET-df230b0a5672f192 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_242-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.242`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.243: constVariablePointer in path_utils.c +- **depends_on**: [T7, T13, T7.128] +- **agent_type**: worker +- **ownership**: `src/core/path_utils.c`, `tests/unit/test_t7_243.c`, `tests/unit/cmake/eng/t7_243.cmake`, `quality/evidence/T7.243.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-8e110c5360beb299 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.243 --regex '^test_t7_243$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.243`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.244: constVariablePointer in db_auth.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_auth.c`, `tests/unit/test_t7_244.c`, `tests/unit/cmake/eng/t7_244.cmake`, `quality/evidence/T7.244.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-6c5cf9bd3f338f84 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.244 --regex '^test_t7_244$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.244`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.245: constVariablePointer in db_authorization.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_authorization.c`, `tests/unit/test_t7_245.c`, `tests/unit/cmake/eng/t7_245.cmake`, `quality/evidence/T7.245.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-08f60b7ec76ce9d3 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.245 --regex '^test_t7_245$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.245`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.246: constVariablePointer in db_camera_tags.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_camera_tags.c`, `tests/unit/test_t7_246.c`, `tests/unit/cmake/eng/t7_246.cmake`, `quality/evidence/T7.246.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-7e7f6cc12d937123 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.246 --regex '^test_t7_246$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.246`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.247: constVariablePointer in db_core.c +- **depends_on**: [T7, T13, T7.25] +- **agent_type**: worker +- **ownership**: `src/database/db_core.c`, `tests/unit/test_t7_247.c`, `tests/unit/cmake/eng/t7_247.cmake`, `quality/evidence/T7.247.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-f21c65912e355ace +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.247 --regex '^test_t7_247$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.247`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.248: constVariablePointer in db_fleet_query.c +- **depends_on**: [T7, T13, T7.113] +- **agent_type**: worker +- **ownership**: `src/database/db_fleet_query.c`, `tests/unit/test_t7_248.c`, `tests/unit/cmake/eng/t7_248.cmake`, `quality/evidence/T7.248.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-9f651ab0c8ea6422 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.248 --regex '^test_t7_248$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.248`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.249: constVariablePointer in db_storage_lifecycle.c +- **depends_on**: [T7, T13, T7.129] +- **agent_type**: worker +- **ownership**: `src/database/db_storage_lifecycle.c`, `tests/unit/test_t7_249.c`, `tests/unit/cmake/eng/t7_249.cmake`, `quality/evidence/T7.249.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-353deb8bba479029 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.249 --regex '^test_t7_249$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.249`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.250: constVariablePointer in ezxml.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_250-upstream.json`, `quality/evidence/T7.250.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-c6ee03168003661f +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_250-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.250`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.251: constVariablePointer in sod.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_251-upstream.json`, `quality/evidence/T7.251.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-5d8aaf042fefce78 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_251-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.251`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.252: constVariablePointer in storage_deletion.c +- **depends_on**: [T7, T13, T7.137] +- **agent_type**: worker +- **ownership**: `src/storage/storage_deletion.c`, `tests/unit/test_t7_252.c`, `tests/unit/cmake/eng/t7_252.cmake`, `quality/evidence/T7.252.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-b4e128a1af325d4f +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.252 --regex '^test_t7_252$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.252`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.253: constVariablePointer in storage_source.c +- **depends_on**: [T7, T13, T7.140] +- **agent_type**: worker +- **ownership**: `src/storage/storage_source.c`, `tests/unit/test_t7_253.c`, `tests/unit/cmake/eng/t7_253.cmake`, `quality/evidence/T7.253.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-77479b4ba7ef9849 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.253 --regex '^test_t7_253$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.253`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.254: constVariablePointer in linux_network.c, linux_process.c, linux_thermal.c +- **depends_on**: [T7, T13, T7.208, T7.95, T7.205] +- **agent_type**: worker +- **ownership**: `src/telemetry/collectors/linux_network.c`, `src/telemetry/collectors/linux_process.c`, `src/telemetry/collectors/linux_thermal.c`, `tests/unit/test_t7_254.c`, `tests/unit/cmake/eng/t7_254.cmake`, `quality/evidence/T7.254.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-c9404ed2a73b0977, CPPCHECK-BUCKET-e924700b1413accd, CPPCHECK-BUCKET-2ca7413944026780 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.254 --regex '^test_t7_254$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.254`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.255: constVariablePointer in linux_device_map.c, linux_hardware.c, nvme_provider.c +- **depends_on**: [T7, T13, T7.143, T7.229] +- **agent_type**: worker +- **ownership**: `src/telemetry/providers/linux_device_map.c`, `src/telemetry/providers/linux_hardware.c`, `src/telemetry/providers/nvme_provider.c`, `tests/unit/test_t7_255.c`, `tests/unit/cmake/eng/t7_255.cmake`, `quality/evidence/T7.255.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-a1edb744b382f8f5, CPPCHECK-BUCKET-4001e3b91223c7ad, CPPCHECK-BUCKET-ae15015525d96c08 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.255 --regex '^test_t7_255$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.255`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.256: constVariablePointer in system_health.c +- **depends_on**: [T7, T13, T7.59] +- **agent_type**: worker +- **ownership**: `src/telemetry/system_health.c`, `tests/unit/test_t7_256.c`, `tests/unit/cmake/eng/t7_256.cmake`, `quality/evidence/T7.256.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-f3bb2108694b562f +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.256 --regex '^test_t7_256$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.256`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.257: constVariablePointer in system_health_evaluator.c +- **depends_on**: [T7, T13, T7.230] +- **agent_type**: worker +- **ownership**: `src/telemetry/system_health_evaluator.c`, `tests/unit/test_t7_257.c`, `tests/unit/cmake/eng/t7_257.cmake`, `quality/evidence/T7.257.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-57093ce27e4aabc5 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.257 --regex '^test_t7_257$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.257`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.258: constVariablePointer in go2rtc_base_path.c +- **depends_on**: [T7, T13, T7.231] +- **agent_type**: worker +- **ownership**: `src/utils/go2rtc_base_path.c`, `tests/unit/test_t7_258.c`, `tests/unit/cmake/eng/t7_258.cmake`, `quality/evidence/T7.258.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-4dc0544d99c6a120 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.258 --regex '^test_t7_258$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.258`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.259: constVariablePointer in detection_model.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/detection_model.c`, `tests/unit/test_t7_259.c`, `tests/unit/cmake/eng/t7_259.cmake`, `quality/evidence/T7.259.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-aa0082260172b3b9 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.259 --regex '^test_t7_259$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.259`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.260: constVariablePointer in go2rtc_integration.c, go2rtc_process.c +- **depends_on**: [T7, T13, T7.214, T7.145] +- **agent_type**: worker +- **ownership**: `src/video/go2rtc/go2rtc_integration.c`, `src/video/go2rtc/go2rtc_process.c`, `tests/unit/test_t7_260.c`, `tests/unit/cmake/eng/t7_260.cmake`, `quality/evidence/T7.260.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-5f736ad7b9095aea, CPPCHECK-BUCKET-eabea03354c7b4b7 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.260 --regex '^test_t7_260$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.260`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.261: constVariablePointer in mp4_recording_core.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/mp4_recording_core.c`, `tests/unit/test_t7_261.c`, `tests/unit/cmake/eng/t7_261.cmake`, `quality/evidence/T7.261.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-e9a38e72fa2e4a7c +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.261 --regex '^test_t7_261$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.261`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.262: constVariablePointer in mp4_recording_writer.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/mp4_recording_writer.c`, `tests/unit/test_t7_262.c`, `tests/unit/cmake/eng/t7_262.cmake`, `quality/evidence/T7.262.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-3ec7089cfaa16e94 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.262 --regex '^test_t7_262$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.262`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.263: constVariablePointer in stream_state_adapter.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/stream_state_adapter.c`, `tests/unit/test_t7_263.c`, `tests/unit/cmake/eng/t7_263.cmake`, `quality/evidence/T7.263.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-4ffd5c5d72b2c6a0 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.263 --regex '^test_t7_263$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.263`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.264: constVariablePointer in api_handlers_go2rtc_proxy.c +- **depends_on**: [T7, T13, T7.219] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_go2rtc_proxy.c`, `tests/unit/test_t7_264.c`, `tests/unit/cmake/eng/t7_264.cmake`, `quality/evidence/T7.264.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-f4469b09cc19dae9 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.264 --regex '^test_t7_264$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.264`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.265: constVariablePointer in api_handlers_recordings_list.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_recordings_list.c`, `tests/unit/test_t7_265.c`, `tests/unit/cmake/eng/t7_265.cmake`, `quality/evidence/T7.265.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-611000c5c122ad1e +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.265 --regex '^test_t7_265$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.265`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.266: constVariablePointer in api_handlers_recordings_thumbnail.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_recordings_thumbnail.c`, `tests/unit/test_t7_266.c`, `tests/unit/cmake/eng/t7_266.cmake`, `quality/evidence/T7.266.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-d41611e4fb1c1abd +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.266 --regex '^test_t7_266$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.266`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.267: constVariablePointer in api_handlers_system_logs.c +- **depends_on**: [T7, T13, T7.149] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_system_logs.c`, `tests/unit/test_t7_267.c`, `tests/unit/cmake/eng/t7_267.cmake`, `quality/evidence/T7.267.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-b14c25475c91b307 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.267 --regex '^test_t7_267$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.267`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.268: constVariablePointer in api_handlers_timeline.c +- **depends_on**: [T7, T13, T7.107] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_timeline.c`, `tests/unit/test_t7_268.c`, `tests/unit/cmake/eng/t7_268.cmake`, `quality/evidence/T7.268.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-03f92e362a140589 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.268 --regex '^test_t7_268$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.268`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.269: constVariablePointer in api_handlers_users_backend_agnostic.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_users_backend_agnostic.c`, `tests/unit/test_t7_269.c`, `tests/unit/cmake/eng/t7_269.cmake`, `quality/evidence/T7.269.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-d45c6fa42b05db96 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.269 --regex '^test_t7_269$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.269`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.270: constVariablePointer in httpd_utils.c +- **depends_on**: [T7, T13, T7.133] +- **agent_type**: worker +- **ownership**: `src/web/httpd_utils.c`, `tests/unit/test_t7_270.c`, `tests/unit/cmake/eng/t7_270.cmake`, `quality/evidence/T7.270.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-9551a431943d8273 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.270 --regex '^test_t7_270$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.270`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.271: duplicateAssignExpression in sod.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_271-upstream.json`, `quality/evidence/T7.271.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-86335be98f6f2e90 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_271-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.271`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.272: duplicateCondition in motion_detection.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/motion_detection.c`, `tests/unit/test_t7_272.c`, `tests/unit/cmake/eng/t7_272.cmake`, `quality/evidence/T7.272.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-f814692d9029a8a1 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.272 --regex '^test_t7_272$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.272`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.273: js/unused-local-variable in LanguageSelector.jsx +- **depends_on**: [T7, T10, T7.196] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/common/LanguageSelector.jsx`, `web/tests/remediation/t7_273.spec.jsx`, `quality/evidence/T7.273.md`. +- **priority**: info +- **description**: Reproduce the listed diagnostics and fix this accessibility/quality cause only in the assigned component cluster. Preserve localization, event callbacks, DOM contracts and extension-sensitive test behavior. Narrow an untestable lint-only case with documented static evidence; behavioral accessibility changes require interaction tests. +- **findings**: CODEQUALITY-941 +- **acceptance_criteria**: + - Remove only the proven unused binding; assert language selection/persistence and localized rendering still work. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `npm --prefix web test -- --runInBand --testPathPatterns=t7_273` + - `mkdir -p build/eng-artifacts/T7.273` + - `web/node_modules/.bin/eslint web/js/components/preact/common/LanguageSelector.jsx --format json --output-file build/eng-artifacts/T7.273/eslint.json` + - `python3 -c 'import json; data=json.load(open('"'"'build/eng-artifacts/T7.273/eslint.json'"'"')); assert not [m for f in data for m in f["messages"] if m.get("ruleId")=='"'"'js/unused-local-variable'"'"'], "targeted diagnostic remains"'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.273`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.274: knownConditionTrueFalse in sod_img_reader.h +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_274-upstream.json`, `quality/evidence/T7.274.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-1f586f8741e770e9 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_274-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.274`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.275: knownConditionTrueFalse in event_router.c +- **depends_on**: [T7, T13, T7.90] +- **agent_type**: worker +- **ownership**: `src/core/event_router.c`, `tests/unit/test_t7_275.c`, `tests/unit/cmake/eng/t7_275.cmake`, `quality/evidence/T7.275.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-95058fe138843b1f +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.275 --regex '^test_t7_275$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.275`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.276: knownConditionTrueFalse in mqtt_event_adapter.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/core/mqtt_event_adapter.c`, `tests/unit/test_t7_276.c`, `tests/unit/cmake/eng/t7_276.cmake`, `quality/evidence/T7.276.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-9c71189558451cd4 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.276 --regex '^test_t7_276$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.276`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.277: knownConditionTrueFalse in db_storage_targets.c +- **depends_on**: [T7, T13, T7.136] +- **agent_type**: worker +- **ownership**: `src/database/db_storage_targets.c`, `tests/unit/test_t7_277.c`, `tests/unit/cmake/eng/t7_277.cmake`, `quality/evidence/T7.277.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-2f8dc61aeb7cdda6 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.277 --regex '^test_t7_277$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.277`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.278: knownConditionTrueFalse in ezxml.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_278-upstream.json`, `quality/evidence/T7.278.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-c7e9176ca688d280 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_278-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.278`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.279: knownConditionTrueFalse in sod.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_279-upstream.json`, `quality/evidence/T7.279.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-064299ecf7d09b55 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_279-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.279`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.280: knownConditionTrueFalse in linux_process.c +- **depends_on**: [T7, T13, T7.254] +- **agent_type**: worker +- **ownership**: `src/telemetry/collectors/linux_process.c`, `tests/unit/test_t7_280.c`, `tests/unit/cmake/eng/t7_280.cmake`, `quality/evidence/T7.280.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-28b7ea4b18c686f4 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.280 --regex '^test_t7_280$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.280`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.281: knownConditionTrueFalse in health_helper_runner.c +- **depends_on**: [T7, T13, T7.68] +- **agent_type**: worker +- **ownership**: `src/telemetry/health_helper_runner.c`, `tests/unit/test_t7_281.c`, `tests/unit/cmake/eng/t7_281.cmake`, `quality/evidence/T7.281.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-1ac7ae81e97d3df2 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.281 --regex '^test_t7_281$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.281`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.282: knownConditionTrueFalse in api_handlers_imaging.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_imaging.c`, `tests/unit/test_t7_282.c`, `tests/unit/cmake/eng/t7_282.cmake`, `quality/evidence/T7.282.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-0251d17e5b89df2a +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.282 --regex '^test_t7_282$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.282`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.283: redundantCondition in sod_img_reader.h +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_283-upstream.json`, `quality/evidence/T7.283.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-eee46ed30daef891 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_283-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.283`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.284: redundantInitialization in sod_img_reader.h +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_284-upstream.json`, `quality/evidence/T7.284.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-dcdbd8e6357d7e12 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_284-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.284`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.285: redundantInitialization in db_authorization.c +- **depends_on**: [T7, T13, T7.245] +- **agent_type**: worker +- **ownership**: `src/database/db_authorization.c`, `tests/unit/test_t7_285.c`, `tests/unit/cmake/eng/t7_285.cmake`, `quality/evidence/T7.285.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-bbeef7abfa51d073 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.285 --regex '^test_t7_285$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.285`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.286: redundantInitialization in recording_path.c +- **depends_on**: [T7, T13, T7.157] +- **agent_type**: worker +- **ownership**: `src/video/recording_path.c`, `tests/unit/test_t7_286.c`, `tests/unit/cmake/eng/t7_286.cmake`, `quality/evidence/T7.286.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-0be349a4e3fc0518 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.286 --regex '^test_t7_286$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.286`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.287: redundantPointerOp in sod.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_287-upstream.json`, `quality/evidence/T7.287.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-8f929a70e127f155 +- **acceptance_criteria**: + - Reproduce each reported null/empty/one-past-boundary or incompatible-pointer path under ASan/UBSan; assert no invalid dereference/read/write and correct valid-path result, terminator and ownership cleanup. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_287-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.287`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.288: shadowFunction in db_storage_targets.c +- **depends_on**: [T7, T13, T7.277] +- **agent_type**: worker +- **ownership**: `src/database/db_storage_targets.c`, `tests/unit/test_t7_288.c`, `tests/unit/cmake/eng/t7_288.cmake`, `quality/evidence/T7.288.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-147fba26f7ae351b +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.288 --regex '^test_t7_288$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.288`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.289: shadowFunction in stream_manager.c +- **depends_on**: [T7, T13, T7.62] +- **agent_type**: worker +- **ownership**: `src/video/stream_manager.c`, `tests/unit/test_t7_289.c`, `tests/unit/cmake/eng/t7_289.cmake`, `quality/evidence/T7.289.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-05b22ae697eaa4ca +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.289 --regex '^test_t7_289$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.289`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.290: shadowVariable in config.h +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `include/core/config.h`, `tests/unit/test_t7_290.c`, `tests/unit/cmake/eng/t7_290.cmake`, `quality/evidence/T7.290.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-9d2c058ee958f85a +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.290 --regex '^test_t7_290$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.290`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.291: unpreciseMathCall in sod.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_291-upstream.json`, `quality/evidence/T7.291.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-426773bc9bc5a5d5 +- **acceptance_criteria**: + - Exercise signed/unsigned boundaries, negative/zero values, maximum accepted values and multiplication overflow before conversion; assert valid results are unchanged and invalid values cannot wrap, divide by zero or allocate oversized memory. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_291-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.291`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.292: unreadVariable in sod_img_reader.h +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_292-upstream.json`, `quality/evidence/T7.292.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-eda9b7001501e847 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_292-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.292`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.293: unreadVariable in mqtt_client.c +- **depends_on**: [T7, T13, T7.29] +- **agent_type**: worker +- **ownership**: `src/core/mqtt_client.c`, `tests/unit/test_t7_293.c`, `tests/unit/cmake/eng/t7_293.cmake`, `quality/evidence/T7.293.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-779ca0994d939da1 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.293 --regex '^test_t7_293$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.293`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.294: unreadVariable in sod.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_294-upstream.json`, `quality/evidence/T7.294.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-93112ea9a6a3c10d +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_294-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.294`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.295: unreadVariable in onvif_ptz.c +- **depends_on**: [T7, T13, T7.218] +- **agent_type**: worker +- **ownership**: `src/video/onvif_ptz.c`, `tests/unit/test_t7_295.c`, `tests/unit/cmake/eng/t7_295.cmake`, `quality/evidence/T7.295.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-b1b17a4b9a2646a0 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.295 --regex '^test_t7_295$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.295`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.296: unsignedLessThanZero in sod.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_296-upstream.json`, `quality/evidence/T7.296.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-a4ae78869ec196b6 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_296-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.296`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.297: unusedStructMember in mqtt_destination_client.c +- **depends_on**: [T7, T13, T7.224] +- **agent_type**: worker +- **ownership**: `src/core/mqtt_destination_client.c`, `tests/unit/test_t7_297.c`, `tests/unit/cmake/eng/t7_297.cmake`, `quality/evidence/T7.297.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-efd7988ca87c95ed +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.297 --regex '^test_t7_297$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.297`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.298: unusedStructMember in sod.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_298-upstream.json`, `quality/evidence/T7.298.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-49117790281d294c +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_298-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.298`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.299: unusedStructMember in sod_detection.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/sod_detection.c`, `tests/unit/test_t7_299.c`, `tests/unit/cmake/eng/t7_299.cmake`, `quality/evidence/T7.299.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-a12a87ba590d2536 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.299 --regex '^test_t7_299$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.299`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.300: uselessAssignmentArg in sod.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_300-upstream.json`, `quality/evidence/T7.300.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-56c122b53a2e50cb +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_300-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.300`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.301: variableScope in sod_img_reader.h, sod_img_writer.h +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_301-upstream.json`, `quality/evidence/T7.301.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-ae4dbf08b9cfd1fe, CPPCHECK-BUCKET-b9ff6009cfa26f69 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_301-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.301`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.302: variableScope in db_detection_engines.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_detection_engines.c`, `tests/unit/test_t7_302.c`, `tests/unit/cmake/eng/t7_302.cmake`, `quality/evidence/T7.302.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-b614f3b94230fe9a +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.302 --regex '^test_t7_302$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.302`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.303: variableScope in db_lpr_reads.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_lpr_reads.c`, `tests/unit/test_t7_303.c`, `tests/unit/cmake/eng/t7_303.cmake`, `quality/evidence/T7.303.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-664e70c550c3ef36 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.303 --regex '^test_t7_303$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.303`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.304: variableScope in db_recordings.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/database/db_recordings.c`, `tests/unit/test_t7_304.c`, `tests/unit/cmake/eng/t7_304.cmake`, `quality/evidence/T7.304.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-2afdb0b1f1146eeb +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.304 --regex '^test_t7_304$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.304`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.305: variableScope in ezxml.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_305-upstream.json`, `quality/evidence/T7.305.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-96d5b13210206feb +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_305-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.305`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.306: variableScope in sod.c +- **depends_on**: [T7, T13] +- **agent_type**: local +- **ownership**: `quality/reviews/t7_306-upstream.json`, `quality/evidence/T7.306.md`. +- **priority**: info +- **description**: Review pinned upstream source and reproduce the listed diagnostics in the actual linked feature profile. Record precise upstream fix/version or evidence-backed false-positive analysis. Do not edit system headers or vendored/submodule source as an untracked patch. If an update/local patch is needed, append an exact bounded integration child, dependency and regression command to T33 before closing this task. Missing upstream or feature evidence blocks completion. +- **findings**: CPPCHECK-BUCKET-50bc6e286ac69abd +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 -m json.tool quality/reviews/t7_306-upstream.json` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.306`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.307: variableScope in storage_deletion.c +- **depends_on**: [T7, T13, T7.252] +- **agent_type**: worker +- **ownership**: `src/storage/storage_deletion.c`, `tests/unit/test_t7_307.c`, `tests/unit/cmake/eng/t7_307.cmake`, `quality/evidence/T7.307.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-89a47a59067748c1 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.307 --regex '^test_t7_307$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.307`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.308: variableScope in storage_migration.c +- **depends_on**: [T7, T13, T7.211] +- **agent_type**: worker +- **ownership**: `src/storage/storage_migration.c`, `tests/unit/test_t7_308.c`, `tests/unit/cmake/eng/t7_308.cmake`, `quality/evidence/T7.308.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-da5006735d5c5165 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.308 --regex '^test_t7_308$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.308`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.309: variableScope in storage_placement.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/storage/storage_placement.c`, `tests/unit/test_t7_309.c`, `tests/unit/cmake/eng/t7_309.cmake`, `quality/evidence/T7.309.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-51dd1a644803f48d +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.309 --regex '^test_t7_309$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.309`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.310: variableScope in storage_s3.c +- **depends_on**: [T7, T13, T7.142] +- **agent_type**: worker +- **ownership**: `src/storage/storage_s3.c`, `tests/unit/test_t7_310.c`, `tests/unit/cmake/eng/t7_310.cmake`, `quality/evidence/T7.310.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-a3e8d56a93d61112 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.310 --regex '^test_t7_310$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.310`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.311: variableScope in linux_cgroup.c, linux_thermal.c +- **depends_on**: [T7, T13, T7.228, T7.254] +- **agent_type**: worker +- **ownership**: `src/telemetry/collectors/linux_cgroup.c`, `src/telemetry/collectors/linux_thermal.c`, `tests/unit/test_t7_311.c`, `tests/unit/cmake/eng/t7_311.cmake`, `quality/evidence/T7.311.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-771b3fde1937be8a, CPPCHECK-BUCKET-e4dae70b5d1bd770 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.311 --regex '^test_t7_311$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.311`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.312: variableScope in stream_metrics.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/telemetry/stream_metrics.c`, `tests/unit/test_t7_312.c`, `tests/unit/cmake/eng/t7_312.cmake`, `quality/evidence/T7.312.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-9cc73ce911540ad4 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.312 --regex '^test_t7_312$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.312`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.313: variableScope in api_detection.c +- **depends_on**: [T7, T13, T7.213] +- **agent_type**: worker +- **ownership**: `src/video/api_detection.c`, `tests/unit/test_t7_313.c`, `tests/unit/cmake/eng/t7_313.cmake`, `quality/evidence/T7.313.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-905555e786df0459 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.313 --regex '^test_t7_313$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.313`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.314: variableScope in hls_directory.c +- **depends_on**: [T7, T13] +- **agent_type**: worker +- **ownership**: `src/video/hls/hls_directory.c`, `tests/unit/test_t7_314.c`, `tests/unit/cmake/eng/t7_314.cmake`, `quality/evidence/T7.314.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-5d0aacd6263110c5 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.314 --regex '^test_t7_314$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.314`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.315: variableScope in recording_transcode.c +- **depends_on**: [T7, T13, T7.66] +- **agent_type**: worker +- **ownership**: `src/video/recording_transcode.c`, `tests/unit/test_t7_315.c`, `tests/unit/cmake/eng/t7_315.cmake`, `quality/evidence/T7.315.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-ec17ee32f6d27cdb +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.315 --regex '^test_t7_315$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.315`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.316: variableScope in unified_detection_thread.c +- **depends_on**: [T7, T13, T7.235] +- **agent_type**: worker +- **ownership**: `src/video/unified_detection_thread.c`, `tests/unit/test_t7_316.c`, `tests/unit/cmake/eng/t7_316.cmake`, `quality/evidence/T7.316.md`. +- **priority**: info +- **description**: Reproduce each listed diagnostic from its raw T1 source report and trace its caller/ownership before changing code. Fix the bounded cause, write focused native regressions and register the dedicated test through the T13 eng fragment seam. These diagnostics are hypotheses until reproduced: if sites have distinct root causes, split explicit child tasks with exact ownership and add them to T33; no catch-all rewrite or blanket suppression. +- **findings**: CPPCHECK-BUCKET-d4393cc822a0c2d3 +- **acceptance_criteria**: + - Inspect the exact reported expression and caller invariants. Add a focused before/after behavioral assertion for the affected branch or document why the change is semantic-preserving and verify compiler/scanner diagnostics disappear. Never delete side effects, suppress a rule wholesale or claim a warning count reduction proves correctness. + - Each mapped finding has individual fixed-with-regression evidence or an explicitly approved, current, narrowly scoped exception; unobserved/excluded diagnostics are not fixed. + - Preserve unrelated baseline diagnostics. Final full-profile fresh reports and optional feature coverage are reconciled in T33. +- **validation**: + - `python3 scripts/quality/run-native.py --task T7.316 --regex '^test_t7_316$'` + - Reproducer locations and scanner fingerprints: `quality/remediation-map.json` task `T7.316`; inspect the raw T1 report and trace the caller. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.317: Authenticate before exposing stream existence +- **depends_on**: [T7, T11, T13, T7.64, T7.50] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_streams_get.c`, `src/web/api_handlers_streams_modify.c`, `tests/integration/specs/t7_317.api.spec.ts`, `quality/evidence/T7.317.md`. +- **priority**: medium +- **description**: Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect. +- **findings**: F-T11-01 +- **acceptance_criteria**: + - Unauthenticated known and unknown names both return the authentication failure; authenticated unauthorized users retain intentional policy response without leaking privileged data. + - Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage. +- **validation**: + - `node scripts/quality/run-integration.mjs --task T7.317 --project api --grep @t7_317` + - `npm run typecheck:tests` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.318: Correct documented Streams wire examples +- **depends_on**: [T7, T11, T7.319, T7.320, T7.321, T7.322, T7.323, T7.324, T7.325, T7.326, T7.327, T7.328, T7.329, T7.330, T7.331, T7.332, T7.333] +- **agent_type**: worker +- **ownership**: `docs/API.md`, `quality/evidence/T7.318.md`. +- **priority**: medium +- **description**: Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Update documentation only after the wire behavior is reconciled. +- **findings**: F-T11-02 +- **acceptance_criteria**: + - Examples use the real array/page envelopes, integer percentage threshold and emitted names/statuses; every example maps to the revised contract. + - Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage. +- **validation**: + - `python3 scripts/check_docs_links.py` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.319: Remove query credentials from viewer URLs +- **depends_on**: [T7, T11, T13, T7.317] +- **agent_type**: worker +- **ownership**: `src/core/url_utils.c`, `src/web/api_handlers_streams_get.c`, `tests/integration/specs/t7_319.api.spec.ts`, `quality/evidence/T7.319.md`. +- **priority**: high +- **description**: Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect. +- **findings**: F-T11-03 +- **acceptance_criteria**: + - Viewer responses contain neither userinfo nor sensitive query credentials, including encoded/mixed-case keys; configurers retain required edit data and benign query options remain usable. + - Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage. +- **validation**: + - `node scripts/quality/run-integration.mjs --task T7.319 --project api --grep @t7_319` + - `npm run typecheck:tests` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.320: Reject non-object stream updates +- **depends_on**: [T7, T11, T13, T7.317] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_streams_modify.c`, `tests/integration/specs/t7_320.api.spec.ts`, `quality/evidence/T7.320.md`. +- **priority**: medium +- **description**: Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect. +- **findings**: F-T11-04 +- **acceptance_criteria**: + - null, arrays and primitives return 400 with no mutation, ONVIF request or reload; an empty object has explicit unchanged semantics. + - Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage. +- **validation**: + - `node scripts/quality/run-integration.mjs --task T7.320 --project api --grep @t7_320` + - `npm run typecheck:tests` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.321: Reject wrong-typed stream fields +- **depends_on**: [T7, T11, T13, T7.320] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_streams_modify.c`, `tests/integration/specs/t7_321.api.spec.ts`, `quality/evidence/T7.321.md`. +- **priority**: medium +- **description**: Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect. +- **findings**: F-T11-05 +- **acceptance_criteria**: + - Wrong types return 400 with state unchanged; supported nullable clears retain their documented semantics and validation precedes all side effects. + - Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage. +- **validation**: + - `node scripts/quality/run-integration.mjs --task T7.321 --project api --grep @t7_321` + - `npm run typecheck:tests` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.322: Validate bounded stream numeric fields +- **depends_on**: [T7, T11, T13, T7.321] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_streams_modify.c`, `tests/integration/specs/t7_322.api.spec.ts`, `quality/evidence/T7.322.md`. +- **priority**: medium +- **description**: Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect. +- **findings**: F-T11-06 +- **acceptance_criteria**: + - Protocol enum, priorities, interval, buffer, storage, PTZ and port limits reject out-of-range and fractional values before mutation; boundaries agree with storage and runtime callers. + - Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage. +- **validation**: + - `node scripts/quality/run-integration.mjs --task T7.322 --project api --grep @t7_322` + - `npm run typecheck:tests` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.323: Validate complete boolean schedules +- **depends_on**: [T7, T11, T13, T7.322] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_streams_modify.c`, `tests/integration/specs/t7_323.api.spec.ts`, `quality/evidence/T7.323.md`. +- **priority**: medium +- **description**: Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect. +- **findings**: F-T11-07 +- **acceptance_criteria**: + - Only exactly 168 booleans are accepted; short/long/non-array or wrong element types fail atomically and valid week schedules round-trip unchanged. + - Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage. +- **validation**: + - `node scripts/quality/run-integration.mjs --task T7.323 --project api --grep @t7_323` + - `npm run typecheck:tests` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.324: Address encoded slash names without aliasing +- **depends_on**: [T7, T11, T13, T7.319] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_streams_get.c`, `tests/integration/specs/t7_324.api.spec.ts`, `quality/evidence/T7.324.md`. +- **priority**: medium +- **description**: Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect. +- **findings**: F-T11-08 +- **acceptance_criteria**: + - An encoded slash may either address the complete supported legacy name or be explicitly rejected; it must never select/authorize a different truncated camera. + - Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage. +- **validation**: + - `node scripts/quality/run-integration.mjs --task T7.324 --project api --grep @t7_324` + - `npm run typecheck:tests` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.325: Enforce decoded stream name limits consistently +- **depends_on**: [T7, T11, T13, T7.324] +- **agent_type**: worker +- **ownership**: `src/web/request_response.c`, `src/web/api_handlers_streams_get.c`, `tests/integration/specs/t7_325.api.spec.ts`, `quality/evidence/T7.325.md`. +- **priority**: medium +- **description**: Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect. +- **findings**: F-T11-09 +- **acceptance_criteria**: + - UTF-8 names at the stored byte limit are consistently addressable by PUT/full/zones; encoded suffix length does not truncate/alias a name. Malformed escapes/NUL/dot segments remain rejected. Current encoded suffix includes /full or /zones. + - Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage. +- **validation**: + - `node scripts/quality/run-integration.mjs --task T7.325 --project api --grep @t7_325` + - `npm run typecheck:tests` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.326: Handle missing fleet inventory rows consistently +- **depends_on**: [T7, T11, T13, T7.325] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_streams_get.c`, `tests/integration/specs/t7_326.api.spec.ts`, `quality/evidence/T7.326.md`. +- **priority**: medium +- **description**: Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect. +- **findings**: F-T11-10 +- **acceptance_criteria**: + - A missing authorization inventory row cannot expose a camera; document fail-closed behavior and isolate an inconsistent row only if policy permits, while preserving authorized list results and surfacing the inconsistency. + - Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage. +- **validation**: + - `node scripts/quality/run-integration.mjs --task T7.326 --project api --grep @t7_326` + - `npm run typecheck:tests` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.327: Preserve omitted ONVIF update state +- **depends_on**: [T7, T11, T13, T7.323] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_streams_modify.c`, `tests/integration/specs/t7_327.api.spec.ts`, `quality/evidence/T7.327.md`. +- **priority**: medium +- **description**: Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect. +- **findings**: F-T11-11 +- **acceptance_criteria**: + - A tags-only or empty update preserves isOnvif and credentials without an ONVIF network call; explicit ONVIF changes retain their intended behavior. + - Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage. +- **validation**: + - `node scripts/quality/run-integration.mjs --task T7.327 --project api --grep @t7_327` + - `npm run typecheck:tests` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.328: Make privacy mutations atomic and report failure +- **depends_on**: [T7, T11, T13, T7.327] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_streams_modify.c`, `tests/integration/specs/t7_328.api.spec.ts`, `quality/evidence/T7.328.md`. +- **priority**: medium +- **description**: Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect. +- **findings**: F-T11-12 +- **acceptance_criteria**: + - Privacy-only success follows a successful database write; database failure returns failure. Mixed privacy/edit requests are rejected before enable/reload/network side effects or handled through a separately specified atomic contract. + - Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage. +- **validation**: + - `node scripts/quality/run-integration.mjs --task T7.328 --project api --grep @t7_328` + - `npm run typecheck:tests` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.329: Expose demo mode for authenticated users +- **depends_on**: [T7, T11, T13] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_auth_backend_agnostic.c`, `tests/integration/specs/t7_329.api.spec.ts`, `quality/evidence/T7.329.md`. +- **priority**: medium +- **description**: Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect. +- **findings**: F-T11-13 +- **acceptance_criteria**: + - Authenticated demo responses carry authoritative demo state while roles remain accurate, server-side redaction remains enforced and normal authenticated responses remain compatible. + - Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage. +- **validation**: + - `node scripts/quality/run-integration.mjs --task T7.329 --project api --grep @t7_329` + - `npm run typecheck:tests` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.330: Reject overlong stream strings without truncation +- **depends_on**: [T7, T11, T13, T7.328] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_streams_modify.c`, `tests/integration/specs/t7_330.api.spec.ts`, `quality/evidence/T7.330.md`. +- **priority**: medium +- **description**: Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect. +- **findings**: F-T11-14 +- **acceptance_criteria**: + - Each field checks UTF-8 byte length against the destination buffer before mutation; maximum valid values round-trip and one-byte overflow is rejected atomically, including detection_model temporary-buffer limits. + - Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage. +- **validation**: + - `node scripts/quality/run-integration.mjs --task T7.330 --project api --grep @t7_330` + - `npm run typecheck:tests` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.331: Bound ONVIF edit validation latency +- **depends_on**: [T7, T11, T13, T7.330] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_streams_modify.c`, `tests/integration/specs/t7_331.api.spec.ts`, `quality/evidence/T7.331.md`. +- **priority**: medium +- **description**: Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect. +- **findings**: F-T11-15 +- **acceptance_criteria**: + - An unresponsive synthetic ONVIF endpoint cannot monopolize a worker indefinitely; preserve accepted/persisted semantics and avoid blind retries of possibly successful mutations. Record the deadline before the test, below the client timeout or explicitly reconcile client behavior. + - Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage. +- **validation**: + - `node scripts/quality/run-integration.mjs --task T7.331 --project api --grep @t7_331` + - `npm run typecheck:tests` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.332: Preserve detection threshold round trips +- **depends_on**: [T7, T11, T13, T7.326, T7.331] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_streams_get.c`, `src/web/api_handlers_streams_modify.c`, `tests/integration/specs/t7_332.api.spec.ts`, `quality/evidence/T7.332.md`. +- **priority**: medium +- **description**: Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect. +- **findings**: F-T11-16 +- **acceptance_criteria**: + - All integer percentages 0..100 survive PUT→GET round trips; specifically 53 and 59 must not become 52 and 58. Preserve representation for existing stored floats with a documented rounding policy. + - Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage. +- **validation**: + - `node scripts/quality/run-integration.mjs --task T7.332 --project api --grep @t7_332` + - `npm run typecheck:tests` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.333: Specify password omission and explicit clear semantics +- **depends_on**: [T7, T11, T13, T7.332] +- **agent_type**: worker +- **ownership**: `src/web/api_handlers_streams_modify.c`, `tests/integration/specs/t7_333.api.spec.ts`, `quality/evidence/T7.333.md`. +- **priority**: medium +- **description**: Reproduce the T11 candidate against disposable synthetic fixtures and real C handlers before implementation. Add an independent response/state/side-effect regression, then implement the narrow correction. Coordinate schema and generated changes through the separate reconciliation task; do not weaken the contract to conceal a defect. +- **findings**: F-T11-17 +- **acceptance_criteria**: + - Omitted onvif_password leaves the secret unchanged; explicit empty clears only as an intentional authorized action. Client form construction never echoes a redacted empty value as a destructive update. + - Record the before/after behavior and exact failing-to-passing command; use synthetic credentials and disposable storage. +- **validation**: + - `node scripts/quality/run-integration.mjs --task T7.333 --project api --grep @t7_333` + - `npm run typecheck:tests` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.334: Reconcile Streams contracts after behavioral fixes +- **depends_on**: [T7, T12, T7.317, T7.318, T7.319, T7.320, T7.321, T7.322, T7.323, T7.324, T7.325, T7.326, T7.327, T7.328, T7.329, T7.330, T7.331, T7.332, T7.333] +- **agent_type**: local +- **ownership**: `docs/api/contracts/streams.yaml`, `docs/api/contracts/common.yaml`, `docs/api/openapi.yaml`, `tests/contracts/fixtures/streams/auth-verify.auth-disabled.valid.json`, `tests/contracts/fixtures/streams/auth-verify.demo-as-admin.invalid.json`, `tests/contracts/fixtures/streams/auth-verify.demo.valid.json`, `tests/contracts/fixtures/streams/auth-verify.user.valid.json`, `tests/contracts/fixtures/streams/client-config.camelcase-only.invalid.json`, `tests/contracts/fixtures/streams/client-config.valid.json`, `tests/contracts/fixtures/streams/detection-models.403-viewer.valid.json`, `tests/contracts/fixtures/streams/detection-models.no-directory.valid.json`, `tests/contracts/fixtures/streams/detection-models.unsupported-without-reason.invalid.json`, `tests/contracts/fixtures/streams/detection-models.valid.json`, `tests/contracts/fixtures/streams/error.400-retention.valid.json`, `tests/contracts/fixtures/streams/error.400-surface.valid.json`, `tests/contracts/fixtures/streams/error.401.valid.json`, `tests/contracts/fixtures/streams/error.403-put-viewer.valid.json`, `tests/contracts/fixtures/streams/error.404-camera.valid.json`, `tests/contracts/fixtures/streams/error.404-stream.valid.json`, `tests/contracts/fixtures/streams/error.413-publish-url.valid.json`, `tests/contracts/fixtures/streams/error.empty-message.invalid.json`, `tests/contracts/fixtures/streams/error.message-key.invalid.json`, `tests/contracts/fixtures/streams/full.any.generic-schema.valid.json`, `tests/contracts/fixtures/streams/full.configurer.legacy-name-plain-credentials.valid.json`, `tests/contracts/fixtures/streams/full.configurer.missing-onvif-password.invalid.json`, `tests/contracts/fixtures/streams/full.configurer.onvif-url-userinfo.invalid.json`, `tests/contracts/fixtures/streams/full.configurer.onvif.valid.json`, `tests/contracts/fixtures/streams/full.error-message-without-error.invalid.json`, `tests/contracts/fixtures/streams/full.live-only.claims-configure.invalid.json`, `tests/contracts/fixtures/streams/full.live-only.error-status.valid.json`, `tests/contracts/fixtures/streams/full.live-only.leaked-admin-url.invalid.json`, `tests/contracts/fixtures/streams/full.live-only.leaked-detection-url.invalid.json`, `tests/contracts/fixtures/streams/full.live-only.leaked-go2rtc-override.invalid.json`, `tests/contracts/fixtures/streams/full.live-only.leaked-onvif-password.invalid.json`, `tests/contracts/fixtures/streams/full.live-only.leaked-onvif-username.invalid.json`, `tests/contracts/fixtures/streams/full.live-only.leaked-publish-url.invalid.json`, `tests/contracts/fixtures/streams/full.live-only.leaked-sub-stream-url.invalid.json`, `tests/contracts/fixtures/streams/full.live-only.redacted.valid.json`, `tests/contracts/fixtures/streams/full.live-only.sensitive-keys-absent.valid.json`, `tests/contracts/fixtures/streams/full.live-only.url-query-secret.invalid.json`, `tests/contracts/fixtures/streams/full.live-only.url-userinfo.invalid.json`, `tests/contracts/fixtures/streams/full.live-only.url-username-only.invalid.json`, `tests/contracts/fixtures/streams/full.null-tags.invalid.json`, `tests/contracts/fixtures/streams/full.protocol-out-of-enum.invalid.json`, `tests/contracts/fixtures/streams/full.retention-below-inherit.invalid.json`, `tests/contracts/fixtures/streams/full.retention-over-max.invalid.json`, `tests/contracts/fixtures/streams/full.schedule-167-entries.invalid.json`, `tests/contracts/fixtures/streams/full.status-docs-value.invalid.json`, `tests/contracts/fixtures/streams/full.threshold-as-fraction.invalid.json`, `tests/contracts/fixtures/streams/full.unwrapped-object.invalid.json`, `tests/contracts/fixtures/streams/index.json`, `tests/contracts/fixtures/streams/path-encoding.cases.json`, `tests/contracts/fixtures/streams/put-response.200-privacy.valid.json`, `tests/contracts/fixtures/streams/put-response.202-onvif-failed.valid.json`, `tests/contracts/fixtures/streams/put-response.202-onvif-status-without-message.invalid.json`, `tests/contracts/fixtures/streams/put-response.202.valid.json`, `tests/contracts/fixtures/streams/put.clear-with-null.valid.json`, `tests/contracts/fixtures/streams/put.detection-retention-minus-2.invalid.json`, `tests/contracts/fixtures/streams/put.detection-url-file-scheme.invalid.json`, `tests/contracts/fixtures/streams/put.detection-url-too-long.invalid.json`, `tests/contracts/fixtures/streams/put.edit-form.valid.json`, `tests/contracts/fixtures/streams/put.empty-object.valid.json`, `tests/contracts/fixtures/streams/put.eptz-not-string.invalid.json`, `tests/contracts/fixtures/streams/put.eptz-wrong-projection.invalid.json`, `tests/contracts/fixtures/streams/put.is-deleted.invalid.json`, `tests/contracts/fixtures/streams/put.name-in-body.invalid.json`, `tests/contracts/fixtures/streams/put.playback-transport-bogus.invalid.json`, `tests/contracts/fixtures/streams/put.privacy-mixed-with-edit.invalid.json`, `tests/contracts/fixtures/streams/put.protocol-out-of-enum.invalid.json`, `tests/contracts/fixtures/streams/put.publish-and-detection-url.valid.json`, `tests/contracts/fixtures/streams/put.publish-url-http.invalid.json`, `tests/contracts/fixtures/streams/put.publish-url-quote.invalid.json`, `tests/contracts/fixtures/streams/put.record-as-string.invalid.json`, `tests/contracts/fixtures/streams/put.retention-366.invalid.json`, `tests/contracts/fixtures/streams/put.retention-finite-boundary.valid.json`, `tests/contracts/fixtures/streams/put.retention-tristate.valid.json`, `tests/contracts/fixtures/streams/put.schedule-weekday.valid.json`, `tests/contracts/fixtures/streams/put.schedule-wrong-length.invalid.json`, `tests/contracts/fixtures/streams/put.set-privacy-mode.valid.json`, `tests/contracts/fixtures/streams/put.tags-too-long.invalid.json`, `tests/contracts/fixtures/streams/summary.admin.admin-url-without-configure.invalid.json`, `tests/contracts/fixtures/streams/summary.admin.configurer-with-admin-url.valid.json`, `tests/contracts/fixtures/streams/summary.admin.contains-url.invalid.json`, `tests/contracts/fixtures/streams/summary.admin.empty.valid.json`, `tests/contracts/fixtures/streams/summary.admin.missing-can-configure.invalid.json`, `tests/contracts/fixtures/streams/summary.admin.page-beyond-end.valid.json`, `tests/contracts/fixtures/streams/summary.admin.page-size-over-max.invalid.json`, `tests/contracts/fixtures/streams/summary.admin.status-from-detail-enum.invalid.json`, `tests/contracts/fixtures/streams/summary.admin.viewer.valid.json`, `tests/contracts/fixtures/streams/summary.live.contains-admin-url.invalid.json`, `tests/contracts/fixtures/streams/summary.live.contains-onvif-password.invalid.json`, `tests/contracts/fixtures/streams/summary.live.viewer.valid.json`, `tests/contracts/fixtures/streams/summary.lpr.leaks-location.invalid.json`, `tests/contracts/fixtures/streams/summary.lpr.valid.json`, `tests/contracts/fixtures/streams/zones.empty.valid.json`, `tests/contracts/fixtures/streams/zones.valid.json`, `web/js/api/generated/`, `tests/contracts/generated/`, `quality/evidence/T7.334.md`. +- **priority**: high +- **description**: Under the exclusive generation lease, reconcile the exact schemas and affected fixture files after the preceding fixes. The exact fixture list is recorded in ownership; generated directories are exclusively owned outputs of T12. Regenerate only through T12 tooling; no concurrent generation. Preserve separate desired-client and current-wire cases where intentionally different. +- **findings**: policy/integration requirement +- **acceptance_criteria**: + - All valid and invalid fixtures retain explicit reasons and agree with the corrected real backend. + - Generate deterministic artifacts and run real pilot regressions; T18/T19 cannot use stale contracts. +- **validation**: + - `node scripts/quality/contracts.mjs --generate` + - `node scripts/quality/contracts.mjs --check` + - `node --test tests/quality/contracts.test.mjs` + - `npm --prefix web run typecheck` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T7.335: Resolve proposed ownership and exception review records +- **depends_on**: [T7, T7.1] +- **agent_type**: local +- **ownership**: `quality/reviews/exception-ownership.json`, `quality/evidence/T7.335.md`. +- **priority**: high +- **description**: Collect accountable owners and explicit approvals/denials for T1/T6 proposals and any new residual exceptions. Existing maintainers/ strings and proposed dates are not acceptance. Prepare a concrete review record; leave pending entries unresolved until actual authorized reviewer input arrives. +- **findings**: policy/integration requirement +- **acceptance_criteria**: + - Every unresolved proposal names its exact finding/gap, requested owner, exposure, rationale, proposed expiry and approval state. + - No approval, repository protection change, CODEOWNERS assignment or publication is inferred from implementation authorization. +- **validation**: + - `python3 -m json.tool quality/reviews/exception-ownership.json` +- **status**: Blocked — review prepared, awaiting compatible fix or maintainer decision +- **log**: Concrete review packet committed in `713b3025`; no package mutation, approval or disposition change. Current development-tool advisory ranges and dependency parents checked; production web audit zero. See task evidence and `quality/reviews/exception-ownership.json`. +- **files edited/created**: + +## Expanded test typing tasks (T9) + +### T9.1: Repair load-test and page-helper type boundaries +- **depends_on**: [T9] +- **agent_type**: worker +- **ownership**: `tests/load/config.ts`, `tests/load/reporter.ts`, `tests/load/runner.ts`, `tests/integration/pages/StreamsPage.ts`, `tests/integration/pages/TimelinePage.ts`, `quality/evidence/T9.1.md`. +- **description**: Repair three array-index return types, two unknown caught errors, and date extraction. Use checked existence/narrowing, preserve behavior for valid inputs, and reject impossible empty selections explicitly. No load execution or test removal. +- **acceptance_criteria**: All six initial diagnostics in these five files disappear without broad declarations, ts-ignore, or new `any`; valid CLI/scenario/report/page behavior stays intact. +- **validation**: `npm run typecheck:tests` (initial 38 diagnostics; this cluster must reach zero while unrelated clusters remain RED); Node assertions for parseArgs valid/missing values and zero-request runLoadTest without network; final whole-config GREEN owned by T9.4. +- **status**: Not Completed + +### T9.2: Type media DOM and mocked routes +- **depends_on**: [T9.1] +- **agent_type**: worker +- **ownership**: `tests/integration/specs/investigation.ui.spec.ts`, `tests/integration/specs/recordings.ui.spec.ts`, `tests/integration/specs/streams.ui.spec.ts`, `tests/integration/specs/timeline.ui.spec.ts`, `quality/evidence/T9.2.md`. +- **description**: Narrow selected video elements to the HTMLVideoElement contract; retain controls/readyState/play/pause assertions. Type mocked route setup parameters as Playwright Page so handlers infer Route. Use fixed ISO date slicing for non-optional date strings. Handle controlsList as a narrow browser capability (DOMTokenList) because it is not part of TypeScript's portable HTMLMediaElement interface. +- **acceptance_criteria**: All 23 original diagnostics across these four files disappear; all runtime test definitions/assertions remain present; no ambient browser-wide `any` added. +- **validation**: `npm run typecheck:tests` with zero cluster errors; compare Playwright --list test identities to baseline (ignore moved line numbers); final full GREEN in T9.4. +- **status**: Not Completed + +### T9.3: Preserve timeline/snapshot fixture bounds +- **depends_on**: [T9.2] +- **agent_type**: worker +- **ownership**: `tests/integration/specs/timeline-boundary.ui.spec.ts`, `tests/integration/specs/stream-snapshot-requests.ui.spec.ts`, `quality/evidence/T9.3.md`. +- **description**: Validate parsed local date/time components and nonempty segment fixtures; narrow fixed fixture entries and captured URLs through explicit checks or known tuple definitions. Preserve existing route responses and snapshot/timeline assertions, rejecting malformed fixture setup instead of changing tests to pass. +- **acceptance_criteria**: All eight original diagnostics in these two files disappear without optional-default values hiding missing test data; test identities remain unchanged. +- **validation**: `npm run typecheck:tests` with zero cluster errors; Playwright --list identities unchanged; final full GREEN in T9.4. +- **status**: Not Completed + +### T9.4: Integrate the legacy JS test boundary and verify coverage +- **depends_on**: [T9.3] +- **agent_type**: local +- **ownership**: `tests/tsconfig.json`, `tests/integration/recordings-url-utils.ui.spec.ts`, optional narrowly scoped test interop helper under `tests/integration/fixtures/`, `quality/evidence/T9.4.md`, `quality/evidence/T9.md`. +- **description**: Resolve the existing recordings JS import without wildcard-any modules or hiding test files. Keep the exact legacy JS boundary explicit and runtime-checked where values cross into the test. Any incremental allowJs/checkJs setting must inventory the exact imported application files as still unchecked and assign retirement to T34; it is not migration completion. Preserve the four existing URL utility test definitions and assertions. Reconcile compiler coverage and discovery across all clusters. +- **acceptance_criteria**: Root typecheck is GREEN for all existing integration/load TS and configuration; no unchecked test file/excluded diagnostic; 213 Playwright tests in 28 files remain discovered; no load traffic sent. Legacy application JS remains explicitly accounted for in evidence. +- **validation**: `npm run typecheck:tests`; `npx playwright test --list --reporter=list`; inspect `tsc --listFilesOnly -p tests/tsconfig.json` against `rg --files tests/integration tests/load`; run the four URL utility tests with a temporary isolated Playwright config disabling global setup/teardown (they need neither browser launch nor server); all results captured under `build/eng-artifacts/T9/`. +- **status**: Not Completed + +Coordinator verified this serial task chain and inserted T9.4 into T13/T15 before child edits. Root type-check lease is held by its worker. + ## Parallel Execution Groups These are dependency frontiers, not permission to exceed three worker slots or @@ -788,7 +6993,7 @@ tasks must update this table before their children are scheduled. | --- | --- | --- | | 1 | T1, T2, T3, T4 | Immediately; batch into available slots; reserve frontend build lease for T4 | | 2 | T5, T6, T7, T11; then T8 | Respective inventory/baseline dependencies complete; T7 waits for archived T4 baseline; T8 also waits for T11 | -| 3 | T9, T10, T12; eligible T7.* | T8/T11 prerequisites complete; fix tasks honor concrete ownership edges | +| 3 | T9 then T9.1–T9.4, T10, T12; eligible T7.* | T8/T11 prerequisites complete; fix tasks honor concrete ownership edges | | 4 | T13, T14, T31 | T9, T6/T10, or T3/T7 respectively; T13 and T14 serialize if shared infra needs overlap | | 5 | T15; T27, T28, T29; eligible T31.* | Harness/foundation prerequisites complete; operational writers have disjoint files | | 6 | T16, T17, T18; T30, T32, T33 when ready | T15 for pilot; separate operational/fix gates follow their task dependencies | diff --git a/quality/remediation-map.json b/quality/remediation-map.json index 3b8a4be03..056c93c17 100644 --- a/quality/remediation-map.json +++ b/quality/remediation-map.json @@ -231,7 +231,7 @@ ], "kind": "dependency", "priority": "medium", - "status": "Not Completed", + "status": "Blocked \u2014 review prepared, awaiting compatible fix or maintainer decision", "ownership": [ "web/package.json", "web/package-lock.json", @@ -257,7 +257,8 @@ "finding_ids": [ "NPM-WEB-GHSA-3g3m-2fjr-6pw4-glob" ], - "lease": "exclusive package/install/build lease" + "lease": "exclusive package/install/build lease", + "review_commit": "713b3025" }, { "id": "T7.9", @@ -269,7 +270,7 @@ ], "kind": "dependency", "priority": "medium", - "status": "Not Completed", + "status": "Blocked \u2014 review prepared, awaiting compatible fix or maintainer decision", "ownership": [ "web/package.json", "web/package-lock.json", @@ -301,7 +302,8 @@ "finding_ids": [ "NPM-WEB-GHSA-g3hv-75wg-m249-minimatch" ], - "lease": "exclusive package/install/build lease" + "lease": "exclusive package/install/build lease", + "review_commit": "713b3025" }, { "id": "T7.10", @@ -313,7 +315,7 @@ ], "kind": "dependency", "priority": "medium", - "status": "Not Completed", + "status": "Blocked \u2014 review prepared, awaiting compatible fix or maintainer decision", "ownership": [ "web/package.json", "web/package-lock.json", @@ -340,7 +342,8 @@ "DEPENDABOT-101", "NPM-WEB-GHSA-gcqx-w48m-w2h4-deepmerge" ], - "lease": "exclusive package/install/build lease" + "lease": "exclusive package/install/build lease", + "review_commit": "713b3025" }, { "id": "T7.11", @@ -19146,7 +19149,7 @@ ], "kind": "approval-review", "priority": "high", - "status": "Not Completed", + "status": "Blocked \u2014 review prepared, awaiting compatible fix or maintainer decision", "ownership": [ "quality/reviews/exception-ownership.json", "quality/evidence/T7.335.md" @@ -19162,7 +19165,8 @@ ], "evidence": "quality/evidence/T7.335.md", "finding_ids": [], - "requires_external_evidence": true + "requires_external_evidence": true, + "review_commit": "713b3025" } ], "finding_map": [ From 688eb332512c4af97ec9a02bbbfdd731a65ab9c1 Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Sat, 31 Oct 2026 03:40:35 -0400 Subject: [PATCH 021/230] T9.3: require complete timeline and snapshot fixtures --- quality/evidence/T9.3.md | 19 ++++++++++++++++++ .../specs/stream-snapshot-requests.ui.spec.ts | 8 ++++++-- .../specs/timeline-boundary.ui.spec.ts | 20 +++++++++++++++---- 3 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 quality/evidence/T9.3.md diff --git a/quality/evidence/T9.3.md b/quality/evidence/T9.3.md new file mode 100644 index 000000000..4394b227a --- /dev/null +++ b/quality/evidence/T9.3.md @@ -0,0 +1,19 @@ +# T9.3 — Timeline and snapshot fixture bounds + +RED: eight diagnostics across the timeline-boundary and stream-snapshot specs. +GREEN for this two-file cluster: no remaining diagnostics. The full compiler +still exits 2 for T9.4's one legacy JS import (`build/eng-artifacts/T9/after-T9.3.log`). + +Local timestamp fixtures reject missing/nonfinite components before creating a +Date. Timeline API fixtures require first/last segments; the boundary and +detection cases explicitly require the indexed segment they consume. Snapshot +setup finds the named cam_a fixture and requires the fourth captured URL after +re-enable. Missing fixture data now produces a clear failure, never a default +value that could mask a regression. Existing response data and assertions for +valid fixtures are unchanged. + +Validation: `npm run typecheck:tests`; `npx playwright test --list --reporter=list`. +All **213 project/file/title identities in 28 files** match the initial discovery +when source line numbers are ignored (`T9/discovery-T9.3.log`). No test removed, +no broad type escape added, no server or browser started. Runtime UI execution +remains in the isolated integration gates after T13. diff --git a/tests/integration/specs/stream-snapshot-requests.ui.spec.ts b/tests/integration/specs/stream-snapshot-requests.ui.spec.ts index c186b783b..f6f742d38 100644 --- a/tests/integration/specs/stream-snapshot-requests.ui.spec.ts +++ b/tests/integration/specs/stream-snapshot-requests.ui.spec.ts @@ -8,10 +8,12 @@ test('snapshot requests stay stable until a camera is re-enabled @ui @streams', width: 640, height: 480, fps: 15, codec: 'h264', protocol: 0, record: false, tags: '', playback_transport: 'mse_only', })); + const primaryStream = streams.find(stream => stream.name === 'cam_a'); + if (!primaryStream) throw new Error('Snapshot fixture requires cam_a'); await page.route('**/api/**', async route => { const path = new URL(route.request().url()).pathname; if (path === '/api/streams/cam_a') { - streams[0].enabled = route.request().method() === 'PUT'; + primaryStream.enabled = route.request().method() === 'PUT'; await route.fulfill({ json: { success: true } }); return; } @@ -63,6 +65,8 @@ test('snapshot requests stay stable until a camera is re-enabled @ui @streams', await expect(disable).toBeVisible(); await expect.poll(() => snapshotUrls.length).toBe(4); await expect(camera.locator('img')).toBeVisible(); - expect(new URL(snapshotUrls[3]).searchParams.get('src')).toBe('cam_a'); + const refreshedSnapshotUrl = snapshotUrls[3]; + if (!refreshedSnapshotUrl) throw new Error('Expected fourth snapshot URL after re-enable'); + expect(new URL(refreshedSnapshotUrl).searchParams.get('src')).toBe('cam_a'); expect(snapshotUrls[3]).not.toBe(snapshotUrls[0]); }); diff --git a/tests/integration/specs/timeline-boundary.ui.spec.ts b/tests/integration/specs/timeline-boundary.ui.spec.ts index 5f5bd93ec..4eb672baf 100644 --- a/tests/integration/specs/timeline-boundary.ui.spec.ts +++ b/tests/integration/specs/timeline-boundary.ui.spec.ts @@ -8,6 +8,11 @@ type Segment = { id: number; stream: string; start_timestamp: number; end_timest function localTimestamp(date: string, time: string): number { const [y, m, d] = date.split('-').map(Number); const [hh, mm, ss] = time.split(':').map(Number); + if (y === undefined || m === undefined || d === undefined || + hh === undefined || mm === undefined || ss === undefined || + ![y, m, d, hh, mm, ss].every(Number.isFinite)) { + throw new Error(`Invalid local timestamp fixture: ${date} ${time}`); + } return Math.floor(new Date(y, m - 1, d, hh, mm, ss).getTime() / 1000); } @@ -16,14 +21,17 @@ function utcTimestamp(isoString: string): number { } async function mockTimelineApis(page: Page, stream: string, segments: Segment[], tagsById: Record = {}) { + const firstSegment = segments[0]; + const lastSegment = segments[segments.length - 1]; + if (!firstSegment || !lastSegment) throw new Error('Timeline fixture requires at least one segment'); await page.route(/\/api\/streams(?:\?.*)?$/, route => route.fulfill({ json: { streams: [{ name: stream }], total_pages: 1 } })); await page.route('**/api/timeline/segments?**', route => route.fulfill({ json: { segments } })); await page.route('**/api/timeline/segments-by-ids?**', route => route.fulfill({ json: { segments, - start_time: new Date(segments[0].start_timestamp * 1000).toISOString(), - end_time: new Date(segments[segments.length - 1].end_timestamp * 1000).toISOString(), + start_time: new Date(firstSegment.start_timestamp * 1000).toISOString(), + end_time: new Date(lastSegment.end_timestamp * 1000).toISOString(), multi_stream: new Set(segments.map(segment => segment.stream)).size > 1 } })); await page.route('**/api/detection/results/**', route => route.fulfill({ json: { detections: [] } })); @@ -164,8 +172,10 @@ test.describe('Timeline boundary flows @ui @timeline', () => { await page.addInitScript(() => localStorage.setItem('recordings_view_mode', 'table')); await mockTimelineApis(page, stream, segments, { 102: ['person'] }); + const boundarySegment = segments[1]; + if (!boundarySegment) throw new Error('Boundary fixture requires a second segment'); await page.route('**/api/recordings?**', route => route.fulfill({ json: { - recordings: [{ id: 102, stream, start_time_unix: segments[1].start_timestamp, duration: 600, size: '1 MB', protected: false, tags: [] }], + recordings: [{ id: 102, stream, start_time_unix: boundarySegment.start_timestamp, duration: 600, size: '1 MB', protected: false, tags: [] }], pagination: { total: 1, pages: 1, limit: 20 } } })); @@ -421,8 +431,10 @@ test.describe('Timeline boundary flows @ui @timeline', () => { ]; await mockTimelineApis(page, stream, segments); + const detectionSegment = segments[0]; + if (!detectionSegment) throw new Error('Detection fixture requires a segment'); await page.route('**/api/detection/results/**', route => route.fulfill({ json: { detections: [{ - timestamp: segments[0].start_timestamp + 1, + timestamp: detectionSegment.start_timestamp + 1, x: 0.1, y: 0.1, width: 0.25, From b0bcf4c2c58cd73ac81a1c98f6af11e3978ab3ae Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Sat, 31 Oct 2026 03:41:55 -0400 Subject: [PATCH 022/230] T9.4: verify strict test coverage and narrow legacy JS interop --- quality/evidence/T9-expansion.md | 4 +- quality/evidence/T9.4.md | 54 +++++++++++++++++++ quality/evidence/T9.md | 9 ++++ .../recordings-url-utils.ui.spec.ts | 37 +++++++++---- tests/tsconfig.json | 4 +- 5 files changed, 96 insertions(+), 12 deletions(-) create mode 100644 quality/evidence/T9.4.md diff --git a/quality/evidence/T9-expansion.md b/quality/evidence/T9-expansion.md index 18386806d..3f125278d 100644 --- a/quality/evidence/T9-expansion.md +++ b/quality/evidence/T9-expansion.md @@ -52,4 +52,6 @@ No schema/package/native/shared setup ownership overlaps are introduced. - **validation**: `npm run typecheck:tests`; `npx playwright test --list --reporter=list`; inspect `tsc --listFilesOnly -p tests/tsconfig.json` against `rg --files tests/integration tests/load`; run the four URL utility tests with a temporary isolated Playwright config disabling global setup/teardown (they need neither browser launch nor server); all results captured under `build/eng-artifacts/T9/`. - **status**: Not Completed -Expansion is pending coordinator graph/ownership approval before child edits. +Coordinator validated and inserted this expansion before child edits. All four +child tasks were then implemented serially; completion evidence is recorded in +T9.1.md through T9.4.md. The main plan owns final task statuses. diff --git a/quality/evidence/T9.4.md b/quality/evidence/T9.4.md new file mode 100644 index 000000000..5f80b12ba --- /dev/null +++ b/quality/evidence/T9.4.md @@ -0,0 +1,54 @@ +# T9.4 — Integrated strict test coverage and legacy import boundary + +The final TS7016 diagnostic was the existing recordings URL test importing an +untyped browser JS module. `allowJs: true, checkJs: false` allows incremental +interop while every integration/load **TypeScript** file remains strictly +checked. This does not count browser JS as migrated. No broad declaration, any +module shim, ignored error, or test exclusion was added. + +The exact imported browser JS frontier, verified from compiler `--listFilesOnly`: + +- `web/js/components/preact/recordings/urlUtils.js` +- `web/js/components/preact/recordings/formatUtils.js` +- `web/js/utils/date-utils.js` + +These three files remain unchecked application implementation. Their conversion +belongs to the T25 recordings/date-utils rollout tasks and **T34 must retire this +frontier or verify its remaining explicit interop exception**. No other browser +JS enters the test compiler. The imported utility's broad Object result is +converted to unknown and its object/filter envelope checked at runtime before +the existing value assertions. The window/history stub uses a local typed object +and Object.defineProperty, removing its old globalThis-as-any casts. + +## RED → GREEN + +- Initial `npm run typecheck:tests`: exit 2, 38 diagnostics in 12 files. +- After T9.1: 32 unrelated diagnostics; five-file cluster clean. +- After T9.2: nine unrelated diagnostics; four-file cluster clean. +- After T9.3: one unrelated diagnostic; two-file cluster clean. +- Final `npm run typecheck:tests`: **exit 0**, no diagnostics. +- `npx tsc --listFilesOnly -p tests/tsconfig.json`: all **48** existing + integration/load/config TS files included; none missing. +- `npx playwright test --list --reporter=list`: **213 tests in 28 files**, exactly + the same project/file/title identities as before (only line numbers moved). +- Four existing recordings URL tests execute and pass under an isolated temporary + Playwright config with no global setup/teardown. No browser fixture is used; + no server launches or load traffic occur. Retries are disabled. + +Raw logs: `build/eng-artifacts/T9/{red,after-T9.1,after-T9.2,after-T9.3,green}.log`, +`compiler-files.log`, `coverage.json`, `discovery-{before,after}.log`, and +`url-utils-tests.log`. + +The pure utility test command is: + +```sh +npx playwright test --config build/eng-artifacts/T9/url-utils.playwright.config.ts +``` + +Its retained temporary configuration imports `defineConfig` and `node:path`, +sets `testDir` to the absolute `tests/integration` directory, `testMatch` to +`recordings-url-utils.ui.spec.ts`, `workers: 1`, `retries: 0`, `reporter: 'list'`, +and `outputDir` under the task artifact directory. It does not inherit the +repository configuration or configure global setup/teardown. Existing media/UI +runtime suites still require T13's isolated runner; compiler/discovery results +do not claim that those server-backed suites passed. diff --git a/quality/evidence/T9.md b/quality/evidence/T9.md index 0b46590b9..d7eef4c69 100644 --- a/quality/evidence/T9.md +++ b/quality/evidence/T9.md @@ -19,3 +19,12 @@ configuration and inventory; full GREEN is required at T9.4, not claimed here. Existing explicit `any` annotations elsewhere in the legacy test suite are not claimed removed; no broad ambient declaration, ignored diagnostic or excluded test is added to make the compiler pass. + +## Integrated result + +T9.1–T9.4 finished their bounded repairs. Final `npm run typecheck:tests` exits 0; +all 48 existing integration/load/config TS files are included. Discovery remains +213 tests in 28 files with identical project/file/title identities. The four +server-independent recordings URL tests pass without global setup or a browser. +See T9.4 for exact logs and the explicit three-file unchecked browser JS frontier +which must be retired by T25/T34. No production load was sent. diff --git a/tests/integration/recordings-url-utils.ui.spec.ts b/tests/integration/recordings-url-utils.ui.spec.ts index e92f04586..3a35857d7 100644 --- a/tests/integration/recordings-url-utils.ui.spec.ts +++ b/tests/integration/recordings-url-utils.ui.spec.ts @@ -1,22 +1,39 @@ import { test, expect } from '@playwright/test'; import { urlUtils } from '../../web/js/components/preact/recordings/urlUtils.js'; +// The imported browser implementation is still JS until the recordings rollout. +// Treat its broad Object result as unknown and require the object envelope that +// these existing value assertions consume. No declaration invents a return type. +const isRecord = (value: unknown): value is Record => + typeof value === 'object' && value !== null && !Array.isArray(value); + +function readUrlState(): (Record & { filters: Record }) | null { + const state: unknown = urlUtils.getFiltersFromUrl(); + if (state === null) return null; + if (!isRecord(state) || !isRecord(state.filters)) { + throw new Error('Expected URL state with a filters object'); + } + return { ...state, filters: state.filters }; +} + const setWindowLocation = (url: string) => { - (globalThis as any).window = { + const browserWindow = { location: new URL(url), history: { - replaceState: (_state: unknown, _title: string, nextUrl: string) => { - (globalThis as any).window.location = new URL(nextUrl, (globalThis as any).window.location.href); + replaceState: (_state: unknown, _title: string, nextUrl: string): void => { + browserWindow.location = new URL(nextUrl, browserWindow.location.href); } } }; - (globalThis as any).history = (globalThis as any).window.history; + Object.defineProperty(globalThis, 'window', { configurable: true, writable: true, value: browserWindow }); + Object.defineProperty(globalThis, 'history', { configurable: true, writable: true, value: browserWindow.history }); + return browserWindow; }; test('parses comma-separated multi-select filters from the URL', () => { setWindowLocation('http://localhost/recordings?stream=cam1,cam2&detection_label=person,car&tag=urgent,review&capture_method=scheduled,manual&detection=1'); - const state = urlUtils.getFiltersFromUrl(); + const state = readUrlState(); expect(state?.filters.streamIds).toEqual(['cam1', 'cam2']); expect(state?.filters.detectionLabels).toEqual(['person', 'car']); @@ -45,7 +62,7 @@ test('builds one active-filter badge per selected value', () => { }); test('serializes multi-select filters back into the URL', () => { - setWindowLocation('http://localhost/recordings'); + const browserWindow = setWindowLocation('http://localhost/recordings'); urlUtils.updateUrlWithFilters( { @@ -60,7 +77,7 @@ test('serializes multi-select filters back into the URL', () => { 'desc' ); - const params = ((globalThis as any).window.location as URL).searchParams; + const params = browserWindow.location.searchParams; expect(params.get('stream')).toBe('cam1,cam2'); expect(params.get('detection_label')).toBe('person,car'); expect(params.get('tag')).toBe('urgent'); @@ -70,9 +87,9 @@ test('serializes multi-select filters back into the URL', () => { }); test('supports the all-items pagination mode in URL state', () => { - setWindowLocation('http://localhost/recordings?limit=all&page=4'); + const browserWindow = setWindowLocation('http://localhost/recordings?limit=all&page=4'); - const state = urlUtils.getFiltersFromUrl(); + const state = readUrlState(); expect(state?.limit).toBe(20); expect(state?.showAll).toBe(true); expect(state?.page).toBe(1); @@ -84,7 +101,7 @@ test('supports the all-items pagination mode in URL state', () => { 'desc' ); - const params = ((globalThis as any).window.location as URL).searchParams; + const params = browserWindow.location.searchParams; expect(params.get('limit')).toBe('all'); expect(params.get('page')).toBe('1'); }); diff --git a/tests/tsconfig.json b/tests/tsconfig.json index 090f53934..b4d12af68 100644 --- a/tests/tsconfig.json +++ b/tests/tsconfig.json @@ -11,7 +11,9 @@ "noEmit": true, "esModuleInterop": true, "forceConsistentCasingInFileNames": true, - "types": ["node"] + "types": ["node"], + "allowJs": true, + "checkJs": false }, "include": ["integration/**/*.ts", "load/**/*.ts", "../playwright.config.ts"], "exclude": ["../node_modules", "../web/node_modules", "../build"] From 2e7b8e5aef5c50a8b8fb297d8073e7d31cad6b85 Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Sat, 31 Oct 2026 03:42:09 -0400 Subject: [PATCH 023/230] docs: select bounded stream-state disposal improvement --- engineering-foundation-plan.md | 43 ++++++++++++++++++++++++++++++---- quality/c-boundary.json | 43 ++++++++++++++++++++++++++++++++++ quality/evidence/T31.md | 29 +++++++++++++++++++++++ 3 files changed, 111 insertions(+), 4 deletions(-) create mode 100644 quality/c-boundary.json create mode 100644 quality/evidence/T31.md diff --git a/engineering-foundation-plan.md b/engineering-foundation-plan.md index 2c3ffc8e8..fdcbf3d39 100644 --- a/engineering-foundation-plan.md +++ b/engineering-foundation-plan.md @@ -677,12 +677,12 @@ records and gate dependencies must be added by the named producer. - **validation**: - `python3 -m json.tool quality/c-boundary.json` - Review documented invariants and the added task DAG against actual callers and T3 evidence. -- **status**: Not Completed -- **log**: -- **files edited/created**: +- **status**: Completed — bounded disposal improvement selected; child implementation pending +- **log**: Source review found global state shutdown destroys one of two initialized mutexes while normal removal destroys both. Selected shared private final-disposal helper; exact lifecycle regression, implementation and verification tasks T31.1–T31.3 inserted. No T7 source ownership overlap; runner/test registration follows T13. JSON and graph review pass; no implementation outcome claimed. +- **files edited/created**: `quality/c-boundary.json`, `quality/evidence/T31.md`, this plan ### T32: Integrate and verify the C boundary improvement -- **depends_on**: [T5, T27, T28, T29, T31] +- **depends_on**: [T5, T27, T28, T29, T31, T31.1, T31.2, T31.3] - **agent_type**: local - **ownership**: selected boundary integration paths from T31, `quality/evidence/T32.md`; no unrelated native modules. - **description**: **Locked until completed T31.* dependencies are inserted.** Reconcile the selected refactor, verify evidence of simpler ownership/reduced coupling or removal of the defect, and rerun affected operational/sanitizer checks. @@ -6982,6 +6982,41 @@ T7 → T7.1 approval enforcement → T14; T8 → dependency remediations → T15 Coordinator verified this serial task chain and inserted T9.4 into T13/T15 before child edits. Root type-check lease is held by its worker. +## Expanded C boundary tasks (T31) + +### T31.1: Reproduce stream-state mutex disposal imbalance +- **depends_on**: [T31, T13] +- **agent_type**: worker +- **ownership**: `tests/unit/test_stream_state_disposal.c`, `tests/unit/cmake/eng/stream_state_disposal.cmake`, `quality/evidence/T31.1.md`. +- **description**: Wrap pthread_mutex_destroy in a focused native test and track only the two mutex addresses of created states. Test normal removal, extra-ref refusal, global shutdown, repeated shutdown and repeated lifecycle cycles. Add registration through T13's fragment seam. Do not modify production code in this task. +- **acceptance_criteria**: The original shutdown path fails because state_mutex is not destroyed; normal removal and refusal assertions establish unchanged preconditions. No live stream or remote server is used. +- **validation**: `python3 scripts/quality/run-native.py --task T31.1 --regex '^test_stream_state_disposal$'` must fail for the expected missing destruction, with exact RED output retained. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T31.2: Unify final disposal of stream-state resources +- **depends_on**: [T31.1] +- **agent_type**: worker +- **ownership**: `src/video/stream_state.c`, `quality/evidence/T31.2.md`. +- **description**: Introduce a private final-disposal helper destroying both initialized per-state mutexes before freeing, and use it from existing normal removal and global shutdown paths. Document quiescence/lock preconditions. Keep stop ordering, ref checks, timestamp cleanup, public API and state layout unchanged. +- **acceptance_criteria**: T31.1 regressions pass; every final-disposal caller uses the helper and no duplicate destroy is added. No concurrency redesign or new allocation is introduced. +- **validation**: `python3 scripts/quality/run-native.py --task T31.2 --regex '^test_stream_(state_disposal|state|manager)$'`. +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T31.3: Verify resource-disposal regression under sanitizers +- **depends_on**: [T31.2] +- **agent_type**: local +- **ownership**: `quality/evidence/T31.3.md`. +- **description**: Rerun the focused disposal/state/manager tests in the isolated native runner and its ASan/UBSan profile; record exact toolchain, revision and flags. Assert repeated-cycle success and no diagnostics. Physical device budgets remain deferred and are not replaced by sanitizer results. +- **acceptance_criteria**: Functional and ASan/UBSan runs pass with nonzero test discovery, no invalid/double destroy observations, and no sanitizer errors; no runtime performance claim is made. +- **validation**: `python3 scripts/quality/run-native.py --task T31.3 --regex '^test_stream_(state_disposal|state|manager)$'`; run the same selection with the sanitizer option produced/documented by T13. +- **status**: Not Completed +- **log**: +- **files edited/created**: + ## Parallel Execution Groups These are dependency frontiers, not permission to exceed three worker slots or diff --git a/quality/c-boundary.json b/quality/c-boundary.json new file mode 100644 index 000000000..61e4ae5ec --- /dev/null +++ b/quality/c-boundary.json @@ -0,0 +1,43 @@ +{ + "schema_version": 1, + "producer": "T31", + "status": "selected; implementation pending", + "selected_boundary": "stream-state allocation/destruction", + "reason": "create_stream_state initializes two mutexes. remove_stream_state destroys both; shutdown_stream_state_manager destroys only mutex before freeing. Consolidating final disposal removes divergent resource lifecycle paths.", + "evidence": { + "initialization": "src/video/stream_state.c:create_stream_state", + "missing_cleanup": "src/video/stream_state.c:shutdown_stream_state_manager", + "complete_cleanup": "src/video/stream_state.c:remove_stream_state", + "shutdown_callers": [ + "src/core/main.c:cleanup shutdown sequence", + "tests/unit/test_stream_state.c", + "tests/unit/test_stream_manager.c" + ] + }, + "ownership": { + "allocation": "create_stream_state owns calloc and both pthread_mutex_init calls; on second init failure destroys first and frees", + "registry": "stream_states stores pointers under states_mutex; removal detaches same slot under that lock", + "borrowing": "get_stream_state_by_name returns borrowed pointer; existing caller/ref lifecycle is not changed", + "final_disposal": "new private helper destroys mutex and state_mutex then frees, called only after existing stop/quiescence path", + "thread_affinity": "no new thread; existing removal/shutdown caller performs disposal", + "locks": "states_mutex held for final disposal; state->mutex and state_mutex must be unlocked and unused; helper acquires no locks", + "callbacks": "no callback registration or disable ordering change", + "cancellation_shutdown": "existing stop and shutdown ordering preserved; main stops stream manager and adapter first", + "scope_limit": "No repair of unrelated concurrent borrowed-pointer lifetime or state-transition policy is claimed." + }, + "behavior_invariants": [ + "No state layout, public signature, persistence or wire change", + "Both initialized per-state mutexes destroyed exactly once on removal and global shutdown", + "Refused removal with extra references destroys neither mutex", + "Repeated global shutdown performs no additional per-state destroy", + "Repeated create/remove/shutdown cycles preserve current registry and reference behavior" + ], + "tasks": [ + "T31.1", + "T31.2", + "T31.3" + ], + "test_registration_producer": "T13", + "remediation_overlap": [], + "physical_qualification": "deferred by user; no performance claim" +} diff --git a/quality/evidence/T31.md b/quality/evidence/T31.md new file mode 100644 index 000000000..08802738b --- /dev/null +++ b/quality/evidence/T31.md @@ -0,0 +1,29 @@ +# T31: Stream-state resource disposal boundary + +Static review selected an evidenced lifecycle defect rather than changing a +sound parser: `create_stream_state` initializes `mutex` and `state_mutex`, but +global shutdown destroys only `mutex` before freeing. Normal removal destroys +both. A shared private final-disposal helper can make both paths consistent. + +The planned change touches one C implementation file. New focused tests use +linker wrapping of pthread mutex destruction to observe the actual lifecycle, +including refusal with extra refs, normal removal, global shutdown, repeated +shutdown and repeated cycles. No runtime network/source is needed. Tests must +first fail on the missing state_mutex destruction, then pass after the helper. + +The invariant record is `quality/c-boundary.json`. The main cleanup path calls +stream manager and adapter shutdown before state-manager shutdown. This bounded +change preserves those ordering assumptions; it does not claim to solve all +existing borrowed-pointer or cross-thread lifetime questions. Final disposal +runs under the registry mutex with both per-state mutexes unlocked/quiescent. +No new allocation, callback, lock order, public API or persisted state is added. + +No T7 source writer owns src/video/stream_state.c, and the new test/fragment is +unique. T13 produces the registration/runner seam. T31.1 creates precondition +regressions; T31.2 changes disposal only; T31.3 runs native and sanitizer checks. +All are explicit T32 dependencies. T27–T29 continue to gate final C integration. + +`reason_not_testable`: this task selects/documents the boundary and executable +children, without production changes. Verification: source/caller review, JSON +parse, complete DAG acyclicity, ownership comparison against remediation-map. +Physical resource acceptance remains deferred by the user. From 30aecdfcc57f6c668e087a928d4899bb9afffe7b Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Sat, 31 Oct 2026 03:45:10 -0400 Subject: [PATCH 024/230] T12: Generate typed contracts and standalone boundary validators --- quality/evidence/T12.md | 93 + scripts/quality/contracts.mjs | 291 ++ tests/contracts/generated/manifest.json | 587 ++++ tests/contracts/generated/openapi.json | 2562 +++++++++++++++++ tests/quality/contracts.test.mjs | 122 + web/js/api/generated/package.json | 4 + web/js/api/generated/types.ts | 894 ++++++ web/js/api/generated/validators.d.mts | 60 + web/js/api/generated/validators.mjs | 55 + .../api/generated/validators/AuthRole.d.mts | 3 + web/js/api/generated/validators/AuthRole.mjs | 3 + .../validators/AuthVerifyAuthDisabled.d.mts | 3 + .../validators/AuthVerifyAuthDisabled.mjs | 3 + .../validators/AuthVerifyAuthenticated.d.mts | 3 + .../validators/AuthVerifyAuthenticated.mjs | 3 + .../generated/validators/AuthVerifyDemo.d.mts | 3 + .../generated/validators/AuthVerifyDemo.mjs | 3 + .../validators/AuthVerifyResponse.d.mts | 3 + .../validators/AuthVerifyResponse.mjs | 3 + .../generated/validators/Availability.d.mts | 3 + .../api/generated/validators/Availability.mjs | 3 + .../api/generated/validators/CameraUuid.d.mts | 3 + .../api/generated/validators/CameraUuid.mjs | 3 + .../generated/validators/ClientConfig.d.mts | 3 + .../api/generated/validators/ClientConfig.mjs | 3 + .../generated/validators/DetailStatus.d.mts | 3 + .../api/generated/validators/DetailStatus.mjs | 3 + .../generated/validators/DetectionModel.d.mts | 3 + .../generated/validators/DetectionModel.mjs | 3 + .../validators/DetectionModelsResponse.d.mts | 3 + .../validators/DetectionModelsResponse.mjs | 3 + .../generated/validators/DetectionUrl.d.mts | 3 + .../api/generated/validators/DetectionUrl.mjs | 3 + .../generated/validators/DetectionZone.d.mts | 3 + .../generated/validators/DetectionZone.mjs | 3 + .../generated/validators/EmptyString.d.mts | 3 + .../api/generated/validators/EmptyString.mjs | 3 + .../validators/EpochSecondsOrZero.d.mts | 3 + .../validators/EpochSecondsOrZero.mjs | 3 + .../validators/EptzConfigString.d.mts | 3 + .../generated/validators/EptzConfigString.mjs | 3 + .../generated/validators/EptzConfigV1.d.mts | 3 + .../api/generated/validators/EptzConfigV1.mjs | 3 + .../generated/validators/ErrorResponse.d.mts | 3 + .../generated/validators/ErrorResponse.mjs | 3 + .../validators/HourOfWeekSchedule.d.mts | 3 + .../validators/HourOfWeekSchedule.mjs | 3 + web/js/api/generated/validators/Int32.d.mts | 3 + web/js/api/generated/validators/Int32.mjs | 3 + .../validators/LegacyStreamList.d.mts | 3 + .../generated/validators/LegacyStreamList.mjs | 3 + .../validators/NullableClearableString.d.mts | 3 + .../validators/NullableClearableString.mjs | 3 + .../validators/PlaybackTransport.d.mts | 3 + .../validators/PlaybackTransport.mjs | 3 + .../generated/validators/PublishUrlList.d.mts | 3 + .../generated/validators/PublishUrlList.mjs | 3 + .../generated/validators/RetentionDays.d.mts | 3 + .../generated/validators/RetentionDays.mjs | 3 + .../generated/validators/StreamDetail.d.mts | 3 + .../api/generated/validators/StreamDetail.mjs | 3 + .../validators/StreamDetailBase.d.mts | 3 + .../generated/validators/StreamDetailBase.mjs | 3 + .../validators/StreamDetailConfigurable.d.mts | 3 + .../validators/StreamDetailConfigurable.mjs | 3 + .../validators/StreamDetailLiveOnly.d.mts | 3 + .../validators/StreamDetailLiveOnly.mjs | 3 + .../validators/StreamFullResponse.d.mts | 3 + .../validators/StreamFullResponse.mjs | 3 + .../StreamFullResponseConfigurable.d.mts | 3 + .../StreamFullResponseConfigurable.mjs | 3 + .../StreamFullResponseLiveOnly.d.mts | 3 + .../validators/StreamFullResponseLiveOnly.mjs | 3 + .../api/generated/validators/StreamName.d.mts | 3 + .../api/generated/validators/StreamName.mjs | 3 + .../validators/StreamPrivacyModeRequest.d.mts | 3 + .../validators/StreamPrivacyModeRequest.mjs | 3 + .../StreamPrivacyModeResponse.d.mts | 3 + .../validators/StreamPrivacyModeResponse.mjs | 3 + .../generated/validators/StreamProtocol.d.mts | 3 + .../generated/validators/StreamProtocol.mjs | 3 + .../validators/StreamSummaryAdmin.d.mts | 3 + .../validators/StreamSummaryAdmin.mjs | 3 + .../validators/StreamSummaryBase.d.mts | 3 + .../validators/StreamSummaryBase.mjs | 3 + .../validators/StreamSummaryLive.d.mts | 3 + .../validators/StreamSummaryLive.mjs | 3 + .../validators/StreamSummaryLpr.d.mts | 3 + .../generated/validators/StreamSummaryLpr.mjs | 3 + .../validators/StreamSummaryPageAdmin.d.mts | 3 + .../validators/StreamSummaryPageAdmin.mjs | 3 + .../validators/StreamSummaryPageLive.d.mts | 3 + .../validators/StreamSummaryPageLive.mjs | 3 + .../validators/StreamSummaryPageLpr.d.mts | 3 + .../validators/StreamSummaryPageLpr.mjs | 3 + .../validators/StreamUpdateAccepted.d.mts | 3 + .../validators/StreamUpdateAccepted.mjs | 3 + .../validators/StreamUpdateRequest.d.mts | 3 + .../validators/StreamUpdateRequest.mjs | 3 + .../SummaryForbiddenSensitiveKeys.d.mts | 3 + .../SummaryForbiddenSensitiveKeys.mjs | 3 + .../validators/SummaryPageMeta.d.mts | 3 + .../generated/validators/SummaryPageMeta.mjs | 3 + .../generated/validators/SummaryStatus.d.mts | 3 + .../generated/validators/SummaryStatus.mjs | 3 + .../validators/UrlWithoutQuerySecrets.d.mts | 3 + .../validators/UrlWithoutQuerySecrets.mjs | 3 + .../validators/UrlWithoutUserinfo.d.mts | 3 + .../validators/UrlWithoutUserinfo.mjs | 3 + .../generated/validators/ViewerSafeUrl.d.mts | 3 + .../generated/validators/ViewerSafeUrl.mjs | 3 + .../api/generated/validators/ZonePoint.d.mts | 3 + web/js/api/generated/validators/ZonePoint.mjs | 3 + .../generated/validators/ZonesResponse.d.mts | 3 + .../generated/validators/ZonesResponse.mjs | 3 + 115 files changed, 4986 insertions(+) create mode 100644 quality/evidence/T12.md create mode 100644 scripts/quality/contracts.mjs create mode 100644 tests/contracts/generated/manifest.json create mode 100644 tests/contracts/generated/openapi.json create mode 100644 tests/quality/contracts.test.mjs create mode 100644 web/js/api/generated/package.json create mode 100644 web/js/api/generated/types.ts create mode 100644 web/js/api/generated/validators.d.mts create mode 100644 web/js/api/generated/validators.mjs create mode 100644 web/js/api/generated/validators/AuthRole.d.mts create mode 100644 web/js/api/generated/validators/AuthRole.mjs create mode 100644 web/js/api/generated/validators/AuthVerifyAuthDisabled.d.mts create mode 100644 web/js/api/generated/validators/AuthVerifyAuthDisabled.mjs create mode 100644 web/js/api/generated/validators/AuthVerifyAuthenticated.d.mts create mode 100644 web/js/api/generated/validators/AuthVerifyAuthenticated.mjs create mode 100644 web/js/api/generated/validators/AuthVerifyDemo.d.mts create mode 100644 web/js/api/generated/validators/AuthVerifyDemo.mjs create mode 100644 web/js/api/generated/validators/AuthVerifyResponse.d.mts create mode 100644 web/js/api/generated/validators/AuthVerifyResponse.mjs create mode 100644 web/js/api/generated/validators/Availability.d.mts create mode 100644 web/js/api/generated/validators/Availability.mjs create mode 100644 web/js/api/generated/validators/CameraUuid.d.mts create mode 100644 web/js/api/generated/validators/CameraUuid.mjs create mode 100644 web/js/api/generated/validators/ClientConfig.d.mts create mode 100644 web/js/api/generated/validators/ClientConfig.mjs create mode 100644 web/js/api/generated/validators/DetailStatus.d.mts create mode 100644 web/js/api/generated/validators/DetailStatus.mjs create mode 100644 web/js/api/generated/validators/DetectionModel.d.mts create mode 100644 web/js/api/generated/validators/DetectionModel.mjs create mode 100644 web/js/api/generated/validators/DetectionModelsResponse.d.mts create mode 100644 web/js/api/generated/validators/DetectionModelsResponse.mjs create mode 100644 web/js/api/generated/validators/DetectionUrl.d.mts create mode 100644 web/js/api/generated/validators/DetectionUrl.mjs create mode 100644 web/js/api/generated/validators/DetectionZone.d.mts create mode 100644 web/js/api/generated/validators/DetectionZone.mjs create mode 100644 web/js/api/generated/validators/EmptyString.d.mts create mode 100644 web/js/api/generated/validators/EmptyString.mjs create mode 100644 web/js/api/generated/validators/EpochSecondsOrZero.d.mts create mode 100644 web/js/api/generated/validators/EpochSecondsOrZero.mjs create mode 100644 web/js/api/generated/validators/EptzConfigString.d.mts create mode 100644 web/js/api/generated/validators/EptzConfigString.mjs create mode 100644 web/js/api/generated/validators/EptzConfigV1.d.mts create mode 100644 web/js/api/generated/validators/EptzConfigV1.mjs create mode 100644 web/js/api/generated/validators/ErrorResponse.d.mts create mode 100644 web/js/api/generated/validators/ErrorResponse.mjs create mode 100644 web/js/api/generated/validators/HourOfWeekSchedule.d.mts create mode 100644 web/js/api/generated/validators/HourOfWeekSchedule.mjs create mode 100644 web/js/api/generated/validators/Int32.d.mts create mode 100644 web/js/api/generated/validators/Int32.mjs create mode 100644 web/js/api/generated/validators/LegacyStreamList.d.mts create mode 100644 web/js/api/generated/validators/LegacyStreamList.mjs create mode 100644 web/js/api/generated/validators/NullableClearableString.d.mts create mode 100644 web/js/api/generated/validators/NullableClearableString.mjs create mode 100644 web/js/api/generated/validators/PlaybackTransport.d.mts create mode 100644 web/js/api/generated/validators/PlaybackTransport.mjs create mode 100644 web/js/api/generated/validators/PublishUrlList.d.mts create mode 100644 web/js/api/generated/validators/PublishUrlList.mjs create mode 100644 web/js/api/generated/validators/RetentionDays.d.mts create mode 100644 web/js/api/generated/validators/RetentionDays.mjs create mode 100644 web/js/api/generated/validators/StreamDetail.d.mts create mode 100644 web/js/api/generated/validators/StreamDetail.mjs create mode 100644 web/js/api/generated/validators/StreamDetailBase.d.mts create mode 100644 web/js/api/generated/validators/StreamDetailBase.mjs create mode 100644 web/js/api/generated/validators/StreamDetailConfigurable.d.mts create mode 100644 web/js/api/generated/validators/StreamDetailConfigurable.mjs create mode 100644 web/js/api/generated/validators/StreamDetailLiveOnly.d.mts create mode 100644 web/js/api/generated/validators/StreamDetailLiveOnly.mjs create mode 100644 web/js/api/generated/validators/StreamFullResponse.d.mts create mode 100644 web/js/api/generated/validators/StreamFullResponse.mjs create mode 100644 web/js/api/generated/validators/StreamFullResponseConfigurable.d.mts create mode 100644 web/js/api/generated/validators/StreamFullResponseConfigurable.mjs create mode 100644 web/js/api/generated/validators/StreamFullResponseLiveOnly.d.mts create mode 100644 web/js/api/generated/validators/StreamFullResponseLiveOnly.mjs create mode 100644 web/js/api/generated/validators/StreamName.d.mts create mode 100644 web/js/api/generated/validators/StreamName.mjs create mode 100644 web/js/api/generated/validators/StreamPrivacyModeRequest.d.mts create mode 100644 web/js/api/generated/validators/StreamPrivacyModeRequest.mjs create mode 100644 web/js/api/generated/validators/StreamPrivacyModeResponse.d.mts create mode 100644 web/js/api/generated/validators/StreamPrivacyModeResponse.mjs create mode 100644 web/js/api/generated/validators/StreamProtocol.d.mts create mode 100644 web/js/api/generated/validators/StreamProtocol.mjs create mode 100644 web/js/api/generated/validators/StreamSummaryAdmin.d.mts create mode 100644 web/js/api/generated/validators/StreamSummaryAdmin.mjs create mode 100644 web/js/api/generated/validators/StreamSummaryBase.d.mts create mode 100644 web/js/api/generated/validators/StreamSummaryBase.mjs create mode 100644 web/js/api/generated/validators/StreamSummaryLive.d.mts create mode 100644 web/js/api/generated/validators/StreamSummaryLive.mjs create mode 100644 web/js/api/generated/validators/StreamSummaryLpr.d.mts create mode 100644 web/js/api/generated/validators/StreamSummaryLpr.mjs create mode 100644 web/js/api/generated/validators/StreamSummaryPageAdmin.d.mts create mode 100644 web/js/api/generated/validators/StreamSummaryPageAdmin.mjs create mode 100644 web/js/api/generated/validators/StreamSummaryPageLive.d.mts create mode 100644 web/js/api/generated/validators/StreamSummaryPageLive.mjs create mode 100644 web/js/api/generated/validators/StreamSummaryPageLpr.d.mts create mode 100644 web/js/api/generated/validators/StreamSummaryPageLpr.mjs create mode 100644 web/js/api/generated/validators/StreamUpdateAccepted.d.mts create mode 100644 web/js/api/generated/validators/StreamUpdateAccepted.mjs create mode 100644 web/js/api/generated/validators/StreamUpdateRequest.d.mts create mode 100644 web/js/api/generated/validators/StreamUpdateRequest.mjs create mode 100644 web/js/api/generated/validators/SummaryForbiddenSensitiveKeys.d.mts create mode 100644 web/js/api/generated/validators/SummaryForbiddenSensitiveKeys.mjs create mode 100644 web/js/api/generated/validators/SummaryPageMeta.d.mts create mode 100644 web/js/api/generated/validators/SummaryPageMeta.mjs create mode 100644 web/js/api/generated/validators/SummaryStatus.d.mts create mode 100644 web/js/api/generated/validators/SummaryStatus.mjs create mode 100644 web/js/api/generated/validators/UrlWithoutQuerySecrets.d.mts create mode 100644 web/js/api/generated/validators/UrlWithoutQuerySecrets.mjs create mode 100644 web/js/api/generated/validators/UrlWithoutUserinfo.d.mts create mode 100644 web/js/api/generated/validators/UrlWithoutUserinfo.mjs create mode 100644 web/js/api/generated/validators/ViewerSafeUrl.d.mts create mode 100644 web/js/api/generated/validators/ViewerSafeUrl.mjs create mode 100644 web/js/api/generated/validators/ZonePoint.d.mts create mode 100644 web/js/api/generated/validators/ZonePoint.mjs create mode 100644 web/js/api/generated/validators/ZonesResponse.d.mts create mode 100644 web/js/api/generated/validators/ZonesResponse.mjs diff --git a/quality/evidence/T12.md b/quality/evidence/T12.md new file mode 100644 index 000000000..962195607 --- /dev/null +++ b/quality/evidence/T12.md @@ -0,0 +1,93 @@ +# T12: Deterministic contract generation and boundary validation + +Implemented on T8 `17de8155` using the pinned root-only generator dependencies. +No package changes, application imports, server changes, or shared Vite builds. + +## RED → GREEN + +The worker wrote `tests/quality/contracts.test.mjs` before the generator. +`node --test tests/quality/contracts.test.mjs` first failed with +ERR_MODULE_NOT_FOUND for scripts/quality/contracts.mjs. The final suite passes +12 tests. It validates every one of T11's 91 hand-reviewed fixtures, rather than +snapshotting the generated implementation. Tests also prove sensitive-key +omission is compatible, credential leaks fail, additive response fields are +permitted, closed request bodies reject drift, UTF-8 limits differ from character +counts, and malformed/wrong embedded JSON cannot pass. + +The suite proves deterministic generation, read-only stale/missing/unexpected +file checks, detection of git-untracked expected files, rejection of local +traversal/remote/unresolved refs, status/header/role-selector preservation, and +that importing one boundary does not retain all validators. + +An initial test's textual `require(` ban was refined to distinguish executable +calls from Ajv's inert helper `.code = 'require(...)'` metadata string. Both the +actual ESM runtime import and browser bundling succeed without a require global. +No runtime call or external compiler import is allowed. + +## Generation and checks + +- `node scripts/quality/contracts.mjs --generate`: generates 112 files. +- `node scripts/quality/contracts.mjs --check`: generates in a temporary + directory, compares bytes, checks extra files and git-untracked outputs, and + leaves checkout artifacts unchanged. Initially failed on untracked outputs as + intended; passes after reviewing/staging the generated files. +- `npm --prefix web run typecheck`: passes with generated OpenAPI TS types. +- `web/node_modules/.bin/tsc --strict --noEmit --moduleResolution bundler + --module esnext --target es2022 web/js/api/generated/validators.d.mts`: passes, + validating the declaration surface and its schema type references. + +Raw RED/GREEN, generation, typecheck and bundle-size evidence is retained under +ignored `build/eng-artifacts/T12/`. + +## Design and consumption + +`loadContract` resolves every reference from local YAML under docs/api, rejects +remote/traversal refs, verifies the OpenAPI dialect, detects duplicate component +names, and canonically merges components. This preserves named types and avoids +the invalid response-path indexing produced by generic ref-parser bundling. +The full canonical OpenAPI document and operation/status/header/role-selection +manifest are test-only files in `tests/contracts/generated/`. They must not be +imported into browser code. + +Runtime validators are minified browser ESM, compiled with Ajv2020 strict schema +checking and formats. Standalone code enforces JSON-in-string contentSchema +(nonempty eptz_config) and explicitly annotated UTF-8 byte limits; empty + eptz_config retains its documented disabled meaning. Annotation-only byte limits +are not confused with JSON Schema's Unicode-code-point maxLength. Runtime source +omits schema descriptions/source metadata. Neither Ajv nor the generator is a +browser dependency. Header/status and role-selection metadata remains available +for independent T18/typed-client checks; schema validity alone does not prove +server authorization or side effects. + +Import a named boundary, for example: + +```ts +import { validateClientConfig } from './api/generated/validators.mjs'; +``` + +Each validator has a corresponding type guard accepting unknown and exposes +structured validation errors. The generated .mjs implementations are compiler +output, paired with strict .d.mts declarations; they are not unchecked handwritten +application escape hatches. T34 should inventory this narrow generated-code +exception separately from remaining legacy JS. + +Ajv's function-property assignments prevented useful tree shaking when all +validators lived in one module. The final generator creates one module per +schema plus a named-export index and generated sideEffects:false package marker. +The marker applies only to generated validators, whose top-level operations +initialize private functions. Avoid namespace-importing all validators in app +code. No handwritten implementation is excluded by this marker. + +Measured isolated esbuild browser imports (minified / gzip bytes): + +| Import | Minified | Gzip | +| --- | ---: | ---: | +| validateClientConfig | 8,488 | 1,608 | +| validateStreamFullResponseLiveOnly | 49,525 | 7,014 | +| validateStreamUpdateRequest | 37,013 | 5,266 | +| all validators (test-only comparison) | 696,523 | 79,158 | + +These are isolated boundary measurements, not final shipped asset budgets. +Application consumers are not yet wired; T24/T35 must measure actual combined +bundles. T18 must still test the real C handlers, redaction and side effects. +No finding or scanner gap is waived by these schema checks. diff --git a/scripts/quality/contracts.mjs b/scripts/quality/contracts.mjs new file mode 100644 index 000000000..0d9f21abf --- /dev/null +++ b/scripts/quality/contracts.mjs @@ -0,0 +1,291 @@ +#!/usr/bin/env node +// SPDX-License-Identifier: GPL-3.0-or-later +// Deterministic OpenAPI 3.1 types and standalone external-boundary validators. +import fs from 'node:fs/promises'; +import path from 'node:path'; +import os from 'node:os'; +import { createHash } from 'node:crypto'; +import { fileURLToPath } from 'node:url'; +import { spawnSync } from 'node:child_process'; +import YAML from 'yaml'; +import openapiTS, { astToString } from 'openapi-typescript'; +import Ajv2020 from 'ajv/dist/2020.js'; +import addFormats from 'ajv-formats'; +import standaloneCode from 'ajv/dist/standalone/index.js'; +import { _ } from 'ajv/dist/compile/codegen/index.js'; +import { build } from 'esbuild'; + +const GENERATED_DIRS = ['web/js/api/generated', 'tests/contracts/generated']; +const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../..'); +const HEADER = '// SPDX-License-Identifier: GPL-3.0-or-later\n// Generated by scripts/quality/contracts.mjs; do not edit.\n'; +const METHODS = new Set(['get','put','post','delete','patch','options','head','trace']); +const pointerTokens = fragment => decodeURIComponent(fragment).replace(/^\//, '').split('/').map(x => x.replace(/~1/g,'/').replace(/~0/g,'~')); +const pointerEscape = token => token.replace(/~/g,'~0').replace(/\//g,'~1'); +const digest = text => createHash('sha256').update(text).digest('hex'); +const inside = (base, file) => file === base || file.startsWith(base + path.sep); + +/** Only local refs inside docs/api are allowed; resolve every ref, even annotations. */ +export async function loadContract(root = ROOT) { + const base = await fs.realpath(path.join(root, 'docs/api')); + const entry = path.join(base, 'openapi.yaml'); + const documents = new Map(); + const sources = {}; + async function read(file) { + if (!inside(base,file)) throw Error(`Contract ref escapes docs/api: ${file}`); + const real = await fs.realpath(file); + if (!inside(base,real)) throw Error(`Contract symlink escapes docs/api: ${file}`); + if (documents.has(file)) return documents.get(file); + const text = await fs.readFile(file, 'utf8'); + const doc = YAML.parse(text, { uniqueKeys: true }); + if (!doc || typeof doc !== 'object') throw Error(`Invalid contract document: ${file}`); + documents.set(file,doc); + sources[path.relative(root,file).split(path.sep).join('/')] = digest(text); + await visit(doc,file); + return doc; + } + async function resolve(ref, file) { + if (typeof ref !== 'string' || /^(?:[a-z][a-z0-9+.-]*:|\/)/i.test(ref)) throw Error(`Only local contract refs are allowed: ${ref}`); + const index = ref.indexOf('#'); + const targetPath = index < 0 ? ref : ref.slice(0,index); + const fragment = index < 0 ? '' : ref.slice(index+1); + if (fragment && !fragment.startsWith('/')) throw Error(`Unsupported non-pointer ref: ${ref}`); + const targetFile = targetPath ? path.resolve(path.dirname(file),decodeURIComponent(targetPath)) : file; + let target = await read(targetFile); + const tokens = fragment ? pointerTokens(fragment) : []; + for (const token of tokens) { + if (!target || typeof target !== 'object' || !Object.hasOwn(target,token)) throw Error(`Unresolved ref ${ref} in ${file}`); + target=target[token]; + } + return { target, targetFile, tokens }; + } + async function visit(value,file) { + if (!value || typeof value !== 'object') return; + if (Object.hasOwn(value,'$ref')) await resolve(value.$ref,file); + for (const child of Object.values(value)) await visit(child,file); + } + const document = await read(entry); + if (!/^3\.1\./.test(document.openapi ?? '')) throw Error('OpenAPI 3.1 is required'); + if (document.jsonSchemaDialect !== 'https://spec.openapis.org/oas/3.1/dialect/base') throw Error('Unexpected OpenAPI schema dialect'); + async function normalize(value,file,chain = new Set()) { + if (Array.isArray(value)) return Promise.all(value.map(x=>normalize(x,file,chain))); + if (!value || typeof value !== 'object') return value; + const result = {}; + for (const [key,child] of Object.entries(value)) { + if (key !== '$ref') { result[key] = await normalize(child,file,chain); continue; } + const { target,targetFile,tokens } = await resolve(child,file); + if (tokens[0] === 'components' && tokens.length >= 3) { + result.$ref = '#/' + tokens.map(pointerEscape).join('/'); + } else if (tokens[0] === 'paths' && tokens.length === 2) { + const identity=targetFile+'#'+tokens.join('/'); + if(chain.has(identity)) throw Error(`Cyclic Path Item ref: ${child}`); + Object.assign(result,await normalize(target,targetFile,new Set([...chain,identity]))); + } else throw Error(`Ref must target components or a Path Item: ${child}`); + } + return result; + } + const contract = await normalize(document,entry); + contract.components = {}; + for (const [file,doc] of [...documents].sort(([a],[b])=>a.localeCompare(b))) { + for (const [kind,entries] of Object.entries(doc.components ?? {})) { + if (kind.startsWith('x-')) continue; + contract.components[kind] ??= {}; + for (const [name,value] of Object.entries(entries)) { + if (Object.hasOwn(contract.components[kind],name)) throw Error(`Duplicate component ${kind}/${name}`); + contract.components[kind][name]=await normalize(value,file); + } + } + } + if (!Object.keys(contract.paths ?? {}).length || !Object.keys(contract.components.schemas ?? {}).length) throw Error('Empty contract'); + return { contract, sources: Object.fromEntries(Object.entries(sources).sort()) }; +} + +function makeAjv(schemas) { + const ajv = new Ajv2020({ strictSchema:true, strictTypes:false, strictRequired:false, inlineRefs:false, code:{ source:true, esm:true }, allErrors:false }); + addFormats(ajv); + const annotations=new Set(); + const collect=x=>{if(x&&typeof x==='object'){for(const [key,value] of Object.entries(x)){if(key.startsWith('x-'))annotations.add(key); collect(value);}}}; + collect(schemas); + annotations.delete('x-lightnvr-max-bytes'); + for(const keyword of annotations)ajv.addKeyword({keyword,valid:true}); + ajv.addKeyword({ keyword:'x-lightnvr-max-bytes', type:'string', schemaType:'number', + error:{message:'must fit the UTF-8 byte limit'}, + code(cxt){cxt.fail(_`new TextEncoder().encode(${cxt.data}).byteLength > ${cxt.schemaCode}`);} + }); + // JSON Schema treats contentSchema as annotation. This boundary contract + // explicitly enforces it, except the documented disabled empty string. + ajv.removeKeyword('contentSchema'); + ajv.addKeyword({ keyword:'contentSchema', type:'string', schemaType:['object','boolean'], + error:{message:'must contain valid JSON matching contentSchema (or be empty)'}, + code(cxt){ + const {gen,data}=cxt; + gen.if(_`${data} !== ""`,()=>{ + const decoded=gen.let('decoded'); + const parsed=gen.let('parsed',true); + gen.try(()=>gen.assign(decoded,_`JSON.parse(${data})`),()=>gen.assign(parsed,false)); + gen.if(parsed,()=>{ + const valid=gen.name('contentValid'); + cxt.subschema({keyword:'contentSchema',data:decoded},valid); + gen.assign(parsed,valid); + }); + cxt.pass(parsed); + }); + } + }); + return ajv; +} + +// Keep human/source documentation in the OpenAPI artifact and TS output, not +// in shipped validators. Map-valued schema keywords preserve property names. +function runtimeSchema(value, map = false) { + if (Array.isArray(value)) return value.map(x=>runtimeSchema(x)); + if (!value || typeof value !== 'object') return value; + const output={}; + for (const [key,child] of Object.entries(value)) { + if (!map && (['title','description','examples','example','deprecated','default','readOnly','writeOnly','externalDocs','xml'].includes(key) || (key.startsWith('x-') && key!=='x-lightnvr-max-bytes'))) continue; + if (!map && ['const','enum','required','dependentRequired'].includes(key)) { output[key]=child; continue; } + output[key]=runtimeSchema(child,!map && ['properties','patternProperties','$defs','definitions','dependentSchemas'].includes(key)); + } + return output; +} + +function schemaRefToId(value) { + if(Array.isArray(value)) return value.map(schemaRefToId); + if(!value || typeof value!=='object') return value; + return Object.fromEntries(Object.entries(value).map(([key,child])=>{ + if(key==='$ref') { + const prefix='#/components/schemas/'; + if(typeof child!=='string'||!child.startsWith(prefix))throw Error(`Non-schema ref in schema: ${child}`); + const tokens=pointerTokens(child.slice(1)); + return [key,`urn:lightnvr:contract:${tokens[2]}`+(tokens.length>3?'#/'+tokens.slice(3).map(pointerEscape).join('/'):'')]; + } + return [key,schemaRefToId(child)]; + })); +} + +async function validateFixtures(root, ajv) { + const folder=path.join(root,'tests/contracts/fixtures/streams'); + const manifest=JSON.parse(await fs.readFile(path.join(folder,'index.json'),'utf8')); + if(!manifest.fixtures?.length)throw Error('No contract fixtures selected'); + const seen=new Set(); + for(const entry of manifest.fixtures) { + if(seen.has(entry.file) || path.basename(entry.file)!==entry.file)throw Error(`Invalid fixture path: ${entry.file}`); + seen.add(entry.file); + const fixture=JSON.parse(await fs.readFile(path.join(folder,entry.file),'utf8')); + if(fixture.schema!==entry.schema || fixture.expect!==entry.expect || !['valid','invalid'].includes(entry.expect)) throw Error(`Fixture metadata mismatch: ${entry.file}`); + const name=entry.schema.split('/').at(-1); + const validate=ajv.getSchema('urn:lightnvr:contract:'+name); + if(!validate)throw Error(`Unknown fixture schema: ${entry.schema}`); + const valid=validate(fixture.body); + if(valid!==(entry.expect==='valid'))throw Error(`Fixture expectation failed: ${entry.file}: ${JSON.stringify(validate.errors)}`); + } + return seen.size; +} + +export async function buildArtifacts({root=ROOT}={}) { + const {contract,sources}=await loadContract(root); + const schemas=contract.components.schemas; + const names=Object.keys(schemas).sort(); + if(names.some(x=>!/^[$A-Z_a-z][$\w]*$/.test(x)))throw Error('Schema names must be JS identifiers'); + const ajv=makeAjv(schemas); + for(const name of names) { + const schema=schemaRefToId(runtimeSchema(schemas[name])); + ajv.addSchema({...schema,$id:'urn:lightnvr:contract:'+name}); + } + const exports={}; + for(const name of names) { + const id='urn:lightnvr:contract:'+name; + ajv.getSchema(id); // Compile every schema, including those without fixtures. + exports['validate'+name]=id; + } + const fixtureCount=await validateFixtures(root,ajv); + // Separate modules let consumers import one boundary without retaining every + // Ajv validator's function-property assignments. The generated package marker + // declares these modules side-effect-free outside their exported functions. + const modules={}; + for(const name of names) { + const standalone=standaloneCode(ajv,{['validate'+name]:exports['validate'+name]}); + const bundle=await build({stdin:{contents:standalone,resolveDir:ROOT,sourcefile:'validators.generated.mjs'},bundle:true,write:false,format:'esm',platform:'browser',target:'es2020',minify:true,legalComments:'none'}); + const runtime=HEADER+bundle.outputFiles[0].text; + // Ajv helper metadata contains an inert require(...) string; executable + // require calls would break browser/ESM loading and must not remain. + if (/(?`export { validate${name} } from './validators/${name}.mjs';`).join('\n')+'\n'; + const types=HEADER+astToString(await openapiTS(contract,{alphabetize:true})); + const declaration=HEADER+`import type { components } from './types.js';\n\nexport interface ValidationIssue { readonly instancePath: string; readonly schemaPath: string; readonly keyword: string; readonly params: Readonly>; readonly message?: string; }\nexport interface ContractValidator { (data: unknown): data is T; errors?: readonly ValidationIssue[] | null; }\n\n`+names.map(name=>`export const validate${name}: ContractValidator;`).join('\n')+'\n'; + const operations={}; + for(const [url,item] of Object.entries(contract.paths)) { + for(const [method,operation] of Object.entries(item)) { + if(!METHODS.has(method))continue; + if(!operation.operationId || operations[operation.operationId])throw Error('Missing/duplicate operationId'); + operations[operation.operationId]={method:method.toUpperCase(),path:url,success_statuses:Object.keys(operation.responses).map(Number).filter(x=>x>=200&&x<300).sort((a,b)=>a-b),responses:operation.responses,...(operation['x-lightnvr-response-variant-by-field']?{variant_by_field:operation['x-lightnvr-response-variant-by-field']}:{}) ,...(operation['x-lightnvr-response-variant-by-query']?{variant_by_query:operation['x-lightnvr-response-variant-by-query']}:{})}; + } + } + const artifacts={ + 'web/js/api/generated/types.ts':types, + 'web/js/api/generated/validators.mjs':runtime, + 'web/js/api/generated/validators.d.mts':declaration, + 'tests/contracts/generated/openapi.json':JSON.stringify(contract,null,2)+'\n', + 'tests/contracts/generated/manifest.json':'', + 'web/js/api/generated/package.json':JSON.stringify({type:'module',sideEffects:false},null,2)+'\n', + ...modules, + }; + artifacts['tests/contracts/generated/manifest.json']=JSON.stringify({schema_version:1,sources,fixture_count:fixtureCount,owned_files:Object.keys(artifacts).sort(),schemas:Object.fromEntries(names.map(name=>[name,{validator:'validate'+name}])),operations},null,2)+'\n'; + return artifacts; +} + +export async function writeArtifacts(root,artifacts) { + for(const [name,text] of Object.entries(artifacts)) { + const target=path.join(root,name); + await fs.mkdir(path.dirname(target),{recursive:true}); + await fs.writeFile(target,text); + } +} + +async function filesUnder(root,relative) { + const files=[]; + async function walk(dir) { + let entries; + try {entries=await fs.readdir(path.join(root,dir),{withFileTypes:true});} catch(error){if(error.code==='ENOENT')return;throw error;} + for(const entry of entries) { + const name=dir+'/'+entry.name; + if(entry.isDirectory())await walk(name);else files.push(name); + } + } + await walk(relative); + return files; +} + +export async function checkArtifacts(root,artifacts) { + const errors=[]; + for(const [name,text] of Object.entries(artifacts)) { + try{if(await fs.readFile(path.join(root,name),'utf8')!==text)errors.push(`stale generated file: ${name}`);} + catch(error){if(error.code==='ENOENT')errors.push(`missing generated file: ${name}`);else throw error;} + } + for(const dir of GENERATED_DIRS)for(const name of await filesUnder(root,dir))if(!Object.hasOwn(artifacts,name))errors.push(`unexpected generated file: ${name}`); + const git=spawnSync('git',['ls-files','--others','--exclude-standard','--',...GENERATED_DIRS],{cwd:root,encoding:'utf8'}); + if(git.status===0)for(const file of git.stdout.trim().split('\n').filter(Boolean))errors.push(`untracked generated file: ${file}`); + return errors; +} + +async function main() { + const args=process.argv.slice(2); + if(args.length!==1 || !['--generate','--check'].includes(args[0]))throw Error('Usage: node scripts/quality/contracts.mjs --generate|--check'); + const artifacts=await buildArtifacts(); + if(args[0]==='--generate') { + await writeArtifacts(ROOT,artifacts); + console.log(`Generated ${Object.keys(artifacts).length} contract artifacts; review and stage all generated paths before --check.`); + } else { + const temporary=await fs.mkdtemp(path.join(os.tmpdir(),'lightnvr-contract-check-')); + try { + await writeArtifacts(temporary,artifacts); + const fresh=Object.fromEntries(await Promise.all(Object.keys(artifacts).map(async name=>[name,await fs.readFile(path.join(temporary,name),'utf8')]))); + const errors=await checkArtifacts(ROOT,fresh); + if(errors.length)throw Error(errors.join('\n')); + console.log(`Contract artifacts match (${Object.keys(artifacts).length} files).`); + } finally {await fs.rm(temporary,{recursive:true,force:true});} + } +} +if(process.argv[1] && path.resolve(process.argv[1])===fileURLToPath(import.meta.url))main().catch(error=>{console.error(error.message);process.exitCode=1;}); diff --git a/tests/contracts/generated/manifest.json b/tests/contracts/generated/manifest.json new file mode 100644 index 000000000..438bfc551 --- /dev/null +++ b/tests/contracts/generated/manifest.json @@ -0,0 +1,587 @@ +{ + "schema_version": 1, + "sources": { + "docs/api/contracts/common.yaml": "d27f06e8386787dc45af712953ec87010c879632ab3c7d6318d0395bfe0604ce", + "docs/api/contracts/streams.yaml": "e18c04335cd5270655319dd5d4eec423d47f2a5aa0169c92ac376c46b08dae5a", + "docs/api/openapi.yaml": "9a24e4288717257c7f83f92105c0c491d91f2673fad434f7f76489efbaa36cf4" + }, + "fixture_count": 91, + "owned_files": [ + "tests/contracts/generated/manifest.json", + "tests/contracts/generated/openapi.json", + "web/js/api/generated/package.json", + "web/js/api/generated/types.ts", + "web/js/api/generated/validators.d.mts", + "web/js/api/generated/validators.mjs", + "web/js/api/generated/validators/AuthRole.d.mts", + "web/js/api/generated/validators/AuthRole.mjs", + "web/js/api/generated/validators/AuthVerifyAuthDisabled.d.mts", + "web/js/api/generated/validators/AuthVerifyAuthDisabled.mjs", + "web/js/api/generated/validators/AuthVerifyAuthenticated.d.mts", + "web/js/api/generated/validators/AuthVerifyAuthenticated.mjs", + "web/js/api/generated/validators/AuthVerifyDemo.d.mts", + "web/js/api/generated/validators/AuthVerifyDemo.mjs", + "web/js/api/generated/validators/AuthVerifyResponse.d.mts", + "web/js/api/generated/validators/AuthVerifyResponse.mjs", + "web/js/api/generated/validators/Availability.d.mts", + "web/js/api/generated/validators/Availability.mjs", + "web/js/api/generated/validators/CameraUuid.d.mts", + "web/js/api/generated/validators/CameraUuid.mjs", + "web/js/api/generated/validators/ClientConfig.d.mts", + "web/js/api/generated/validators/ClientConfig.mjs", + "web/js/api/generated/validators/DetailStatus.d.mts", + "web/js/api/generated/validators/DetailStatus.mjs", + "web/js/api/generated/validators/DetectionModel.d.mts", + "web/js/api/generated/validators/DetectionModel.mjs", + "web/js/api/generated/validators/DetectionModelsResponse.d.mts", + "web/js/api/generated/validators/DetectionModelsResponse.mjs", + "web/js/api/generated/validators/DetectionUrl.d.mts", + "web/js/api/generated/validators/DetectionUrl.mjs", + "web/js/api/generated/validators/DetectionZone.d.mts", + "web/js/api/generated/validators/DetectionZone.mjs", + "web/js/api/generated/validators/EmptyString.d.mts", + "web/js/api/generated/validators/EmptyString.mjs", + "web/js/api/generated/validators/EpochSecondsOrZero.d.mts", + "web/js/api/generated/validators/EpochSecondsOrZero.mjs", + "web/js/api/generated/validators/EptzConfigString.d.mts", + "web/js/api/generated/validators/EptzConfigString.mjs", + "web/js/api/generated/validators/EptzConfigV1.d.mts", + "web/js/api/generated/validators/EptzConfigV1.mjs", + "web/js/api/generated/validators/ErrorResponse.d.mts", + "web/js/api/generated/validators/ErrorResponse.mjs", + "web/js/api/generated/validators/HourOfWeekSchedule.d.mts", + "web/js/api/generated/validators/HourOfWeekSchedule.mjs", + "web/js/api/generated/validators/Int32.d.mts", + "web/js/api/generated/validators/Int32.mjs", + "web/js/api/generated/validators/LegacyStreamList.d.mts", + "web/js/api/generated/validators/LegacyStreamList.mjs", + "web/js/api/generated/validators/NullableClearableString.d.mts", + "web/js/api/generated/validators/NullableClearableString.mjs", + "web/js/api/generated/validators/PlaybackTransport.d.mts", + "web/js/api/generated/validators/PlaybackTransport.mjs", + "web/js/api/generated/validators/PublishUrlList.d.mts", + "web/js/api/generated/validators/PublishUrlList.mjs", + "web/js/api/generated/validators/RetentionDays.d.mts", + "web/js/api/generated/validators/RetentionDays.mjs", + "web/js/api/generated/validators/StreamDetail.d.mts", + "web/js/api/generated/validators/StreamDetail.mjs", + "web/js/api/generated/validators/StreamDetailBase.d.mts", + "web/js/api/generated/validators/StreamDetailBase.mjs", + "web/js/api/generated/validators/StreamDetailConfigurable.d.mts", + "web/js/api/generated/validators/StreamDetailConfigurable.mjs", + "web/js/api/generated/validators/StreamDetailLiveOnly.d.mts", + "web/js/api/generated/validators/StreamDetailLiveOnly.mjs", + "web/js/api/generated/validators/StreamFullResponse.d.mts", + "web/js/api/generated/validators/StreamFullResponse.mjs", + "web/js/api/generated/validators/StreamFullResponseConfigurable.d.mts", + "web/js/api/generated/validators/StreamFullResponseConfigurable.mjs", + "web/js/api/generated/validators/StreamFullResponseLiveOnly.d.mts", + "web/js/api/generated/validators/StreamFullResponseLiveOnly.mjs", + "web/js/api/generated/validators/StreamName.d.mts", + "web/js/api/generated/validators/StreamName.mjs", + "web/js/api/generated/validators/StreamPrivacyModeRequest.d.mts", + "web/js/api/generated/validators/StreamPrivacyModeRequest.mjs", + "web/js/api/generated/validators/StreamPrivacyModeResponse.d.mts", + "web/js/api/generated/validators/StreamPrivacyModeResponse.mjs", + "web/js/api/generated/validators/StreamProtocol.d.mts", + "web/js/api/generated/validators/StreamProtocol.mjs", + "web/js/api/generated/validators/StreamSummaryAdmin.d.mts", + "web/js/api/generated/validators/StreamSummaryAdmin.mjs", + "web/js/api/generated/validators/StreamSummaryBase.d.mts", + "web/js/api/generated/validators/StreamSummaryBase.mjs", + "web/js/api/generated/validators/StreamSummaryLive.d.mts", + "web/js/api/generated/validators/StreamSummaryLive.mjs", + "web/js/api/generated/validators/StreamSummaryLpr.d.mts", + "web/js/api/generated/validators/StreamSummaryLpr.mjs", + "web/js/api/generated/validators/StreamSummaryPageAdmin.d.mts", + "web/js/api/generated/validators/StreamSummaryPageAdmin.mjs", + "web/js/api/generated/validators/StreamSummaryPageLive.d.mts", + "web/js/api/generated/validators/StreamSummaryPageLive.mjs", + "web/js/api/generated/validators/StreamSummaryPageLpr.d.mts", + "web/js/api/generated/validators/StreamSummaryPageLpr.mjs", + "web/js/api/generated/validators/StreamUpdateAccepted.d.mts", + "web/js/api/generated/validators/StreamUpdateAccepted.mjs", + "web/js/api/generated/validators/StreamUpdateRequest.d.mts", + "web/js/api/generated/validators/StreamUpdateRequest.mjs", + "web/js/api/generated/validators/SummaryForbiddenSensitiveKeys.d.mts", + "web/js/api/generated/validators/SummaryForbiddenSensitiveKeys.mjs", + "web/js/api/generated/validators/SummaryPageMeta.d.mts", + "web/js/api/generated/validators/SummaryPageMeta.mjs", + "web/js/api/generated/validators/SummaryStatus.d.mts", + "web/js/api/generated/validators/SummaryStatus.mjs", + "web/js/api/generated/validators/UrlWithoutQuerySecrets.d.mts", + "web/js/api/generated/validators/UrlWithoutQuerySecrets.mjs", + "web/js/api/generated/validators/UrlWithoutUserinfo.d.mts", + "web/js/api/generated/validators/UrlWithoutUserinfo.mjs", + "web/js/api/generated/validators/ViewerSafeUrl.d.mts", + "web/js/api/generated/validators/ViewerSafeUrl.mjs", + "web/js/api/generated/validators/ZonePoint.d.mts", + "web/js/api/generated/validators/ZonePoint.mjs", + "web/js/api/generated/validators/ZonesResponse.d.mts", + "web/js/api/generated/validators/ZonesResponse.mjs" + ], + "schemas": { + "AuthRole": { + "validator": "validateAuthRole" + }, + "AuthVerifyAuthDisabled": { + "validator": "validateAuthVerifyAuthDisabled" + }, + "AuthVerifyAuthenticated": { + "validator": "validateAuthVerifyAuthenticated" + }, + "AuthVerifyDemo": { + "validator": "validateAuthVerifyDemo" + }, + "AuthVerifyResponse": { + "validator": "validateAuthVerifyResponse" + }, + "Availability": { + "validator": "validateAvailability" + }, + "CameraUuid": { + "validator": "validateCameraUuid" + }, + "ClientConfig": { + "validator": "validateClientConfig" + }, + "DetailStatus": { + "validator": "validateDetailStatus" + }, + "DetectionModel": { + "validator": "validateDetectionModel" + }, + "DetectionModelsResponse": { + "validator": "validateDetectionModelsResponse" + }, + "DetectionUrl": { + "validator": "validateDetectionUrl" + }, + "DetectionZone": { + "validator": "validateDetectionZone" + }, + "EmptyString": { + "validator": "validateEmptyString" + }, + "EpochSecondsOrZero": { + "validator": "validateEpochSecondsOrZero" + }, + "EptzConfigString": { + "validator": "validateEptzConfigString" + }, + "EptzConfigV1": { + "validator": "validateEptzConfigV1" + }, + "ErrorResponse": { + "validator": "validateErrorResponse" + }, + "HourOfWeekSchedule": { + "validator": "validateHourOfWeekSchedule" + }, + "Int32": { + "validator": "validateInt32" + }, + "LegacyStreamList": { + "validator": "validateLegacyStreamList" + }, + "NullableClearableString": { + "validator": "validateNullableClearableString" + }, + "PlaybackTransport": { + "validator": "validatePlaybackTransport" + }, + "PublishUrlList": { + "validator": "validatePublishUrlList" + }, + "RetentionDays": { + "validator": "validateRetentionDays" + }, + "StreamDetail": { + "validator": "validateStreamDetail" + }, + "StreamDetailBase": { + "validator": "validateStreamDetailBase" + }, + "StreamDetailConfigurable": { + "validator": "validateStreamDetailConfigurable" + }, + "StreamDetailLiveOnly": { + "validator": "validateStreamDetailLiveOnly" + }, + "StreamFullResponse": { + "validator": "validateStreamFullResponse" + }, + "StreamFullResponseConfigurable": { + "validator": "validateStreamFullResponseConfigurable" + }, + "StreamFullResponseLiveOnly": { + "validator": "validateStreamFullResponseLiveOnly" + }, + "StreamName": { + "validator": "validateStreamName" + }, + "StreamPrivacyModeRequest": { + "validator": "validateStreamPrivacyModeRequest" + }, + "StreamPrivacyModeResponse": { + "validator": "validateStreamPrivacyModeResponse" + }, + "StreamProtocol": { + "validator": "validateStreamProtocol" + }, + "StreamSummaryAdmin": { + "validator": "validateStreamSummaryAdmin" + }, + "StreamSummaryBase": { + "validator": "validateStreamSummaryBase" + }, + "StreamSummaryLive": { + "validator": "validateStreamSummaryLive" + }, + "StreamSummaryLpr": { + "validator": "validateStreamSummaryLpr" + }, + "StreamSummaryPageAdmin": { + "validator": "validateStreamSummaryPageAdmin" + }, + "StreamSummaryPageLive": { + "validator": "validateStreamSummaryPageLive" + }, + "StreamSummaryPageLpr": { + "validator": "validateStreamSummaryPageLpr" + }, + "StreamUpdateAccepted": { + "validator": "validateStreamUpdateAccepted" + }, + "StreamUpdateRequest": { + "validator": "validateStreamUpdateRequest" + }, + "SummaryForbiddenSensitiveKeys": { + "validator": "validateSummaryForbiddenSensitiveKeys" + }, + "SummaryPageMeta": { + "validator": "validateSummaryPageMeta" + }, + "SummaryStatus": { + "validator": "validateSummaryStatus" + }, + "UrlWithoutQuerySecrets": { + "validator": "validateUrlWithoutQuerySecrets" + }, + "UrlWithoutUserinfo": { + "validator": "validateUrlWithoutUserinfo" + }, + "ViewerSafeUrl": { + "validator": "validateViewerSafeUrl" + }, + "ZonePoint": { + "validator": "validateZonePoint" + }, + "ZonesResponse": { + "validator": "validateZonesResponse" + } + }, + "operations": { + "listStreams": { + "method": "GET", + "path": "/api/streams", + "success_statuses": [ + 200 + ], + "responses": { + "200": { + "description": "Summary page (surface-specific) or legacy array.", + "headers": { + "Cache-Control": { + "$ref": "#/components/headers/CacheControl" + } + }, + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/StreamSummaryPageAdmin" + }, + { + "$ref": "#/components/schemas/StreamSummaryPageLive" + }, + { + "$ref": "#/components/schemas/StreamSummaryPageLpr" + }, + { + "$ref": "#/components/schemas/LegacyStreamList" + } + ] + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "500": { + "description": "Includes \"Authorization policy evaluation failed\", which is also returned for the WHOLE list when any stream lacks a fleet inventory row (finding candidate F-T11-10).", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "variant_by_query": { + "parameter": "surface", + "requires": { + "summary": [ + "true", + "1" + ] + }, + "mapping": { + "admin": "#/components/schemas/StreamSummaryPageAdmin", + "live": "#/components/schemas/StreamSummaryPageLive", + "lpr": "#/components/schemas/StreamSummaryPageLpr" + }, + "otherwise": "#/components/schemas/LegacyStreamList" + } + }, + "getStreamFull": { + "method": "GET", + "path": "/api/streams/{name}/full", + "success_statuses": [ + 200 + ], + "responses": { + "200": { + "description": "Stream detail, configure or live-only variant.", + "headers": { + "Cache-Control": { + "$ref": "#/components/headers/CacheControl" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StreamFullResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/StreamNotFound" + }, + "500": { + "$ref": "#/components/responses/InternalError" + } + }, + "variant_by_field": { + "field": "stream.can_control_privacy", + "mapping": { + "true": "#/components/schemas/StreamFullResponseConfigurable", + "false": "#/components/schemas/StreamFullResponseLiveOnly" + } + } + }, + "updateStream": { + "method": "PUT", + "path": "/api/streams/{name}", + "success_statuses": [ + 200, + 202 + ], + "responses": { + "200": { + "description": "set_privacy_mode short-circuit result.", + "headers": { + "Cache-Control": { + "$ref": "#/components/headers/CacheControl" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StreamPrivacyModeResponse" + } + } + } + }, + "202": { + "description": "Update accepted; applied asynchronously by a worker thread.", + "headers": { + "Cache-Control": { + "$ref": "#/components/headers/CacheControl" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StreamUpdateAccepted" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/StreamNotFound" + }, + "413": { + "$ref": "#/components/responses/PayloadTooLarge" + }, + "500": { + "$ref": "#/components/responses/InternalError" + } + } + }, + "getStreamZones": { + "method": "GET", + "path": "/api/streams/{name}/zones", + "success_statuses": [ + 200 + ], + "responses": { + "200": { + "description": "Zones for the stream (possibly empty).", + "headers": { + "Cache-Control": { + "$ref": "#/components/headers/CacheControl" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ZonesResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/StreamNotFound" + }, + "500": { + "$ref": "#/components/responses/InternalError" + } + } + }, + "getClientConfig": { + "method": "GET", + "path": "/api/client-config", + "success_statuses": [ + 200 + ], + "responses": { + "200": { + "description": "Client configuration.", + "headers": { + "Cache-Control": { + "$ref": "#/components/headers/CacheControl" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ClientConfig" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "500": { + "$ref": "#/components/responses/InternalError" + } + } + }, + "listDetectionModels": { + "method": "GET", + "path": "/api/detection/models", + "success_statuses": [ + 200 + ], + "responses": { + "200": { + "description": "Built-in models first (motion, api-detection, onvif), then file models.", + "headers": { + "Cache-Control": { + "$ref": "#/components/headers/CacheControl" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DetectionModelsResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/InternalError" + } + } + }, + "verifyAuth": { + "method": "GET", + "path": "/api/auth/verify", + "success_statuses": [ + 200 + ], + "responses": { + "200": { + "description": "Principal description.", + "headers": { + "Cache-Control": { + "$ref": "#/components/headers/CacheControl" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthVerifyResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + } + } +} diff --git a/tests/contracts/generated/openapi.json b/tests/contracts/generated/openapi.json new file mode 100644 index 000000000..899b77713 --- /dev/null +++ b/tests/contracts/generated/openapi.json @@ -0,0 +1,2562 @@ +{ + "openapi": "3.1.0", + "jsonSchemaDialect": "https://spec.openapis.org/oas/3.1/dialect/base", + "info": { + "title": "LightNVR API", + "version": "0.1.0-pilot", + "summary": "Streams list/edit pilot contract", + "description": "Specified from the C handlers in src/web (serialization and parsing code read directly), not from prose documentation. Where the C behavior and the UI or docs disagree, operation descriptions record the C wire behavior and the disagreement is recorded as a discrepancy (D-xx in quality/api-inventory.json) or a finding candidate (F-T11-xx in quality/evidence/T11.md). Extension keywords (`x-lightnvr-*`) are annotations: they never change validation results. The schemas additionally enforce explicit client-input and response-redaction policies: they do not claim that every currently accepted request or emitted response conforms. Known violations are recorded in the fixtures and findings, with expected_server_response separate from schema validity.\nCompatibility policy: response objects are open (unknown additional keys are compatible) except where a schema states otherwise for redaction reasons; request bodies are closed. Errors use `{\"error\": \"\"}`.", + "license": { + "name": "GPL-3.0-or-later", + "identifier": "GPL-3.0-or-later" + } + }, + "servers": [ + { + "url": "/", + "description": "Same origin as the web UI." + } + ], + "tags": [ + { + "name": "streams", + "description": "Streams list and edit pilot." + }, + { + "name": "pilot-option-dependency", + "description": "Read-only endpoints the Streams list/edit UI loads to populate options and gating." + } + ], + "security": [ + { + "sessionCookie": [] + }, + { + "basicAuth": [] + }, + { + "apiKey": [] + }, + { + "bearerAuth": [] + } + ], + "x-lightnvr-coverage": { + "scope": "streams-pilot", + "inventory": "quality/api-inventory.json", + "specified_operations": [ + "GET /api/streams", + "GET /api/streams/{name}/full", + "PUT /api/streams/{name}", + "GET /api/streams/{name}/zones", + "GET /api/client-config", + "GET /api/detection/models", + "GET /api/auth/verify" + ], + "inventoried_not_specified": [ + "GET /api/streams/{name} (unwrapped single stream; same object as /full .stream)", + "POST /api/streams", + "POST /api/streams/test", + "DELETE /api/streams/{name}", + "POST /api/streams/{name}/zones", + "DELETE /api/streams/{name}/zones", + "POST /api/streams/{name}/refresh", + "all other routes in quality/api-inventory.json routes[]" + ], + "partially_specified": [ + { + "operation": "GET /api/streams", + "note": "the legacy (non-summary) array is schema-described via LegacyStreamList but is out of pilot and not contract-tested." + }, + { + "operation": "PUT /api/streams/{name}", + "note": "enable_disabled and set_privacy_mode are described because they share the operation, but their flows are out of pilot." + } + ] + }, + "paths": { + "/api/streams": { + "get": { + "operationId": "listStreams", + "tags": [ + "streams" + ], + "summary": "List streams (paged summary for the pilot; legacy full list otherwise)", + "description": "Authentication is checked first (401). With `summary=true` (or `1`) the paged summary variant is returned; its row shape depends on `surface`. Rows are filtered per camera: `admin`/`live` require live.view, `lpr` requires both lpr.search and lpr.read. `can_configure` is the per-camera camera.configure decision. Query parameters are validated in this order: page/page_size, sort_by, sort_order, surface, availability. Without `summary`, the legacy unbounded array of full stream objects is returned (out of pilot; no current web/js caller) and every other query parameter is ignored.", + "x-lightnvr-source": "src/web/api_handlers_streams_get.c:handle_get_streams,handle_get_stream_summaries", + "x-lightnvr-authz": { + "authentication": "required (demo mode grants a viewer pseudo-user; auth disabled grants admin)", + "row_filter": { + "admin": "live.view", + "live": "live.view", + "lpr": "lpr.search AND lpr.read" + }, + "can_configure": "camera.configure (per camera)" + }, + "x-lightnvr-response-variant-by-query": { + "parameter": "surface", + "requires": { + "summary": [ + "true", + "1" + ] + }, + "mapping": { + "admin": "#/components/schemas/StreamSummaryPageAdmin", + "live": "#/components/schemas/StreamSummaryPageLive", + "lpr": "#/components/schemas/StreamSummaryPageLpr" + }, + "otherwise": "#/components/schemas/LegacyStreamList" + }, + "parameters": [ + { + "name": "summary", + "in": "query", + "description": "Exactly `true` or `1` selects the summary variant; any other value (including `TRUE`) selects the legacy list.", + "schema": { + "type": "string" + } + }, + { + "name": "surface", + "in": "query", + "schema": { + "type": "string", + "enum": [ + "admin", + "live", + "lpr" + ], + "default": "admin" + }, + "description": "Invalid value: 400 \"surface must be admin, live or lpr\"." + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 1000000, + "default": 1 + }, + "description": "Decimal integer parsed by strtol: leading whitespace and a plus sign are accepted, but trailing whitespace/suffixes are rejected. Empty or out of range: 400 \"page and page_size must be positive; page_size max is 100\". A page beyond the last returns an empty `streams` array with the real totals." + }, + { + "name": "page_size", + "in": "query", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 50 + }, + "description": "Out of range: 400 \"page and page_size must be positive; page_size max is 100\"." + }, + { + "name": "sort_by", + "in": "query", + "schema": { + "type": "string", + "enum": [ + "name", + "status", + "resolution", + "fps", + "recording" + ], + "default": "name" + }, + "description": "Invalid: 400 \"Invalid stream summary sort field\". Ties break on case-insensitive name." + }, + { + "name": "sort_order", + "in": "query", + "schema": { + "type": "string", + "enum": [ + "asc", + "desc" + ], + "default": "asc" + }, + "description": "Invalid: 400 \"sort_order must be asc or desc\"." + }, + { + "name": "availability", + "in": "query", + "schema": { + "type": "string", + "enum": [ + "all", + "live", + "offline", + "never_connected", + "disabled" + ], + "default": "all" + }, + "description": "Invalid: 400 \"Invalid availability value\"." + }, + { + "name": "search", + "in": "query", + "description": "Case-insensitive substring over name, camera_uuid, tags, location path and inventory address. Values longer than 255 bytes are silently truncated.", + "schema": { + "type": "string", + "maxLength": 255 + } + }, + { + "name": "include_admin_url", + "in": "query", + "description": "Exactly `true` or `1` adds `admin_url` to rows on the admin surface (never on live/lpr). Rows without camera.configure get \"\".", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Summary page (surface-specific) or legacy array.", + "headers": { + "Cache-Control": { + "$ref": "#/components/headers/CacheControl" + } + }, + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/StreamSummaryPageAdmin" + }, + { + "$ref": "#/components/schemas/StreamSummaryPageLive" + }, + { + "$ref": "#/components/schemas/StreamSummaryPageLpr" + }, + { + "$ref": "#/components/schemas/LegacyStreamList" + } + ] + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "500": { + "description": "Includes \"Authorization policy evaluation failed\", which is also returned for the WHOLE list when any stream lacks a fleet inventory row (finding candidate F-T11-10).", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/streams/{name}/full": { + "get": { + "operationId": "getStreamFull", + "tags": [ + "streams" + ], + "summary": "Full stream detail used by the edit form", + "description": "Order of checks: path decode (400 \"Invalid request path\"), stream lookup (404 \"Stream not found\", BEFORE authentication), configuration read (500), authentication (401), fleet row (404 \"Camera not found\"), live.view (403). Callers with live.view but without camera.configure receive the live-only redacted variant; `can_control_privacy` equals the camera.configure decision and selects the variant. The response is wrapped as `{\"stream\": {...}}` (GET /api/streams/{name}, out of pilot, returns the same object unwrapped). The handler never emits `detection_zones` (D-02); zones come from GET /api/streams/{name}/zones.", + "x-lightnvr-source": "src/web/api_handlers_streams_get.c:handle_get_stream_full,get_stream_api_credentials,stream_user_can_modify", + "x-lightnvr-authz": { + "required": "live.view (per camera)", + "variant_selector": "camera.configure (per camera) -> can_control_privacy" + }, + "x-lightnvr-response-variant-by-field": { + "field": "stream.can_control_privacy", + "mapping": { + "true": "#/components/schemas/StreamFullResponseConfigurable", + "false": "#/components/schemas/StreamFullResponseLiveOnly" + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/StreamNamePath" + } + ], + "responses": { + "200": { + "description": "Stream detail, configure or live-only variant.", + "headers": { + "Cache-Control": { + "$ref": "#/components/headers/CacheControl" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StreamFullResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/StreamNotFound" + }, + "500": { + "$ref": "#/components/responses/InternalError" + } + } + } + }, + "/api/streams/{name}": { + "put": { + "operationId": "updateStream", + "tags": [ + "streams" + ], + "summary": "Update stream configuration (asynchronous apply)", + "description": "Order of checks: path decode (400 \"Invalid request path\"), stream lookup (404 \"Stream not found\", BEFORE authentication), configuration read (500), camera.configure authorization (401/404 \"Camera not found\"/403) BEFORE the body is parsed, then body parse (400 \"Invalid JSON in request body\" for an empty or unparsable body). Fields are applied in handler order; the first failing validation returns its error and nothing is stored. Present keys with the wrong JSON type are silently ignored (F-T11-05). A valid JSON body that is not an object (e.g. `null`, `[]`) is accepted as a no-op 202 (F-T11-04). If `isOnvif` is omitted the server recomputes it from whether `url` contains \"onvif\" (F-T11-11). When the effective isOnvif is true the handler copies onvif_username/onvif_password/onvif_profile, moves URL credentials into them, and runs an ONVIF connection test inline before responding; when false those three keys are ignored. `set_privacy_mode` short-circuits: after all other keys were parsed and validated (and `enable_disabled` already executed) it writes only privacy_mode and answers 200; other edits in the same body are discarded (F-T11-12). Otherwise the response is 202 and a detached worker applies the change; the 202 does not prove persistence. Errors in the 400 set: \"playback_transport is invalid\", \"eptz_config must be a JSON string\", \"eptz_config exceeds size limit\", \"eptz_config is not a supported version-1 equidistant ceiling configuration\", \"retention_days must be between -1 and 365\", \"detection_retention_days must be between -1 and 365\", \"detection_url must use http, https, rtsp, or rtsps\", \"publish_url destinations must be rtmp:// or rtmps:// URLs\". 413 set: \"detection_url exceeds size limit\", \"publish_url exceeds size limit\".", + "x-lightnvr-source": "src/web/api_handlers_streams_modify.c:handle_put_stream,check_stream_write_access,copy_valid_eptz_config,is_allowed_detection_url,normalize_stream_url_credentials", + "x-lightnvr-authz": { + "required": "camera.configure (per camera), checked before body parse" + }, + "parameters": [ + { + "$ref": "#/components/parameters/StreamNamePath" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/StreamUpdateRequest" + }, + { + "$ref": "#/components/schemas/StreamPrivacyModeRequest" + } + ] + } + } + } + }, + "responses": { + "200": { + "description": "set_privacy_mode short-circuit result.", + "headers": { + "Cache-Control": { + "$ref": "#/components/headers/CacheControl" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StreamPrivacyModeResponse" + } + } + } + }, + "202": { + "description": "Update accepted; applied asynchronously by a worker thread.", + "headers": { + "Cache-Control": { + "$ref": "#/components/headers/CacheControl" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StreamUpdateAccepted" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/StreamNotFound" + }, + "413": { + "$ref": "#/components/responses/PayloadTooLarge" + }, + "500": { + "$ref": "#/components/responses/InternalError" + } + } + } + }, + "/api/streams/{name}/zones": { + "get": { + "operationId": "getStreamZones", + "tags": [ + "streams", + "pilot-option-dependency" + ], + "summary": "Detection zones for a stream (read by the edit modal and ZoneEditor)", + "description": "No pre-auth existence check: 401 first, then 404 \"Camera not found\" for unknown names, 403 without live.view. Path decode failure is 400 \"Invalid stream name\". POST/DELETE on this path are out of pilot.", + "x-lightnvr-source": "src/web/api_handlers_zones.c:handle_get_zones", + "x-lightnvr-authz": { + "required": "live.view (per camera)" + }, + "parameters": [ + { + "$ref": "#/components/parameters/StreamNamePath" + } + ], + "responses": { + "200": { + "description": "Zones for the stream (possibly empty).", + "headers": { + "Cache-Control": { + "$ref": "#/components/headers/CacheControl" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ZonesResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/StreamNotFound" + }, + "500": { + "$ref": "#/components/responses/InternalError" + } + } + } + }, + "/api/client-config": { + "get": { + "operationId": "getClientConfig", + "tags": [ + "pilot-option-dependency" + ], + "summary": "Viewer-safe runtime playback configuration", + "x-lightnvr-source": "src/web/api_handlers_settings.c:handle_get_client_config", + "x-lightnvr-authz": { + "required": "authentication only" + }, + "responses": { + "200": { + "description": "Client configuration.", + "headers": { + "Cache-Control": { + "$ref": "#/components/headers/CacheControl" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ClientConfig" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "500": { + "$ref": "#/components/responses/InternalError" + } + } + } + }, + "/api/detection/models": { + "get": { + "operationId": "listDetectionModels", + "tags": [ + "pilot-option-dependency" + ], + "summary": "Detection model options for the edit form", + "description": "401 unauthenticated; 403 unless the principal has global camera.configure or camera.configure on at least one camera. Viewers therefore receive 403 and the UI shows no models (D-04).", + "x-lightnvr-source": "src/web/api_handlers_detection_models.c:handle_get_detection_models", + "x-lightnvr-authz": { + "required": "camera.configure (global, or on >= 1 camera)" + }, + "responses": { + "200": { + "description": "Built-in models first (motion, api-detection, onvif), then file models.", + "headers": { + "Cache-Control": { + "$ref": "#/components/headers/CacheControl" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DetectionModelsResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/InternalError" + } + } + } + }, + "/api/auth/verify": { + "get": { + "operationId": "verifyAuth", + "tags": [ + "pilot-option-dependency" + ], + "summary": "Current principal (role and demo-mode gating for the Streams UI)", + "description": "Three 200 shapes: authentication disabled (synthetic admin), a real authenticated user, or demo-mode anonymous viewer. Uses httpd_get_authenticated_user (scoped API tokens are not accepted here although the streams handlers accept them). 401 also clears the session cookie. An authenticated user in demo mode receives no `demo_mode` key (F-T11-13).", + "x-lightnvr-source": "src/web/api_handlers_auth_backend_agnostic.c:handle_auth_verify", + "security": [ + {}, + { + "sessionCookie": [] + }, + { + "basicAuth": [] + }, + { + "apiKey": [] + }, + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Principal description.", + "headers": { + "Cache-Control": { + "$ref": "#/components/headers/CacheControl" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthVerifyResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + } + } + }, + "components": { + "schemas": { + "ErrorResponse": { + "description": "Error envelope used for every non-2xx JSON response in the pilot. Produced only by http_response_set_json_error(), which emits exactly one key. Clients must not depend on the message text for control flow except where an operation documents a specific message.", + "type": "object", + "required": [ + "error" + ], + "properties": { + "error": { + "type": "string", + "minLength": 1 + } + }, + "x-lightnvr-source": "src/web/request_response.c:http_response_set_json_error" + }, + "Int32": { + "description": "C `int` read through cJSON `valueint` (fractional values are truncated, out-of-range values saturate). Used where the server performs no range validation of its own.", + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 + }, + "EpochSecondsOrZero": { + "description": "Unix epoch seconds (int64). `0` means \"never observed\".", + "type": "integer", + "minimum": 0, + "x-lightnvr-source": "include/core/camera_selector.h:fleet_camera_t (int64_t); include/telemetry/stream_metrics.h last_frame_ts" + }, + "CameraUuid": { + "description": "Immutable fleet identity (36-char UUID). Legacy rows created before camera UUIDs existed may carry an empty string.", + "type": "string", + "maxLength": 36, + "pattern": "^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$", + "x-lightnvr-source": "include/core/config.h:CAMERA_UUID_STRING_SIZE (37 incl. NUL)" + }, + "StreamName": { + "description": "Stream (camera) name as stored. This is the primary key used in paths. Names created through POST /api/streams must match `^[A-Za-z0-9_-][A-Za-z0-9._-]*$` (is_valid_stream_name), but names that predate that rule or arrive through configuration import can contain other characters, so the read-side schema only bounds the length.", + "type": "string", + "minLength": 1, + "maxLength": 255, + "x-lightnvr-max-bytes": 255, + "x-lightnvr-create-pattern": "^[A-Za-z0-9_-][A-Za-z0-9._-]*$", + "x-lightnvr-source": "include/core/config.h:MAX_STREAM_NAME; src/core/path_utils.c:is_valid_stream_name" + }, + "PlaybackTransport": { + "type": "string", + "enum": [ + "auto", + "webrtc_only", + "mse_only", + "hls_only", + "webrtc_then_mse", + "mse_then_hls" + ], + "description": "Responses substitute `auto` when the stored value is invalid, so a response never carries a value outside this enum.", + "x-lightnvr-source": "src/core/config.c:playback_transport_is_valid" + }, + "StreamProtocol": { + "description": "Transport protocol: 0 = TCP, 1 = UDP (stream_protocol_t). PUT does not range-check this value (see finding candidate F-T11-06); the contract only permits the two defined values.", + "type": "integer", + "enum": [ + 0, + 1 + ], + "x-lightnvr-source": "include/core/config.h:stream_protocol_t" + }, + "RetentionDays": { + "description": "Tri-state per-stream retention override in days. `-1` inherits the live global retention value at evaluation time, `0` is explicitly unlimited (also disables tier expiry), and `1..365` is a day override. Writes outside -1..365 are rejected with 400. For `detection_retention_days`, `-1` inherits the *global* retention value, not this stream's `retention_days`.", + "type": "integer", + "minimum": -1, + "maximum": 365, + "x-lightnvr-retention-states": { + "inherit": -1, + "unlimited": 0, + "finite": "1..365" + }, + "x-lightnvr-source": "include/core/config.h:stream_config_t.retention_days; src/web/api_handlers_streams_modify.c:handle_put_stream (range check); src/storage/storage_manager.c (tri-state evaluation, tier expiry skip on 0)" + }, + "HourOfWeekSchedule": { + "description": "168 booleans indexed `day * 24 + hour` in server local time, where day 0 = Sunday ... 6 = Saturday (struct tm tm_wday). Responses always carry exactly 168 entries. On PUT, an array whose length is not 168 is silently ignored (no error) and any entry other than JSON `true` is stored as false (finding candidate F-T11-07).", + "type": "array", + "minItems": 168, + "maxItems": 168, + "items": { + "type": "boolean" + }, + "x-lightnvr-source": "src/web/api_handlers_streams_get.c (serialization loop j<168); src/web/api_handlers_streams_modify.c:handle_put_stream (arr_size == 168); src/video/stream_manager.c:is_recording_scheduled (tm_wday*24+tm_hour)" + }, + "EmptyString": { + "description": "Redacted value. The server emits an empty string in place of a sensitive value.", + "type": "string", + "const": "" + }, + "UrlWithoutUserinfo": { + "description": "A URL-like string that carries no userinfo (`user:pass@`) in its authority. Empty string is permitted (viewer redaction falls back to \"\" when credential stripping fails). A response that contains userinfo here is a credential leak and must fail validation.", + "type": "string", + "maxLength": 511, + "pattern": "^(?![A-Za-z][A-Za-z0-9+.-]*://[^/?#]*@)", + "x-lightnvr-source": "src/web/api_handlers_streams_get.c:get_stream_api_credentials; src/core/url_utils.c:url_strip_credentials" + }, + "UrlWithoutQuerySecrets": { + "description": "Rejects a URL whose query string carries a non-empty parameter whose key contains pass, pwd, token, secret or apikey (case-insensitive). The C redaction only strips userinfo, so a camera URL like `rtsp://host/live?user=admin&password=x` currently reaches viewers unchanged. This rule is the redaction policy the contract enforces; a server response that violates it is a finding (F-T11-03), not a schema bug.", + "type": "string", + "not": { + "pattern": "[?&;][^=&#]*([Pp][Aa][Ss][Ss]|[Pp][Ww][Dd]|[Tt][Oo][Kk][Ee][Nn]|[Ss][Ee][Cc][Rr][Ee][Tt]|[Aa][Pp][Ii]_?[Kk][Ee][Yy])[^=&#]*=[^&#]" + } + }, + "ViewerSafeUrl": { + "description": "Credential-free URL as delivered to principals without camera.configure.", + "allOf": [ + { + "$ref": "#/components/schemas/UrlWithoutUserinfo" + }, + { + "$ref": "#/components/schemas/UrlWithoutQuerySecrets" + } + ] + }, + "SummaryStatus": { + "type": "string", + "enum": [ + "Running", + "Degraded", + "Error", + "Stopped", + "Unknown" + ], + "x-lightnvr-source": "src/web/api_handlers_streams_get.c:summary_status" + }, + "Availability": { + "type": "string", + "enum": [ + "live", + "offline", + "never_connected", + "disabled" + ], + "x-lightnvr-source": "src/core/camera_selector.c:fleet_availability_state_name" + }, + "SummaryForbiddenSensitiveKeys": { + "description": "Summary rows never carry credential-bearing configuration. Presence of any of these keys is a redaction failure regardless of value.", + "not": { + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "onvif_username" + ] + }, + { + "required": [ + "onvif_password" + ] + }, + { + "required": [ + "sub_stream_url" + ] + }, + { + "required": [ + "detection_url" + ] + }, + { + "required": [ + "publish_url" + ] + }, + { + "required": [ + "go2rtc_source_override" + ] + }, + { + "required": [ + "detection_api_url" + ] + } + ] + } + }, + "StreamSummaryLpr": { + "description": "surface=lpr row. LPR discovery grants identity only, so this object is closed: any extra key (configuration, location, health) is a policy leak.", + "type": "object", + "additionalProperties": false, + "required": [ + "camera_uuid", + "name" + ], + "properties": { + "camera_uuid": { + "$ref": "#/components/schemas/CameraUuid" + }, + "name": { + "$ref": "#/components/schemas/StreamName" + } + } + }, + "StreamSummaryBase": { + "description": "Fields shared by admin and live summary rows (always emitted).", + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/SummaryForbiddenSensitiveKeys" + } + ], + "required": [ + "camera_uuid", + "name", + "location_uuid", + "location_name", + "location_path", + "enabled", + "width", + "height", + "fps", + "codec", + "protocol", + "record", + "record_on_schedule", + "detection_based_recording", + "isOnvif", + "tags", + "status", + "availability", + "first_video_at", + "last_frame_ts", + "current_fps", + "recording_active", + "last_recording_at", + "can_configure" + ], + "properties": { + "camera_uuid": { + "$ref": "#/components/schemas/CameraUuid" + }, + "name": { + "$ref": "#/components/schemas/StreamName" + }, + "location_uuid": { + "$ref": "#/components/schemas/CameraUuid" + }, + "location_name": { + "type": "string", + "maxLength": 127 + }, + "location_path": { + "type": "string", + "maxLength": 1023 + }, + "enabled": { + "type": "boolean" + }, + "width": { + "$ref": "#/components/schemas/Int32" + }, + "height": { + "$ref": "#/components/schemas/Int32" + }, + "fps": { + "$ref": "#/components/schemas/Int32" + }, + "codec": { + "type": "string", + "maxLength": 15 + }, + "protocol": { + "$ref": "#/components/schemas/StreamProtocol" + }, + "record": { + "type": "boolean" + }, + "record_on_schedule": { + "type": "boolean" + }, + "detection_based_recording": { + "type": "boolean" + }, + "isOnvif": { + "type": "boolean" + }, + "tags": { + "type": "string", + "maxLength": 255, + "description": "Comma-separated legacy tags." + }, + "status": { + "$ref": "#/components/schemas/SummaryStatus" + }, + "availability": { + "$ref": "#/components/schemas/Availability" + }, + "first_video_at": { + "$ref": "#/components/schemas/EpochSecondsOrZero" + }, + "last_frame_ts": { + "$ref": "#/components/schemas/EpochSecondsOrZero" + }, + "current_fps": { + "type": "number", + "minimum": 0 + }, + "recording_active": { + "type": "boolean" + }, + "last_recording_at": { + "$ref": "#/components/schemas/EpochSecondsOrZero" + }, + "can_configure": { + "type": "boolean", + "description": "Per-camera camera.configure decision. Authoritative for edit affordances (D-05)." + } + }, + "x-lightnvr-not-emitted": [ + "error_message (D-03)", + "playback_transport on the admin surface (D-03)" + ] + }, + "StreamSummaryAdmin": { + "description": "surface=admin row. `admin_url` appears only with include_admin_url and must be \"\" when can_configure is false.", + "allOf": [ + { + "$ref": "#/components/schemas/StreamSummaryBase" + }, + { + "type": "object", + "properties": { + "admin_url": { + "type": "string", + "maxLength": 511 + } + }, + "if": { + "required": [ + "can_configure" + ], + "properties": { + "can_configure": { + "const": false + } + } + }, + "then": { + "properties": { + "admin_url": { + "$ref": "#/components/schemas/EmptyString" + } + } + } + } + ] + }, + "StreamSummaryLive": { + "description": "surface=live row. Never carries admin_url.", + "allOf": [ + { + "$ref": "#/components/schemas/StreamSummaryBase" + }, + { + "type": "object", + "not": { + "required": [ + "admin_url" + ] + }, + "required": [ + "streaming_enabled", + "playback_transport", + "eptz_config", + "detection_model", + "privacy_mode", + "can_control_privacy", + "has_sub_stream", + "ptz_enabled", + "backchannel_enabled", + "go2rtc_hls_available" + ], + "properties": { + "streaming_enabled": { + "type": "boolean" + }, + "playback_transport": { + "$ref": "#/components/schemas/PlaybackTransport" + }, + "eptz_config": { + "$ref": "#/components/schemas/EptzConfigString" + }, + "detection_model": { + "type": "string", + "maxLength": 511 + }, + "privacy_mode": { + "type": "boolean" + }, + "can_control_privacy": { + "type": "boolean", + "description": "Equals can_configure for the row." + }, + "has_sub_stream": { + "type": "boolean" + }, + "ptz_enabled": { + "type": "boolean" + }, + "backchannel_enabled": { + "type": "boolean" + }, + "go2rtc_hls_available": { + "type": "boolean" + } + } + } + ] + }, + "SummaryPageMeta": { + "type": "object", + "required": [ + "total", + "page", + "page_size", + "total_pages" + ], + "properties": { + "total": { + "type": "integer", + "minimum": 0, + "description": "Rows visible to the caller after filtering." + }, + "page": { + "type": "integer", + "minimum": 1, + "maximum": 1000000 + }, + "page_size": { + "type": "integer", + "minimum": 1, + "maximum": 100 + }, + "total_pages": { + "type": "integer", + "minimum": 0, + "description": "0 when total is 0, else ceil(total / page_size)." + } + } + }, + "StreamSummaryPageAdmin": { + "allOf": [ + { + "$ref": "#/components/schemas/SummaryPageMeta" + }, + { + "type": "object", + "required": [ + "streams" + ], + "properties": { + "streams": { + "type": "array", + "maxItems": 100, + "items": { + "$ref": "#/components/schemas/StreamSummaryAdmin" + } + } + } + } + ] + }, + "StreamSummaryPageLive": { + "allOf": [ + { + "$ref": "#/components/schemas/SummaryPageMeta" + }, + { + "type": "object", + "required": [ + "streams" + ], + "properties": { + "streams": { + "type": "array", + "maxItems": 100, + "items": { + "$ref": "#/components/schemas/StreamSummaryLive" + } + } + } + } + ] + }, + "StreamSummaryPageLpr": { + "allOf": [ + { + "$ref": "#/components/schemas/SummaryPageMeta" + }, + { + "type": "object", + "required": [ + "streams" + ], + "properties": { + "streams": { + "type": "array", + "maxItems": 100, + "items": { + "$ref": "#/components/schemas/StreamSummaryLpr" + } + } + } + } + ] + }, + "LegacyStreamList": { + "description": "Out of pilot (inventoried, not contract-tested by T18): GET /api/streams without summary. Bare unbounded array of the same objects as the /full detail, each redacted per camera.", + "x-lightnvr-pilot": false, + "type": "array", + "items": { + "$ref": "#/components/schemas/StreamDetail" + } + }, + "DetailStatus": { + "type": "string", + "enum": [ + "Running", + "Degraded", + "Error", + "Stopped", + "Unknown", + "Starting", + "Stopping", + "Reconnecting" + ], + "description": "Fleet health first; when health is unknown and the stream is enabled, the stream-state/UDT status is used (adds Starting/Stopping/Reconnecting).", + "x-lightnvr-source": "src/web/api_handlers_streams_get.c:summary_status,resolve_effective_stream_status" + }, + "EptzConfigString": { + "description": "\"\" (disabled) or JSON text of a version-1 equidistant ceiling dewarp document, at most 1023 bytes. The server stores it opaquely after validating; the document schema is EptzConfigV1.", + "type": "string", + "maxLength": 1023, + "contentMediaType": "application/json", + "contentSchema": { + "$ref": "#/components/schemas/EptzConfigV1" + }, + "x-lightnvr-max-bytes": 1023, + "x-lightnvr-source": "src/web/api_handlers_streams_modify.c:copy_valid_eptz_config; include/core/config.h:EPTZ_CONFIG_MAX" + }, + "EptzConfigV1": { + "type": "object", + "required": [ + "version", + "projection", + "mount", + "centerX", + "centerY", + "radius", + "fov", + "rotation", + "defaultYaw", + "defaultTilt", + "defaultViewFov" + ], + "properties": { + "version": { + "const": 1 + }, + "projection": { + "const": "equidistant" + }, + "mount": { + "const": "ceiling" + }, + "centerX": { + "type": "number", + "minimum": 0, + "maximum": 1 + }, + "centerY": { + "type": "number", + "minimum": 0, + "maximum": 1 + }, + "radius": { + "type": "number", + "minimum": 0.05, + "maximum": 1 + }, + "fov": { + "type": "number", + "minimum": 160, + "maximum": 360 + }, + "rotation": { + "type": "number", + "minimum": -360, + "maximum": 360 + }, + "defaultYaw": { + "type": "number", + "minimum": -360, + "maximum": 360 + }, + "defaultTilt": { + "type": "number", + "minimum": -90, + "maximum": 30 + }, + "defaultViewFov": { + "type": "number", + "minimum": 20, + "maximum": 120 + } + } + }, + "StreamDetailBase": { + "description": "Non-sensitive fields of the full stream object, emitted for every caller with live.view. Credential-bearing keys (url, onvif_username, onvif_password, admin_url, go2rtc_source_override, sub_stream_url, detection_url, publish_url) are declared here only as strings and are NOT required; each variant pins them.", + "type": "object", + "required": [ + "camera_uuid", + "location_uuid", + "name", + "enabled", + "streaming_enabled", + "playback_transport", + "eptz_config", + "width", + "height", + "fps", + "codec", + "priority", + "record", + "segment_duration", + "detection_based_recording", + "detection_model", + "detection_threshold", + "detection_interval", + "pre_detection_buffer", + "post_detection_buffer", + "detection_object_filter", + "detection_object_filter_list", + "protocol", + "record_audio", + "audio_voice_enhancement", + "isOnvif", + "backchannel_enabled", + "retention_days", + "detection_retention_days", + "max_storage_mb", + "tier_critical_multiplier", + "tier_important_multiplier", + "tier_ephemeral_multiplier", + "storage_priority", + "ptz_enabled", + "ptz_max_x", + "ptz_max_y", + "ptz_max_z", + "ptz_has_home", + "onvif_profile", + "onvif_port", + "record_on_schedule", + "recording_schedule", + "detection_record_on_schedule", + "detection_recording_schedule", + "tags", + "privacy_mode", + "can_control_privacy", + "motion_trigger_source", + "has_sub_stream", + "status", + "go2rtc_hls_available" + ], + "properties": { + "camera_uuid": { + "$ref": "#/components/schemas/CameraUuid" + }, + "location_uuid": { + "$ref": "#/components/schemas/CameraUuid" + }, + "name": { + "$ref": "#/components/schemas/StreamName" + }, + "url": { + "type": "string", + "maxLength": 511 + }, + "enabled": { + "type": "boolean" + }, + "streaming_enabled": { + "type": "boolean" + }, + "playback_transport": { + "$ref": "#/components/schemas/PlaybackTransport" + }, + "eptz_config": { + "$ref": "#/components/schemas/EptzConfigString" + }, + "width": { + "$ref": "#/components/schemas/Int32" + }, + "height": { + "$ref": "#/components/schemas/Int32" + }, + "fps": { + "$ref": "#/components/schemas/Int32" + }, + "codec": { + "type": "string", + "maxLength": 15 + }, + "priority": { + "$ref": "#/components/schemas/Int32" + }, + "record": { + "type": "boolean" + }, + "segment_duration": { + "$ref": "#/components/schemas/Int32" + }, + "detection_based_recording": { + "type": "boolean" + }, + "detection_model": { + "type": "string", + "maxLength": 511 + }, + "detection_threshold": { + "type": "integer", + "description": "Integer percent: (int)(stored_float * 100.0f), truncated toward zero. Not a 0..1 float on the wire." + }, + "detection_interval": { + "$ref": "#/components/schemas/Int32" + }, + "pre_detection_buffer": { + "$ref": "#/components/schemas/Int32" + }, + "post_detection_buffer": { + "$ref": "#/components/schemas/Int32" + }, + "detection_object_filter": { + "type": "string", + "maxLength": 15 + }, + "detection_object_filter_list": { + "type": "string", + "maxLength": 255 + }, + "protocol": { + "$ref": "#/components/schemas/StreamProtocol" + }, + "record_audio": { + "type": "boolean" + }, + "audio_voice_enhancement": { + "type": "boolean" + }, + "isOnvif": { + "type": "boolean" + }, + "backchannel_enabled": { + "type": "boolean" + }, + "retention_days": { + "$ref": "#/components/schemas/RetentionDays" + }, + "detection_retention_days": { + "$ref": "#/components/schemas/RetentionDays" + }, + "max_storage_mb": { + "allOf": [ + { + "$ref": "#/components/schemas/Int32" + } + ], + "description": "Quota in MB; 0 = unlimited." + }, + "tier_critical_multiplier": { + "type": "number" + }, + "tier_important_multiplier": { + "type": "number" + }, + "tier_ephemeral_multiplier": { + "type": "number" + }, + "storage_priority": { + "$ref": "#/components/schemas/Int32" + }, + "ptz_enabled": { + "type": "boolean" + }, + "ptz_max_x": { + "$ref": "#/components/schemas/Int32" + }, + "ptz_max_y": { + "$ref": "#/components/schemas/Int32" + }, + "ptz_max_z": { + "$ref": "#/components/schemas/Int32" + }, + "ptz_has_home": { + "type": "boolean" + }, + "onvif_username": { + "type": "string", + "maxLength": 63 + }, + "onvif_password": { + "type": "string", + "maxLength": 63 + }, + "onvif_profile": { + "type": "string", + "maxLength": 63 + }, + "onvif_port": { + "allOf": [ + { + "$ref": "#/components/schemas/Int32" + } + ], + "description": "0 = derive from the stream URL." + }, + "record_on_schedule": { + "type": "boolean" + }, + "recording_schedule": { + "$ref": "#/components/schemas/HourOfWeekSchedule" + }, + "detection_record_on_schedule": { + "type": "boolean" + }, + "detection_recording_schedule": { + "$ref": "#/components/schemas/HourOfWeekSchedule" + }, + "tags": { + "type": "string", + "maxLength": 255 + }, + "admin_url": { + "type": "string", + "maxLength": 511 + }, + "privacy_mode": { + "type": "boolean" + }, + "can_control_privacy": { + "type": "boolean" + }, + "motion_trigger_source": { + "type": "string", + "maxLength": 255 + }, + "go2rtc_source_override": { + "type": "string", + "maxLength": 8191 + }, + "sub_stream_url": { + "type": "string", + "maxLength": 511 + }, + "has_sub_stream": { + "type": "boolean", + "description": "Presence of a sub-stream; visible to viewers by design." + }, + "detection_url": { + "type": "string", + "maxLength": 511 + }, + "publish_url": { + "type": "string", + "maxLength": 511 + }, + "status": { + "$ref": "#/components/schemas/DetailStatus" + }, + "error_message": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "description": "Present only when status is Error and a cause was recorded (currently model-load failures)." + }, + "go2rtc_hls_available": { + "type": "boolean" + } + }, + "if": { + "required": [ + "status" + ], + "properties": { + "status": { + "not": { + "const": "Error" + } + } + } + }, + "then": { + "not": { + "required": [ + "error_message" + ] + } + }, + "x-lightnvr-not-emitted": [ + "detection_zones (D-02)", + "detection_api_url", + "id" + ] + }, + "StreamDetailConfigurable": { + "description": "Admin edit model: caller has camera.configure on this camera (can_control_privacy = true). Sensitive fields carry real values. When separate credentials are in use (isOnvif, or non-empty onvif_username/onvif_password) the server strips userinfo from `url` and surfaces it through the onvif_* fields.", + "allOf": [ + { + "$ref": "#/components/schemas/StreamDetailBase" + }, + { + "type": "object", + "required": [ + "url", + "onvif_username", + "onvif_password", + "admin_url", + "go2rtc_source_override", + "sub_stream_url", + "detection_url", + "publish_url" + ], + "properties": { + "can_control_privacy": { + "const": true + } + }, + "if": { + "anyOf": [ + { + "required": [ + "isOnvif" + ], + "properties": { + "isOnvif": { + "const": true + } + } + }, + { + "required": [ + "onvif_username" + ], + "properties": { + "onvif_username": { + "minLength": 1 + } + } + }, + { + "required": [ + "onvif_password" + ], + "properties": { + "onvif_password": { + "minLength": 1 + } + } + } + ] + }, + "then": { + "properties": { + "url": { + "$ref": "#/components/schemas/UrlWithoutUserinfo" + } + } + } + } + ] + }, + "StreamDetailLiveOnly": { + "description": "Viewer (live.view without camera.configure) model. Every credential-bearing key is OPTIONAL (a server that stops sending it is compatible) but, if present, must be redacted: onvif_* and the administrative URLs must be exactly \"\", and `url` must be credential-free (no userinfo, no secret-like query parameter). A leaked value therefore fails validation.", + "allOf": [ + { + "$ref": "#/components/schemas/StreamDetailBase" + }, + { + "type": "object", + "properties": { + "can_control_privacy": { + "const": false + }, + "url": { + "$ref": "#/components/schemas/ViewerSafeUrl" + }, + "onvif_username": { + "$ref": "#/components/schemas/EmptyString" + }, + "onvif_password": { + "$ref": "#/components/schemas/EmptyString" + }, + "admin_url": { + "$ref": "#/components/schemas/EmptyString" + }, + "go2rtc_source_override": { + "$ref": "#/components/schemas/EmptyString" + }, + "sub_stream_url": { + "$ref": "#/components/schemas/EmptyString" + }, + "detection_url": { + "$ref": "#/components/schemas/EmptyString" + }, + "publish_url": { + "$ref": "#/components/schemas/EmptyString" + } + }, + "not": { + "required": [ + "detection_api_url" + ] + } + } + ] + }, + "StreamDetail": { + "description": "Either variant, selected by can_control_privacy (mutually exclusive by const).", + "oneOf": [ + { + "$ref": "#/components/schemas/StreamDetailConfigurable" + }, + { + "$ref": "#/components/schemas/StreamDetailLiveOnly" + } + ] + }, + "StreamFullResponse": { + "type": "object", + "required": [ + "stream" + ], + "properties": { + "stream": { + "$ref": "#/components/schemas/StreamDetail" + } + } + }, + "StreamFullResponseConfigurable": { + "type": "object", + "required": [ + "stream" + ], + "properties": { + "stream": { + "$ref": "#/components/schemas/StreamDetailConfigurable" + } + } + }, + "StreamFullResponseLiveOnly": { + "type": "object", + "required": [ + "stream" + ], + "properties": { + "stream": { + "$ref": "#/components/schemas/StreamDetailLiveOnly" + } + } + }, + "NullableClearableString": { + "description": "Clearable text field. JSON null clears the stored value (same as \"\").", + "type": [ + "string", + "null" + ] + }, + "DetectionUrl": { + "description": "\"\" (use main stream) or a URL whose scheme is http, https, rtsp or rtsps (case-insensitive prefix check). Other schemes: 400. >= 512 bytes: 413 (scheme is checked first). null clears.", + "type": [ + "string", + "null" + ], + "maxLength": 511, + "pattern": "^($|([Hh][Tt][Tt][Pp][Ss]?|[Rr][Tt][Ss][Pp][Ss]?)://)", + "x-lightnvr-max-bytes": 511, + "x-lightnvr-overflow": 413, + "x-lightnvr-source": "src/web/api_handlers_streams_modify.c:is_allowed_detection_url" + }, + "PublishUrlList": { + "description": "\"\" or a comma/whitespace-separated list of rtmp:// or rtmps:// destinations. Each destination is printable ASCII without quotes or backslash and has at least one character after the scheme. Invalid list: 400; whole string >= 512 bytes: 413 (validity is checked first). null clears.", + "type": [ + "string", + "null" + ], + "maxLength": 511, + "pattern": "^[\\t\\n\\v\\f\\r ,]*(([Rr][Tt][Mm][Pp][Ss]?://[!#-&(-+\\x2D-\\x5B\\x5D-~]+)([\\t\\n\\v\\f\\r ,]+[Rr][Tt][Mm][Pp][Ss]?://[!#-&(-+\\x2D-\\x5B\\x5D-~]+)*)?[\\t\\n\\v\\f\\r ,]*$", + "x-lightnvr-max-bytes": 511, + "x-lightnvr-overflow": 413, + "x-lightnvr-source": "src/core/url_utils.c:publish_url_list_is_valid" + }, + "StreamUpdateRequest": { + "description": "Edit-form body. All keys optional (partial update). Closed: the server ignores unknown keys (including `name` and the UI's `is_deleted`, D-01) but the contract rejects them so client drift is visible. Wrong-typed values are silently ignored by the server (F-T11-05). Top-level numeric fields have no server-side range checks except retention (F-T11-06); the JSON embedded in eptz_config is separately range-checked. Over-long strings are silently truncated unless `x-lightnvr-overflow` says otherwise (F-T11-14).", + "type": "object", + "additionalProperties": false, + "properties": { + "url": { + "type": "string", + "maxLength": 511, + "x-lightnvr-overflow": "truncate", + "description": "Not validated (an empty string is accepted). A change requires a stream restart." + }, + "enabled": { + "type": "boolean" + }, + "enable_disabled": { + "type": "boolean", + "x-lightnvr-pilot": false, + "description": "Out of pilot (enable/bulk-enable). `true` re-enables a disabled stream synchronously, even when the same body also carries set_privacy_mode." + }, + "streaming_enabled": { + "type": "boolean" + }, + "playback_transport": { + "$ref": "#/components/schemas/PlaybackTransport" + }, + "eptz_config": { + "$ref": "#/components/schemas/EptzConfigString" + }, + "codec": { + "type": "string", + "maxLength": 15, + "x-lightnvr-overflow": "truncate", + "description": "Codec hint; the UI sends \"\" (auto), \"h264\" or \"h265\". Not validated." + }, + "priority": { + "allOf": [ + { + "$ref": "#/components/schemas/Int32" + } + ], + "x-lightnvr-intended-range": "1..10" + }, + "protocol": { + "$ref": "#/components/schemas/StreamProtocol" + }, + "segment_duration": { + "allOf": [ + { + "$ref": "#/components/schemas/Int32" + } + ], + "description": "Seconds." + }, + "record": { + "type": "boolean" + }, + "detection_based_recording": { + "type": "boolean" + }, + "detection_model": { + "type": "string", + "maxLength": 255, + "x-lightnvr-max-bytes": 255, + "x-lightnvr-overflow": "truncate", + "description": "Copied through a 256-byte buffer although the stored field holds 511 bytes." + }, + "detection_threshold": { + "type": "number", + "description": "Percent; stored as value / 100.0 (float). Not range-checked.", + "x-lightnvr-intended-range": "0..100" + }, + "detection_interval": { + "$ref": "#/components/schemas/Int32" + }, + "pre_detection_buffer": { + "$ref": "#/components/schemas/Int32" + }, + "post_detection_buffer": { + "$ref": "#/components/schemas/Int32" + }, + "detection_object_filter": { + "type": "string", + "maxLength": 15, + "x-lightnvr-overflow": "truncate", + "x-lightnvr-intended-enum": [ + "none", + "include", + "exclude" + ] + }, + "detection_object_filter_list": { + "type": "string", + "maxLength": 255, + "x-lightnvr-overflow": "truncate" + }, + "record_audio": { + "type": "boolean" + }, + "audio_voice_enhancement": { + "type": "boolean" + }, + "isOnvif": { + "type": "boolean", + "description": "When omitted the server recomputes it from `url` containing \"onvif\" (F-T11-11). The UI always sends it." + }, + "backchannel_enabled": { + "type": "boolean" + }, + "onvif_username": { + "type": "string", + "maxLength": 63, + "x-lightnvr-overflow": "truncate", + "description": "Applied only when the effective isOnvif is true; \"\" clears the stored value (no \"unchanged\" sentinel)." + }, + "onvif_password": { + "type": "string", + "maxLength": 63, + "x-lightnvr-overflow": "truncate", + "x-lightnvr-sensitive": true, + "description": "Applied only when the effective isOnvif is true; \"\" clears the stored value (no \"unchanged\" sentinel)." + }, + "onvif_profile": { + "type": "string", + "maxLength": 63, + "x-lightnvr-overflow": "truncate", + "description": "Applied only when the effective isOnvif is true." + }, + "onvif_port": { + "$ref": "#/components/schemas/Int32" + }, + "retention_days": { + "$ref": "#/components/schemas/RetentionDays" + }, + "detection_retention_days": { + "$ref": "#/components/schemas/RetentionDays" + }, + "max_storage_mb": { + "allOf": [ + { + "$ref": "#/components/schemas/Int32" + } + ], + "description": "0 = unlimited." + }, + "tier_critical_multiplier": { + "type": "number" + }, + "tier_important_multiplier": { + "type": "number" + }, + "tier_ephemeral_multiplier": { + "type": "number" + }, + "storage_priority": { + "allOf": [ + { + "$ref": "#/components/schemas/Int32" + } + ], + "x-lightnvr-intended-range": "1..10 (clamped by the UI only)" + }, + "ptz_enabled": { + "type": "boolean" + }, + "ptz_max_x": { + "$ref": "#/components/schemas/Int32" + }, + "ptz_max_y": { + "$ref": "#/components/schemas/Int32" + }, + "ptz_max_z": { + "$ref": "#/components/schemas/Int32" + }, + "ptz_has_home": { + "type": "boolean" + }, + "record_on_schedule": { + "type": "boolean" + }, + "recording_schedule": { + "$ref": "#/components/schemas/HourOfWeekSchedule" + }, + "detection_record_on_schedule": { + "type": "boolean" + }, + "detection_recording_schedule": { + "$ref": "#/components/schemas/HourOfWeekSchedule" + }, + "tags": { + "allOf": [ + { + "$ref": "#/components/schemas/NullableClearableString" + } + ], + "maxLength": 255, + "x-lightnvr-overflow": "truncate" + }, + "admin_url": { + "allOf": [ + { + "$ref": "#/components/schemas/NullableClearableString" + } + ], + "maxLength": 511, + "x-lightnvr-overflow": "truncate" + }, + "motion_trigger_source": { + "allOf": [ + { + "$ref": "#/components/schemas/NullableClearableString" + } + ], + "maxLength": 255, + "x-lightnvr-overflow": "truncate", + "description": "Another stream's name; existence is not checked." + }, + "go2rtc_source_override": { + "allOf": [ + { + "$ref": "#/components/schemas/NullableClearableString" + } + ], + "maxLength": 8191, + "x-lightnvr-overflow": "truncate", + "description": "Whitespace-only is stored as \"\". Not YAML-validated by PUT." + }, + "sub_stream_url": { + "allOf": [ + { + "$ref": "#/components/schemas/NullableClearableString" + } + ], + "maxLength": 511, + "x-lightnvr-overflow": "truncate" + }, + "detection_url": { + "$ref": "#/components/schemas/DetectionUrl" + }, + "publish_url": { + "$ref": "#/components/schemas/PublishUrlList" + } + } + }, + "StreamPrivacyModeRequest": { + "description": "Live privacy toggle (used by Live video cells, not the edit form). Modelled as its own closed body because the server discards every other edit when this key is present (F-T11-12).", + "type": "object", + "additionalProperties": false, + "required": [ + "set_privacy_mode" + ], + "properties": { + "set_privacy_mode": { + "type": "boolean" + } + } + }, + "StreamUpdateAccepted": { + "type": "object", + "required": [ + "success", + "message" + ], + "properties": { + "success": { + "const": true + }, + "message": { + "const": "Stream update request accepted and processing" + }, + "onvif_status": { + "type": "string", + "enum": [ + "success", + "error" + ], + "description": "Present when the effective isOnvif was true and the inline ONVIF test ran." + }, + "onvif_message": { + "type": "string", + "enum": [ + "ONVIF capabilities detected successfully", + "Failed to detect ONVIF capabilities" + ] + } + }, + "dependentRequired": { + "onvif_status": [ + "onvif_message" + ], + "onvif_message": [ + "onvif_status" + ] + } + }, + "StreamPrivacyModeResponse": { + "description": "Always success:true, even if the database write failed (the failure is only logged; F-T11-12).", + "type": "object", + "required": [ + "success", + "privacy_mode" + ], + "properties": { + "success": { + "const": true + }, + "privacy_mode": { + "type": "boolean" + } + } + }, + "ZonePoint": { + "type": "object", + "required": [ + "x", + "y" + ], + "properties": { + "x": { + "type": "number", + "description": "Normalized 0..1 (not re-validated on read)." + }, + "y": { + "type": "number", + "description": "Normalized 0..1 (not re-validated on read)." + } + } + }, + "DetectionZone": { + "type": "object", + "required": [ + "id", + "stream_name", + "name", + "enabled", + "color", + "polygon", + "filter_classes", + "min_confidence" + ], + "properties": { + "id": { + "type": "string", + "maxLength": 63 + }, + "stream_name": { + "$ref": "#/components/schemas/StreamName" + }, + "name": { + "type": "string", + "maxLength": 63 + }, + "enabled": { + "type": "boolean" + }, + "color": { + "type": "string", + "maxLength": 7 + }, + "polygon": { + "type": "array", + "maxItems": 32, + "items": { + "$ref": "#/components/schemas/ZonePoint" + } + }, + "filter_classes": { + "type": "string", + "maxLength": 255 + }, + "min_confidence": { + "type": "number", + "description": "0 = use the stream default." + } + }, + "x-lightnvr-source": "src/web/api_handlers_zones.c:handle_get_zones; include/database/db_zones.h" + }, + "ZonesResponse": { + "type": "object", + "required": [ + "zones" + ], + "properties": { + "zones": { + "type": "array", + "maxItems": 16, + "items": { + "$ref": "#/components/schemas/DetectionZone" + } + } + } + }, + "ClientConfig": { + "type": "object", + "required": [ + "go2rtc_enabled", + "web_auth_enabled", + "demo_mode", + "audio_disabled", + "auto_disabled", + "go2rtc_available", + "go2rtc_api_port", + "go2rtc_base_path", + "webrtc_disabled", + "hls_disabled", + "mse_disabled", + "default_playback_transport", + "go2rtc_force_native_hls", + "webrtc_connection_timeout_ms", + "webrtc_ice_recovery_timeout_ms", + "generate_thumbnails", + "thumbnails_per_recording" + ], + "properties": { + "go2rtc_enabled": { + "type": "boolean" + }, + "web_auth_enabled": { + "type": "boolean" + }, + "demo_mode": { + "type": "boolean" + }, + "audio_disabled": { + "type": "boolean" + }, + "auto_disabled": { + "type": "boolean" + }, + "go2rtc_available": { + "type": "boolean" + }, + "go2rtc_api_port": { + "$ref": "#/components/schemas/Int32" + }, + "go2rtc_base_path": { + "type": "string" + }, + "webrtc_disabled": { + "type": "boolean" + }, + "hls_disabled": { + "type": "boolean" + }, + "mse_disabled": { + "type": "boolean" + }, + "default_playback_transport": { + "$ref": "#/components/schemas/PlaybackTransport" + }, + "go2rtc_force_native_hls": { + "type": "boolean" + }, + "webrtc_connection_timeout_ms": { + "$ref": "#/components/schemas/Int32" + }, + "webrtc_ice_recovery_timeout_ms": { + "$ref": "#/components/schemas/Int32" + }, + "generate_thumbnails": { + "type": "boolean" + }, + "thumbnails_per_recording": { + "$ref": "#/components/schemas/Int32" + } + }, + "x-lightnvr-note": "snake_case only (D-06)." + }, + "DetectionModel": { + "type": "object", + "required": [ + "id", + "name", + "path", + "type", + "supported" + ], + "properties": { + "id": { + "type": "string", + "description": "Built-ins use motion, api-detection, onvif; file models use the absolute file path." + }, + "name": { + "type": "string" + }, + "path": { + "type": "string" + }, + "type": { + "type": "string", + "description": "Observed values include builtin, api, onvif, sod, sod_realnet, tflite." + }, + "supported": { + "type": "boolean" + }, + "description": { + "type": "string", + "description": "Built-ins only." + }, + "unsupported_reason": { + "type": "string" + }, + "size": { + "type": "number", + "minimum": 0, + "description": "File size in bytes (file models only)." + } + }, + "if": { + "required": [ + "supported" + ], + "properties": { + "supported": { + "const": false + } + } + }, + "then": { + "required": [ + "unsupported_reason" + ] + } + }, + "DetectionModelsResponse": { + "type": "object", + "required": [ + "models", + "litert_available", + "sod_available", + "count" + ], + "properties": { + "models": { + "type": "array", + "minItems": 3, + "items": { + "$ref": "#/components/schemas/DetectionModel" + }, + "x-lightnvr-builtin-prefix": [ + "motion", + "api-detection", + "onvif" + ] + }, + "litert_available": { + "type": "boolean" + }, + "sod_available": { + "type": "boolean" + }, + "count": { + "type": "integer", + "minimum": 3 + }, + "message": { + "const": "Models directory does not exist", + "description": "Present only when the models directory cannot be opened." + } + } + }, + "AuthRole": { + "type": "string", + "enum": [ + "admin", + "user", + "viewer", + "api", + "unknown" + ], + "x-lightnvr-source": "src/database/db_auth.c:db_auth_get_role_name" + }, + "AuthVerifyAuthenticated": { + "type": "object", + "required": [ + "authenticated", + "id", + "username", + "email", + "role", + "role_id", + "is_active", + "password_change_locked", + "must_change_password", + "auth_enabled", + "auth_timeout_hours", + "auth_absolute_timeout_hours", + "trusted_device_days" + ], + "properties": { + "authenticated": { + "const": true + }, + "id": { + "type": "integer" + }, + "username": { + "type": "string", + "maxLength": 63 + }, + "email": { + "type": "string", + "maxLength": 127 + }, + "role": { + "$ref": "#/components/schemas/AuthRole" + }, + "role_id": { + "type": "integer", + "minimum": 0, + "maximum": 3 + }, + "is_active": { + "type": "boolean" + }, + "password_change_locked": { + "type": "boolean" + }, + "must_change_password": { + "type": "boolean" + }, + "auth_enabled": { + "const": true + }, + "auth_timeout_hours": { + "type": "integer" + }, + "auth_absolute_timeout_hours": { + "type": "integer" + }, + "trusted_device_days": { + "type": "integer" + } + } + }, + "AuthVerifyAuthDisabled": { + "type": "object", + "required": [ + "authenticated", + "username", + "role", + "must_change_password", + "auth_enabled", + "auth_timeout_hours", + "auth_absolute_timeout_hours", + "trusted_device_days" + ], + "properties": { + "authenticated": { + "const": true + }, + "username": { + "const": "admin" + }, + "role": { + "const": "admin" + }, + "must_change_password": { + "const": false + }, + "auth_enabled": { + "const": false + }, + "auth_timeout_hours": { + "type": "integer" + }, + "auth_absolute_timeout_hours": { + "type": "integer" + }, + "trusted_device_days": { + "type": "integer" + } + } + }, + "AuthVerifyDemo": { + "type": "object", + "required": [ + "authenticated", + "demo_mode", + "username", + "role", + "must_change_password" + ], + "properties": { + "authenticated": { + "const": false + }, + "demo_mode": { + "const": true + }, + "username": { + "const": "demo" + }, + "role": { + "const": "viewer" + }, + "must_change_password": { + "const": false + } + } + }, + "AuthVerifyResponse": { + "oneOf": [ + { + "$ref": "#/components/schemas/AuthVerifyAuthenticated" + }, + { + "$ref": "#/components/schemas/AuthVerifyAuthDisabled" + }, + { + "$ref": "#/components/schemas/AuthVerifyDemo" + } + ] + } + }, + "parameters": { + "StreamNamePath": { + "name": "name", + "in": "path", + "required": true, + "description": "Stream name, percent-encoded as one path segment (the UI uses encodeURIComponent). Routing matches the *encoded* segment against `#` (a run of non-'/' characters), then http_request_extract_path_param decodes it with form semantics: `%XX` is decoded and a literal `+` becomes a space, so a name containing '+' must be sent as `%2B`. The entire encoded suffix after `/api/streams/` must be shorter than 256 bytes, including `/full` or `/zones`. Thus the encoded name limit is 255 bytes for PUT, 250 for `/full`, and 249 for `/zones`. Overflow answers 400 \"Invalid request path\" (\"Invalid stream name\" for zones; finding candidate F-T11-09). Names whose decoded form contains '/' (sent as `%2F`) are truncated at the first '/' by the `/full` handler and resolve to a different stream (finding candidate F-T11-08). Path segments that decode to `.` or `..` are rejected by the HTTP parser before routing.", + "schema": { + "$ref": "#/components/schemas/StreamName" + }, + "x-lightnvr-encoding": "percent-encode-path-segment", + "x-lightnvr-source": "src/web/request_response.c:http_request_extract_path_param,url_decode; src/web/libuv_connection.c:on_url_complete,request_path_has_dot_segment" + } + }, + "headers": { + "CacheControl": { + "description": "Every JSON response sets `no-cache, no-store, must-revalidate` (plus `Pragma: no-cache` and `Expires: 0`).", + "schema": { + "type": "string", + "const": "no-cache, no-store, must-revalidate" + }, + "x-lightnvr-source": "src/web/request_response.c:http_response_set_json" + } + }, + "responses": { + "BadRequest": { + "description": "Malformed path, query, or body. Message text is operation-specific.", + "headers": { + "Cache-Control": { + "$ref": "#/components/headers/CacheControl" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "Unauthorized": { + "description": "No authenticated principal (and demo mode is off). Body is `{\"error\":\"Unauthorized\"}`.", + "headers": { + "Cache-Control": { + "$ref": "#/components/headers/CacheControl" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + }, + "example": { + "error": "Unauthorized" + } + } + }, + "x-lightnvr-source": "src/web/httpd_utils.c:httpd_authorize_stream_action_with_context,httpd_authorize_action" + }, + "Forbidden": { + "description": "Authenticated but the authorization policy denied the action. Body is `{\"error\":\"Forbidden\"}`.", + "headers": { + "Cache-Control": { + "$ref": "#/components/headers/CacheControl" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + }, + "example": { + "error": "Forbidden" + } + } + }, + "x-lightnvr-source": "src/web/httpd_utils.c:httpd_authorize_stream_action_with_context,httpd_authorize_action" + }, + "StreamNotFound": { + "description": "`{\"error\":\"Stream not found\"}` when no stream with that name is loaded. This check runs BEFORE authentication, so unauthenticated callers can distinguish existing from missing names (finding candidate F-T11-01). `{\"error\":\"Camera not found\"}` is returned after authentication when the stream exists but has no fleet inventory row.", + "headers": { + "Cache-Control": { + "$ref": "#/components/headers/CacheControl" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + }, + "examples": { + "stream": { + "value": { + "error": "Stream not found" + } + }, + "camera": { + "value": { + "error": "Camera not found" + } + } + } + } + }, + "x-lightnvr-source": "src/web/api_handlers_streams_get.c:handle_get_stream_full; src/web/httpd_utils.c:httpd_authorize_stream_action_with_context" + }, + "PayloadTooLarge": { + "description": "A size-checked string field exceeded its buffer.", + "headers": { + "Cache-Control": { + "$ref": "#/components/headers/CacheControl" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "InternalError": { + "description": "Server-side failure (allocation, serialization, database read, or authorization policy evaluation error: `{\"error\":\"Authorization policy evaluation failed\"}`).", + "headers": { + "Cache-Control": { + "$ref": "#/components/headers/CacheControl" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "securitySchemes": { + "sessionCookie": { + "type": "apiKey", + "in": "cookie", + "name": "session", + "description": "HttpOnly session cookie set by POST /api/auth/login." + }, + "basicAuth": { + "type": "http", + "scheme": "basic" + }, + "apiKey": { + "type": "apiKey", + "in": "header", + "name": "X-API-Key", + "description": "API token (scoped tokens are accepted by the streams handlers but not by /api/auth/verify)." + }, + "bearerAuth": { + "type": "http", + "scheme": "bearer", + "description": "API token presented as a bearer credential." + } + } + } +} diff --git a/tests/quality/contracts.test.mjs b/tests/quality/contracts.test.mjs new file mode 100644 index 000000000..b886afa8e --- /dev/null +++ b/tests/quality/contracts.test.mjs @@ -0,0 +1,122 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +import { test, after } from 'node:test'; +import assert from 'node:assert/strict'; +import fs from 'node:fs/promises'; +import os from 'node:os'; +import path from 'node:path'; +import { pathToFileURL, fileURLToPath } from 'node:url'; +import { build } from 'esbuild'; +import { spawnSync } from 'node:child_process'; +import { buildArtifacts, writeArtifacts, checkArtifacts, loadContract } from '../../scripts/quality/contracts.mjs'; + +const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../..'); +const scratch = await fs.mkdtemp(path.join(os.tmpdir(), 'lightnvr-contracts-')); +after(() => fs.rm(scratch, { recursive: true, force: true })); +await fs.cp(path.join(root, 'docs/api'), path.join(scratch, 'docs/api'), { recursive: true }); +await fs.cp(path.join(root, 'tests/contracts/fixtures'), path.join(scratch, 'tests/contracts/fixtures'), { recursive: true }); +const artifacts = await buildArtifacts({ root: scratch }); +await writeArtifacts(scratch, artifacts); +const generated = await import(pathToFileURL(path.join(scratch, 'web/js/api/generated/validators.mjs'))); +const fixtureRoot = path.join(scratch, 'tests/contracts/fixtures/streams'); +const fixture = async name => JSON.parse(await fs.readFile(path.join(fixtureRoot, name), 'utf8')); + +test('all reviewed fixtures match their expected validation outcome', async () => { + const manifest = await fixture('index.json'); + assert.equal(manifest.fixtures.length, 91); + for (const entry of manifest.fixtures) { + const data = await fixture(entry.file); + const validator = generated['validate' + entry.schema.split('/').at(-1)]; + assert.equal(typeof validator, 'function', entry.file); + assert.equal(validator(data.body), entry.expect === 'valid', entry.file); + } +}); + +test('viewer models reject credentials without requiring sensitive fields', async () => { + const safe = (await fixture('full.live-only.sensitive-keys-absent.valid.json')).body; + assert.equal(generated.validateStreamFullResponseLiveOnly(safe), true); + safe.stream.onvif_password = 'synthetic-leak'; + assert.equal(generated.validateStreamFullResponseLiveOnly(safe), false); +}); + +test('permitted additive response fields work but client request drift fails', async () => { + const safe = (await fixture('client-config.valid.json')).body; + assert.equal(generated.validateClientConfig({ ...safe, future_addition: 1 }), true); + assert.equal(generated.validateStreamUpdateRequest({ record: true, unknown_option: 1 }), false); +}); + +test('UTF-8 byte bounds are enforced independently of Unicode character count', () => { + assert.equal(generated.validateStreamName('é'.repeat(127)), true); + assert.equal(generated.validateStreamName('é'.repeat(128)), false); + assert.equal(generated.validateStreamName('x'.repeat(255)), true); +}); + +test('JSON-in-string handles disabled, malformed and structurally wrong values', () => { + assert.equal(generated.validateEptzConfigString(''), true); + assert.equal(generated.validateEptzConfigString('{'), false); + assert.equal(generated.validateEptzConfigString('null'), false); + assert.equal(generated.validateEptzConfigString('{}'), false); +}); + +test('fresh generation is deterministic and check leaves checkout bytes untouched', async () => { + assert.deepEqual(await buildArtifacts({ root: scratch }), artifacts); + assert.deepEqual(await checkArtifacts(scratch, artifacts), []); + for (const [name, text] of Object.entries(artifacts)) assert.equal(await fs.readFile(path.join(scratch,name),'utf8'),text); +}); + +test('check rejects stale, missing and unexpected files without repairing them', async () => { + const filename='web/js/api/generated/types.ts'; + const target=path.join(scratch,filename); + await fs.writeFile(target, 'stale\n'); + assert.ok((await checkArtifacts(scratch, artifacts)).some(x => x.includes(filename))); + assert.equal(await fs.readFile(target,'utf8'),'stale\n'); + await fs.unlink(target); + assert.ok((await checkArtifacts(scratch,artifacts)).some(x => x.includes(filename))); + await fs.writeFile(target, artifacts[filename]); + const extra=path.join(scratch,'web/js/api/generated/forgotten.ts'); + await fs.writeFile(extra,'untracked'); + assert.ok((await checkArtifacts(scratch,artifacts)).some(x => x.includes('forgotten.ts'))); + await fs.unlink(extra); +}); + +test('operation manifest retains status/header and role/surface selection information', async () => { + const manifest=JSON.parse(artifacts['tests/contracts/generated/manifest.json']); + assert.deepEqual(manifest.operations.updateStream.success_statuses,[200,202]); + assert.ok(manifest.operations.getStreamFull.responses['200'].headers['Cache-Control']); + assert.equal(manifest.operations.getStreamFull.variant_by_field.field,'stream.can_control_privacy'); + assert.equal(manifest.operations.listStreams.variant_by_query.parameter,'surface'); +}); + +test('generated code has no compiler imports and can bundle for the browser', async () => { + const runtime=artifacts['web/js/api/generated/validators.mjs']; + assert.doesNotMatch(runtime, /(?1000); + for (const [name,source] of Object.entries(artifacts)) if(name.endsWith('.mjs')) assert.doesNotMatch(source,/x-lightnvr-source|src\/web\//); +}); + +test('one imported boundary does not retain all generated validators', async () => { + async function size(specifier, expression) { + const result=await build({stdin:{contents:`import ${specifier} from './web/js/api/generated/validators.mjs'; globalThis.boundary=${expression};`,resolveDir:scratch},bundle:true,write:false,format:'esm',platform:'browser',minify:true}); + return result.outputFiles[0].contents.length; + } + const one=await size('{validateClientConfig}','validateClientConfig'); + const all=await size('* as validators','validators'); + assert.ok(one < all / 2, `single boundary ${one} vs all ${all}`); +}); + +test('unresolved, remote and traversal refs fail before generation', async () => { + const doc=path.join(scratch,'docs/api/contracts/common.yaml'); + const original=await fs.readFile(doc,'utf8'); + for(const ref of ['#/components/schemas/DoesNotExist','https://example.invalid/schema.json','../../../package.json#/version']){ + await fs.writeFile(doc,original+`\n x-invalid:\n $ref: '${ref}'\n`); + await assert.rejects(loadContract(scratch)); + } + await fs.writeFile(doc,original); +}); + +test('git-untracked expected generated files cannot pass check', async () => { + assert.equal(spawnSync('git',['init','-q'],{cwd:scratch}).status,0); + const errors=await checkArtifacts(scratch,artifacts); + assert.ok(errors.some(x=>x.includes('untracked'))); + assert.equal(spawnSync('git',['add','web/js/api/generated','tests/contracts/generated'],{cwd:scratch}).status,0); + assert.deepEqual(await checkArtifacts(scratch,artifacts),[]); +}); diff --git a/web/js/api/generated/package.json b/web/js/api/generated/package.json new file mode 100644 index 000000000..7f1fc33dd --- /dev/null +++ b/web/js/api/generated/package.json @@ -0,0 +1,4 @@ +{ + "type": "module", + "sideEffects": false +} diff --git a/web/js/api/generated/types.ts b/web/js/api/generated/types.ts new file mode 100644 index 000000000..d232c0ad0 --- /dev/null +++ b/web/js/api/generated/types.ts @@ -0,0 +1,894 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export interface paths { + "/api/auth/verify": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Current principal (role and demo-mode gating for the Streams UI) + * @description Three 200 shapes: authentication disabled (synthetic admin), a real authenticated user, or demo-mode anonymous viewer. Uses httpd_get_authenticated_user (scoped API tokens are not accepted here although the streams handlers accept them). 401 also clears the session cookie. An authenticated user in demo mode receives no `demo_mode` key (F-T11-13). + */ + get: operations["verifyAuth"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/client-config": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Viewer-safe runtime playback configuration */ + get: operations["getClientConfig"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/detection/models": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Detection model options for the edit form + * @description 401 unauthenticated; 403 unless the principal has global camera.configure or camera.configure on at least one camera. Viewers therefore receive 403 and the UI shows no models (D-04). + */ + get: operations["listDetectionModels"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/streams": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List streams (paged summary for the pilot; legacy full list otherwise) + * @description Authentication is checked first (401). With `summary=true` (or `1`) the paged summary variant is returned; its row shape depends on `surface`. Rows are filtered per camera: `admin`/`live` require live.view, `lpr` requires both lpr.search and lpr.read. `can_configure` is the per-camera camera.configure decision. Query parameters are validated in this order: page/page_size, sort_by, sort_order, surface, availability. Without `summary`, the legacy unbounded array of full stream objects is returned (out of pilot; no current web/js caller) and every other query parameter is ignored. + */ + get: operations["listStreams"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/streams/{name}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + /** + * Update stream configuration (asynchronous apply) + * @description Order of checks: path decode (400 "Invalid request path"), stream lookup (404 "Stream not found", BEFORE authentication), configuration read (500), camera.configure authorization (401/404 "Camera not found"/403) BEFORE the body is parsed, then body parse (400 "Invalid JSON in request body" for an empty or unparsable body). Fields are applied in handler order; the first failing validation returns its error and nothing is stored. Present keys with the wrong JSON type are silently ignored (F-T11-05). A valid JSON body that is not an object (e.g. `null`, `[]`) is accepted as a no-op 202 (F-T11-04). If `isOnvif` is omitted the server recomputes it from whether `url` contains "onvif" (F-T11-11). When the effective isOnvif is true the handler copies onvif_username/onvif_password/onvif_profile, moves URL credentials into them, and runs an ONVIF connection test inline before responding; when false those three keys are ignored. `set_privacy_mode` short-circuits: after all other keys were parsed and validated (and `enable_disabled` already executed) it writes only privacy_mode and answers 200; other edits in the same body are discarded (F-T11-12). Otherwise the response is 202 and a detached worker applies the change; the 202 does not prove persistence. Errors in the 400 set: "playback_transport is invalid", "eptz_config must be a JSON string", "eptz_config exceeds size limit", "eptz_config is not a supported version-1 equidistant ceiling configuration", "retention_days must be between -1 and 365", "detection_retention_days must be between -1 and 365", "detection_url must use http, https, rtsp, or rtsps", "publish_url destinations must be rtmp:// or rtmps:// URLs". 413 set: "detection_url exceeds size limit", "publish_url exceeds size limit". + */ + put: operations["updateStream"]; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/streams/{name}/full": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Full stream detail used by the edit form + * @description Order of checks: path decode (400 "Invalid request path"), stream lookup (404 "Stream not found", BEFORE authentication), configuration read (500), authentication (401), fleet row (404 "Camera not found"), live.view (403). Callers with live.view but without camera.configure receive the live-only redacted variant; `can_control_privacy` equals the camera.configure decision and selects the variant. The response is wrapped as `{"stream": {...}}` (GET /api/streams/{name}, out of pilot, returns the same object unwrapped). The handler never emits `detection_zones` (D-02); zones come from GET /api/streams/{name}/zones. + */ + get: operations["getStreamFull"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/streams/{name}/zones": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Detection zones for a stream (read by the edit modal and ZoneEditor) + * @description No pre-auth existence check: 401 first, then 404 "Camera not found" for unknown names, 403 without live.view. Path decode failure is 400 "Invalid stream name". POST/DELETE on this path are out of pilot. + */ + get: operations["getStreamZones"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; +} +export type webhooks = Record; +export interface components { + schemas: { + /** @enum {string} */ + AuthRole: "admin" | "user" | "viewer" | "api" | "unknown"; + AuthVerifyAuthDisabled: { + auth_absolute_timeout_hours: number; + /** @constant */ + auth_enabled: false; + auth_timeout_hours: number; + /** @constant */ + authenticated: true; + /** @constant */ + must_change_password: false; + /** @constant */ + role: "admin"; + trusted_device_days: number; + /** @constant */ + username: "admin"; + }; + AuthVerifyAuthenticated: { + auth_absolute_timeout_hours: number; + /** @constant */ + auth_enabled: true; + auth_timeout_hours: number; + /** @constant */ + authenticated: true; + email: string; + id: number; + is_active: boolean; + must_change_password: boolean; + password_change_locked: boolean; + role: components["schemas"]["AuthRole"]; + role_id: number; + trusted_device_days: number; + username: string; + }; + AuthVerifyDemo: { + /** @constant */ + authenticated: false; + /** @constant */ + demo_mode: true; + /** @constant */ + must_change_password: false; + /** @constant */ + role: "viewer"; + /** @constant */ + username: "demo"; + }; + AuthVerifyResponse: components["schemas"]["AuthVerifyAuthenticated"] | components["schemas"]["AuthVerifyAuthDisabled"] | components["schemas"]["AuthVerifyDemo"]; + /** @enum {string} */ + Availability: "live" | "offline" | "never_connected" | "disabled"; + /** @description Immutable fleet identity (36-char UUID). Legacy rows created before camera UUIDs existed may carry an empty string. */ + CameraUuid: string; + ClientConfig: { + audio_disabled: boolean; + auto_disabled: boolean; + default_playback_transport: components["schemas"]["PlaybackTransport"]; + demo_mode: boolean; + generate_thumbnails: boolean; + go2rtc_api_port: components["schemas"]["Int32"]; + go2rtc_available: boolean; + go2rtc_base_path: string; + go2rtc_enabled: boolean; + go2rtc_force_native_hls: boolean; + hls_disabled: boolean; + mse_disabled: boolean; + thumbnails_per_recording: components["schemas"]["Int32"]; + web_auth_enabled: boolean; + webrtc_connection_timeout_ms: components["schemas"]["Int32"]; + webrtc_disabled: boolean; + webrtc_ice_recovery_timeout_ms: components["schemas"]["Int32"]; + }; + /** + * @description Fleet health first; when health is unknown and the stream is enabled, the stream-state/UDT status is used (adds Starting/Stopping/Reconnecting). + * @enum {string} + */ + DetailStatus: "Running" | "Degraded" | "Error" | "Stopped" | "Unknown" | "Starting" | "Stopping" | "Reconnecting"; + DetectionModel: { + /** @description Built-ins only. */ + description?: string; + /** @description Built-ins use motion, api-detection, onvif; file models use the absolute file path. */ + id: string; + name: string; + path: string; + /** @description File size in bytes (file models only). */ + size?: number; + supported: boolean; + /** @description Observed values include builtin, api, onvif, sod, sod_realnet, tflite. */ + type: string; + unsupported_reason?: string; + }; + DetectionModelsResponse: { + count: number; + litert_available: boolean; + /** + * @description Present only when the models directory cannot be opened. + * @constant + */ + message?: "Models directory does not exist"; + models: components["schemas"]["DetectionModel"][]; + sod_available: boolean; + }; + /** @description "" (use main stream) or a URL whose scheme is http, https, rtsp or rtsps (case-insensitive prefix check). Other schemes: 400. >= 512 bytes: 413 (scheme is checked first). null clears. */ + DetectionUrl: string | null; + DetectionZone: { + color: string; + enabled: boolean; + filter_classes: string; + id: string; + /** @description 0 = use the stream default. */ + min_confidence: number; + name: string; + polygon: components["schemas"]["ZonePoint"][]; + stream_name: components["schemas"]["StreamName"]; + }; + /** + * @description Redacted value. The server emits an empty string in place of a sensitive value. + * @constant + */ + EmptyString: ""; + /** @description Unix epoch seconds (int64). `0` means "never observed". */ + EpochSecondsOrZero: number; + /** @description "" (disabled) or JSON text of a version-1 equidistant ceiling dewarp document, at most 1023 bytes. The server stores it opaquely after validating; the document schema is EptzConfigV1. */ + EptzConfigString: string; + EptzConfigV1: { + centerX: number; + centerY: number; + defaultTilt: number; + defaultViewFov: number; + defaultYaw: number; + fov: number; + /** @constant */ + mount: "ceiling"; + /** @constant */ + projection: "equidistant"; + radius: number; + rotation: number; + /** @constant */ + version: 1; + }; + /** @description Error envelope used for every non-2xx JSON response in the pilot. Produced only by http_response_set_json_error(), which emits exactly one key. Clients must not depend on the message text for control flow except where an operation documents a specific message. */ + ErrorResponse: { + error: string; + }; + /** @description 168 booleans indexed `day * 24 + hour` in server local time, where day 0 = Sunday ... 6 = Saturday (struct tm tm_wday). Responses always carry exactly 168 entries. On PUT, an array whose length is not 168 is silently ignored (no error) and any entry other than JSON `true` is stored as false (finding candidate F-T11-07). */ + HourOfWeekSchedule: boolean[]; + /** @description C `int` read through cJSON `valueint` (fractional values are truncated, out-of-range values saturate). Used where the server performs no range validation of its own. */ + Int32: number; + /** @description Out of pilot (inventoried, not contract-tested by T18): GET /api/streams without summary. Bare unbounded array of the same objects as the /full detail, each redacted per camera. */ + LegacyStreamList: components["schemas"]["StreamDetail"][]; + /** @description Clearable text field. JSON null clears the stored value (same as ""). */ + NullableClearableString: string | null; + /** + * @description Responses substitute `auto` when the stored value is invalid, so a response never carries a value outside this enum. + * @enum {string} + */ + PlaybackTransport: "auto" | "webrtc_only" | "mse_only" | "hls_only" | "webrtc_then_mse" | "mse_then_hls"; + /** @description "" or a comma/whitespace-separated list of rtmp:// or rtmps:// destinations. Each destination is printable ASCII without quotes or backslash and has at least one character after the scheme. Invalid list: 400; whole string >= 512 bytes: 413 (validity is checked first). null clears. */ + PublishUrlList: string | null; + /** @description Tri-state per-stream retention override in days. `-1` inherits the live global retention value at evaluation time, `0` is explicitly unlimited (also disables tier expiry), and `1..365` is a day override. Writes outside -1..365 are rejected with 400. For `detection_retention_days`, `-1` inherits the *global* retention value, not this stream's `retention_days`. */ + RetentionDays: number; + /** @description Either variant, selected by can_control_privacy (mutually exclusive by const). */ + StreamDetail: components["schemas"]["StreamDetailConfigurable"] | components["schemas"]["StreamDetailLiveOnly"]; + /** @description Non-sensitive fields of the full stream object, emitted for every caller with live.view. Credential-bearing keys (url, onvif_username, onvif_password, admin_url, go2rtc_source_override, sub_stream_url, detection_url, publish_url) are declared here only as strings and are NOT required; each variant pins them. */ + StreamDetailBase: { + admin_url?: string; + audio_voice_enhancement: boolean; + backchannel_enabled: boolean; + camera_uuid: components["schemas"]["CameraUuid"]; + can_control_privacy: boolean; + codec: string; + detection_based_recording: boolean; + detection_interval: components["schemas"]["Int32"]; + detection_model: string; + detection_object_filter: string; + detection_object_filter_list: string; + detection_record_on_schedule: boolean; + detection_recording_schedule: components["schemas"]["HourOfWeekSchedule"]; + detection_retention_days: components["schemas"]["RetentionDays"]; + /** @description Integer percent: (int)(stored_float * 100.0f), truncated toward zero. Not a 0..1 float on the wire. */ + detection_threshold: number; + detection_url?: string; + enabled: boolean; + eptz_config: components["schemas"]["EptzConfigString"]; + /** @description Present only when status is Error and a cause was recorded (currently model-load failures). */ + error_message?: string; + fps: components["schemas"]["Int32"]; + go2rtc_hls_available: boolean; + go2rtc_source_override?: string; + /** @description Presence of a sub-stream; visible to viewers by design. */ + has_sub_stream: boolean; + height: components["schemas"]["Int32"]; + isOnvif: boolean; + location_uuid: components["schemas"]["CameraUuid"]; + /** @description Quota in MB; 0 = unlimited. */ + max_storage_mb: components["schemas"]["Int32"]; + motion_trigger_source: string; + name: components["schemas"]["StreamName"]; + onvif_password?: string; + /** @description 0 = derive from the stream URL. */ + onvif_port: components["schemas"]["Int32"]; + onvif_profile: string; + onvif_username?: string; + playback_transport: components["schemas"]["PlaybackTransport"]; + post_detection_buffer: components["schemas"]["Int32"]; + pre_detection_buffer: components["schemas"]["Int32"]; + priority: components["schemas"]["Int32"]; + privacy_mode: boolean; + protocol: components["schemas"]["StreamProtocol"]; + ptz_enabled: boolean; + ptz_has_home: boolean; + ptz_max_x: components["schemas"]["Int32"]; + ptz_max_y: components["schemas"]["Int32"]; + ptz_max_z: components["schemas"]["Int32"]; + publish_url?: string; + record: boolean; + record_audio: boolean; + record_on_schedule: boolean; + recording_schedule: components["schemas"]["HourOfWeekSchedule"]; + retention_days: components["schemas"]["RetentionDays"]; + segment_duration: components["schemas"]["Int32"]; + status: components["schemas"]["DetailStatus"]; + storage_priority: components["schemas"]["Int32"]; + streaming_enabled: boolean; + sub_stream_url?: string; + tags: string; + tier_critical_multiplier: number; + tier_ephemeral_multiplier: number; + tier_important_multiplier: number; + url?: string; + width: components["schemas"]["Int32"]; + }; + /** @description Admin edit model: caller has camera.configure on this camera (can_control_privacy = true). Sensitive fields carry real values. When separate credentials are in use (isOnvif, or non-empty onvif_username/onvif_password) the server strips userinfo from `url` and surfaces it through the onvif_* fields. */ + StreamDetailConfigurable: components["schemas"]["StreamDetailBase"] & { + /** @constant */ + can_control_privacy?: true; + }; + /** @description Viewer (live.view without camera.configure) model. Every credential-bearing key is OPTIONAL (a server that stops sending it is compatible) but, if present, must be redacted: onvif_* and the administrative URLs must be exactly "", and `url` must be credential-free (no userinfo, no secret-like query parameter). A leaked value therefore fails validation. */ + StreamDetailLiveOnly: components["schemas"]["StreamDetailBase"] & { + admin_url?: components["schemas"]["EmptyString"]; + /** @constant */ + can_control_privacy?: false; + detection_url?: components["schemas"]["EmptyString"]; + go2rtc_source_override?: components["schemas"]["EmptyString"]; + onvif_password?: components["schemas"]["EmptyString"]; + onvif_username?: components["schemas"]["EmptyString"]; + publish_url?: components["schemas"]["EmptyString"]; + sub_stream_url?: components["schemas"]["EmptyString"]; + url?: components["schemas"]["ViewerSafeUrl"]; + }; + StreamFullResponse: { + stream: components["schemas"]["StreamDetail"]; + }; + StreamFullResponseConfigurable: { + stream: components["schemas"]["StreamDetailConfigurable"]; + }; + StreamFullResponseLiveOnly: { + stream: components["schemas"]["StreamDetailLiveOnly"]; + }; + /** @description Stream (camera) name as stored. This is the primary key used in paths. Names created through POST /api/streams must match `^[A-Za-z0-9_-][A-Za-z0-9._-]*$` (is_valid_stream_name), but names that predate that rule or arrive through configuration import can contain other characters, so the read-side schema only bounds the length. */ + StreamName: string; + /** @description Live privacy toggle (used by Live video cells, not the edit form). Modelled as its own closed body because the server discards every other edit when this key is present (F-T11-12). */ + StreamPrivacyModeRequest: { + set_privacy_mode: boolean; + }; + /** @description Always success:true, even if the database write failed (the failure is only logged; F-T11-12). */ + StreamPrivacyModeResponse: { + privacy_mode: boolean; + /** @constant */ + success: true; + }; + /** + * @description Transport protocol: 0 = TCP, 1 = UDP (stream_protocol_t). PUT does not range-check this value (see finding candidate F-T11-06); the contract only permits the two defined values. + * @enum {integer} + */ + StreamProtocol: 0 | 1; + /** @description surface=admin row. `admin_url` appears only with include_admin_url and must be "" when can_configure is false. */ + StreamSummaryAdmin: components["schemas"]["StreamSummaryBase"] & { + admin_url?: string; + }; + /** @description Fields shared by admin and live summary rows (always emitted). */ + StreamSummaryBase: { + availability: components["schemas"]["Availability"]; + camera_uuid: components["schemas"]["CameraUuid"]; + /** @description Per-camera camera.configure decision. Authoritative for edit affordances (D-05). */ + can_configure: boolean; + codec: string; + current_fps: number; + detection_based_recording: boolean; + enabled: boolean; + first_video_at: components["schemas"]["EpochSecondsOrZero"]; + fps: components["schemas"]["Int32"]; + height: components["schemas"]["Int32"]; + isOnvif: boolean; + last_frame_ts: components["schemas"]["EpochSecondsOrZero"]; + last_recording_at: components["schemas"]["EpochSecondsOrZero"]; + location_name: string; + location_path: string; + location_uuid: components["schemas"]["CameraUuid"]; + name: components["schemas"]["StreamName"]; + protocol: components["schemas"]["StreamProtocol"]; + record: boolean; + record_on_schedule: boolean; + recording_active: boolean; + status: components["schemas"]["SummaryStatus"]; + /** @description Comma-separated legacy tags. */ + tags: string; + width: components["schemas"]["Int32"]; + } & components["schemas"]["SummaryForbiddenSensitiveKeys"]; + /** @description surface=live row. Never carries admin_url. */ + StreamSummaryLive: components["schemas"]["StreamSummaryBase"] & { + backchannel_enabled: boolean; + /** @description Equals can_configure for the row. */ + can_control_privacy: boolean; + detection_model: string; + eptz_config: components["schemas"]["EptzConfigString"]; + go2rtc_hls_available: boolean; + has_sub_stream: boolean; + playback_transport: components["schemas"]["PlaybackTransport"]; + privacy_mode: boolean; + ptz_enabled: boolean; + streaming_enabled: boolean; + }; + /** @description surface=lpr row. LPR discovery grants identity only, so this object is closed: any extra key (configuration, location, health) is a policy leak. */ + StreamSummaryLpr: { + camera_uuid: components["schemas"]["CameraUuid"]; + name: components["schemas"]["StreamName"]; + }; + StreamSummaryPageAdmin: components["schemas"]["SummaryPageMeta"] & { + streams: components["schemas"]["StreamSummaryAdmin"][]; + }; + StreamSummaryPageLive: components["schemas"]["SummaryPageMeta"] & { + streams: components["schemas"]["StreamSummaryLive"][]; + }; + StreamSummaryPageLpr: components["schemas"]["SummaryPageMeta"] & { + streams: components["schemas"]["StreamSummaryLpr"][]; + }; + StreamUpdateAccepted: { + /** @constant */ + message: "Stream update request accepted and processing"; + /** @enum {string} */ + onvif_message?: "ONVIF capabilities detected successfully" | "Failed to detect ONVIF capabilities"; + /** + * @description Present when the effective isOnvif was true and the inline ONVIF test ran. + * @enum {string} + */ + onvif_status?: "success" | "error"; + /** @constant */ + success: true; + }; + /** @description Edit-form body. All keys optional (partial update). Closed: the server ignores unknown keys (including `name` and the UI's `is_deleted`, D-01) but the contract rejects them so client drift is visible. Wrong-typed values are silently ignored by the server (F-T11-05). Top-level numeric fields have no server-side range checks except retention (F-T11-06); the JSON embedded in eptz_config is separately range-checked. Over-long strings are silently truncated unless `x-lightnvr-overflow` says otherwise (F-T11-14). */ + StreamUpdateRequest: { + admin_url?: components["schemas"]["NullableClearableString"]; + audio_voice_enhancement?: boolean; + backchannel_enabled?: boolean; + /** @description Codec hint; the UI sends "" (auto), "h264" or "h265". Not validated. */ + codec?: string; + detection_based_recording?: boolean; + detection_interval?: components["schemas"]["Int32"]; + /** @description Copied through a 256-byte buffer although the stored field holds 511 bytes. */ + detection_model?: string; + detection_object_filter?: string; + detection_object_filter_list?: string; + detection_record_on_schedule?: boolean; + detection_recording_schedule?: components["schemas"]["HourOfWeekSchedule"]; + detection_retention_days?: components["schemas"]["RetentionDays"]; + /** @description Percent; stored as value / 100.0 (float). Not range-checked. */ + detection_threshold?: number; + detection_url?: components["schemas"]["DetectionUrl"]; + /** @description Out of pilot (enable/bulk-enable). `true` re-enables a disabled stream synchronously, even when the same body also carries set_privacy_mode. */ + enable_disabled?: boolean; + enabled?: boolean; + eptz_config?: components["schemas"]["EptzConfigString"]; + /** @description Whitespace-only is stored as "". Not YAML-validated by PUT. */ + go2rtc_source_override?: components["schemas"]["NullableClearableString"]; + /** @description When omitted the server recomputes it from `url` containing "onvif" (F-T11-11). The UI always sends it. */ + isOnvif?: boolean; + /** @description 0 = unlimited. */ + max_storage_mb?: components["schemas"]["Int32"]; + /** @description Another stream's name; existence is not checked. */ + motion_trigger_source?: components["schemas"]["NullableClearableString"]; + /** @description Applied only when the effective isOnvif is true; "" clears the stored value (no "unchanged" sentinel). */ + onvif_password?: string; + onvif_port?: components["schemas"]["Int32"]; + /** @description Applied only when the effective isOnvif is true. */ + onvif_profile?: string; + /** @description Applied only when the effective isOnvif is true; "" clears the stored value (no "unchanged" sentinel). */ + onvif_username?: string; + playback_transport?: components["schemas"]["PlaybackTransport"]; + post_detection_buffer?: components["schemas"]["Int32"]; + pre_detection_buffer?: components["schemas"]["Int32"]; + priority?: components["schemas"]["Int32"]; + protocol?: components["schemas"]["StreamProtocol"]; + ptz_enabled?: boolean; + ptz_has_home?: boolean; + ptz_max_x?: components["schemas"]["Int32"]; + ptz_max_y?: components["schemas"]["Int32"]; + ptz_max_z?: components["schemas"]["Int32"]; + publish_url?: components["schemas"]["PublishUrlList"]; + record?: boolean; + record_audio?: boolean; + record_on_schedule?: boolean; + recording_schedule?: components["schemas"]["HourOfWeekSchedule"]; + retention_days?: components["schemas"]["RetentionDays"]; + /** @description Seconds. */ + segment_duration?: components["schemas"]["Int32"]; + storage_priority?: components["schemas"]["Int32"]; + streaming_enabled?: boolean; + sub_stream_url?: components["schemas"]["NullableClearableString"]; + tags?: components["schemas"]["NullableClearableString"]; + tier_critical_multiplier?: number; + tier_ephemeral_multiplier?: number; + tier_important_multiplier?: number; + /** @description Not validated (an empty string is accepted). A change requires a stream restart. */ + url?: string; + }; + /** @description Summary rows never carry credential-bearing configuration. Presence of any of these keys is a redaction failure regardless of value. */ + SummaryForbiddenSensitiveKeys: unknown; + SummaryPageMeta: { + page: number; + page_size: number; + /** @description Rows visible to the caller after filtering. */ + total: number; + /** @description 0 when total is 0, else ceil(total / page_size). */ + total_pages: number; + }; + /** @enum {string} */ + SummaryStatus: "Running" | "Degraded" | "Error" | "Stopped" | "Unknown"; + /** @description Rejects a URL whose query string carries a non-empty parameter whose key contains pass, pwd, token, secret or apikey (case-insensitive). The C redaction only strips userinfo, so a camera URL like `rtsp://host/live?user=admin&password=x` currently reaches viewers unchanged. This rule is the redaction policy the contract enforces; a server response that violates it is a finding (F-T11-03), not a schema bug. */ + UrlWithoutQuerySecrets: string; + /** @description A URL-like string that carries no userinfo (`user:pass@`) in its authority. Empty string is permitted (viewer redaction falls back to "" when credential stripping fails). A response that contains userinfo here is a credential leak and must fail validation. */ + UrlWithoutUserinfo: string; + /** @description Credential-free URL as delivered to principals without camera.configure. */ + ViewerSafeUrl: components["schemas"]["UrlWithoutUserinfo"] & components["schemas"]["UrlWithoutQuerySecrets"]; + ZonePoint: { + /** @description Normalized 0..1 (not re-validated on read). */ + x: number; + /** @description Normalized 0..1 (not re-validated on read). */ + y: number; + }; + ZonesResponse: { + zones: components["schemas"]["DetectionZone"][]; + }; + }; + responses: { + /** @description Malformed path, query, or body. Message text is operation-specific. */ + BadRequest: { + headers: { + "Cache-Control": components["headers"]["CacheControl"]; + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Authenticated but the authorization policy denied the action. Body is `{"error":"Forbidden"}`. */ + Forbidden: { + headers: { + "Cache-Control": components["headers"]["CacheControl"]; + [name: string]: unknown; + }; + content: { + /** + * @example { + * "error": "Forbidden" + * } + */ + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Server-side failure (allocation, serialization, database read, or authorization policy evaluation error: `{"error":"Authorization policy evaluation failed"}`). */ + InternalError: { + headers: { + "Cache-Control": components["headers"]["CacheControl"]; + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description A size-checked string field exceeded its buffer. */ + PayloadTooLarge: { + headers: { + "Cache-Control": components["headers"]["CacheControl"]; + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description `{"error":"Stream not found"}` when no stream with that name is loaded. This check runs BEFORE authentication, so unauthenticated callers can distinguish existing from missing names (finding candidate F-T11-01). `{"error":"Camera not found"}` is returned after authentication when the stream exists but has no fleet inventory row. */ + StreamNotFound: { + headers: { + "Cache-Control": components["headers"]["CacheControl"]; + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description No authenticated principal (and demo mode is off). Body is `{"error":"Unauthorized"}`. */ + Unauthorized: { + headers: { + "Cache-Control": components["headers"]["CacheControl"]; + [name: string]: unknown; + }; + content: { + /** + * @example { + * "error": "Unauthorized" + * } + */ + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + parameters: { + /** @description Stream name, percent-encoded as one path segment (the UI uses encodeURIComponent). Routing matches the *encoded* segment against `#` (a run of non-'/' characters), then http_request_extract_path_param decodes it with form semantics: `%XX` is decoded and a literal `+` becomes a space, so a name containing '+' must be sent as `%2B`. The entire encoded suffix after `/api/streams/` must be shorter than 256 bytes, including `/full` or `/zones`. Thus the encoded name limit is 255 bytes for PUT, 250 for `/full`, and 249 for `/zones`. Overflow answers 400 "Invalid request path" ("Invalid stream name" for zones; finding candidate F-T11-09). Names whose decoded form contains '/' (sent as `%2F`) are truncated at the first '/' by the `/full` handler and resolve to a different stream (finding candidate F-T11-08). Path segments that decode to `.` or `..` are rejected by the HTTP parser before routing. */ + StreamNamePath: components["schemas"]["StreamName"]; + }; + requestBodies: never; + headers: { + /** @description Every JSON response sets `no-cache, no-store, must-revalidate` (plus `Pragma: no-cache` and `Expires: 0`). */ + CacheControl: "no-cache, no-store, must-revalidate"; + }; + pathItems: never; +} +export type $defs = Record; +export interface operations { + verifyAuth: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Principal description. */ + 200: { + headers: { + "Cache-Control": components["headers"]["CacheControl"]; + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AuthVerifyResponse"]; + }; + }; + 401: components["responses"]["Unauthorized"]; + }; + }; + getClientConfig: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Client configuration. */ + 200: { + headers: { + "Cache-Control": components["headers"]["CacheControl"]; + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ClientConfig"]; + }; + }; + 401: components["responses"]["Unauthorized"]; + 500: components["responses"]["InternalError"]; + }; + }; + listDetectionModels: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Built-in models first (motion, api-detection, onvif), then file models. */ + 200: { + headers: { + "Cache-Control": components["headers"]["CacheControl"]; + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["DetectionModelsResponse"]; + }; + }; + 401: components["responses"]["Unauthorized"]; + 403: components["responses"]["Forbidden"]; + 500: components["responses"]["InternalError"]; + }; + }; + listStreams: { + parameters: { + query?: { + /** @description Invalid: 400 "Invalid availability value". */ + availability?: "all" | "live" | "offline" | "never_connected" | "disabled"; + /** @description Exactly `true` or `1` adds `admin_url` to rows on the admin surface (never on live/lpr). Rows without camera.configure get "". */ + include_admin_url?: string; + /** @description Decimal integer parsed by strtol: leading whitespace and a plus sign are accepted, but trailing whitespace/suffixes are rejected. Empty or out of range: 400 "page and page_size must be positive; page_size max is 100". A page beyond the last returns an empty `streams` array with the real totals. */ + page?: number; + /** @description Out of range: 400 "page and page_size must be positive; page_size max is 100". */ + page_size?: number; + /** @description Case-insensitive substring over name, camera_uuid, tags, location path and inventory address. Values longer than 255 bytes are silently truncated. */ + search?: string; + /** @description Invalid: 400 "Invalid stream summary sort field". Ties break on case-insensitive name. */ + sort_by?: "name" | "status" | "resolution" | "fps" | "recording"; + /** @description Invalid: 400 "sort_order must be asc or desc". */ + sort_order?: "asc" | "desc"; + /** @description Exactly `true` or `1` selects the summary variant; any other value (including `TRUE`) selects the legacy list. */ + summary?: string; + /** @description Invalid value: 400 "surface must be admin, live or lpr". */ + surface?: "admin" | "live" | "lpr"; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Summary page (surface-specific) or legacy array. */ + 200: { + headers: { + "Cache-Control": components["headers"]["CacheControl"]; + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["StreamSummaryPageAdmin"] | components["schemas"]["StreamSummaryPageLive"] | components["schemas"]["StreamSummaryPageLpr"] | components["schemas"]["LegacyStreamList"]; + }; + }; + 400: components["responses"]["BadRequest"]; + 401: components["responses"]["Unauthorized"]; + /** @description Includes "Authorization policy evaluation failed", which is also returned for the WHOLE list when any stream lacks a fleet inventory row (finding candidate F-T11-10). */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + updateStream: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Stream name, percent-encoded as one path segment (the UI uses encodeURIComponent). Routing matches the *encoded* segment against `#` (a run of non-'/' characters), then http_request_extract_path_param decodes it with form semantics: `%XX` is decoded and a literal `+` becomes a space, so a name containing '+' must be sent as `%2B`. The entire encoded suffix after `/api/streams/` must be shorter than 256 bytes, including `/full` or `/zones`. Thus the encoded name limit is 255 bytes for PUT, 250 for `/full`, and 249 for `/zones`. Overflow answers 400 "Invalid request path" ("Invalid stream name" for zones; finding candidate F-T11-09). Names whose decoded form contains '/' (sent as `%2F`) are truncated at the first '/' by the `/full` handler and resolve to a different stream (finding candidate F-T11-08). Path segments that decode to `.` or `..` are rejected by the HTTP parser before routing. */ + name: components["parameters"]["StreamNamePath"]; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["StreamUpdateRequest"] | components["schemas"]["StreamPrivacyModeRequest"]; + }; + }; + responses: { + /** @description set_privacy_mode short-circuit result. */ + 200: { + headers: { + "Cache-Control": components["headers"]["CacheControl"]; + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["StreamPrivacyModeResponse"]; + }; + }; + /** @description Update accepted; applied asynchronously by a worker thread. */ + 202: { + headers: { + "Cache-Control": components["headers"]["CacheControl"]; + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["StreamUpdateAccepted"]; + }; + }; + 400: components["responses"]["BadRequest"]; + 401: components["responses"]["Unauthorized"]; + 403: components["responses"]["Forbidden"]; + 404: components["responses"]["StreamNotFound"]; + 413: components["responses"]["PayloadTooLarge"]; + 500: components["responses"]["InternalError"]; + }; + }; + getStreamFull: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Stream name, percent-encoded as one path segment (the UI uses encodeURIComponent). Routing matches the *encoded* segment against `#` (a run of non-'/' characters), then http_request_extract_path_param decodes it with form semantics: `%XX` is decoded and a literal `+` becomes a space, so a name containing '+' must be sent as `%2B`. The entire encoded suffix after `/api/streams/` must be shorter than 256 bytes, including `/full` or `/zones`. Thus the encoded name limit is 255 bytes for PUT, 250 for `/full`, and 249 for `/zones`. Overflow answers 400 "Invalid request path" ("Invalid stream name" for zones; finding candidate F-T11-09). Names whose decoded form contains '/' (sent as `%2F`) are truncated at the first '/' by the `/full` handler and resolve to a different stream (finding candidate F-T11-08). Path segments that decode to `.` or `..` are rejected by the HTTP parser before routing. */ + name: components["parameters"]["StreamNamePath"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Stream detail, configure or live-only variant. */ + 200: { + headers: { + "Cache-Control": components["headers"]["CacheControl"]; + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["StreamFullResponse"]; + }; + }; + 400: components["responses"]["BadRequest"]; + 401: components["responses"]["Unauthorized"]; + 403: components["responses"]["Forbidden"]; + 404: components["responses"]["StreamNotFound"]; + 500: components["responses"]["InternalError"]; + }; + }; + getStreamZones: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Stream name, percent-encoded as one path segment (the UI uses encodeURIComponent). Routing matches the *encoded* segment against `#` (a run of non-'/' characters), then http_request_extract_path_param decodes it with form semantics: `%XX` is decoded and a literal `+` becomes a space, so a name containing '+' must be sent as `%2B`. The entire encoded suffix after `/api/streams/` must be shorter than 256 bytes, including `/full` or `/zones`. Thus the encoded name limit is 255 bytes for PUT, 250 for `/full`, and 249 for `/zones`. Overflow answers 400 "Invalid request path" ("Invalid stream name" for zones; finding candidate F-T11-09). Names whose decoded form contains '/' (sent as `%2F`) are truncated at the first '/' by the `/full` handler and resolve to a different stream (finding candidate F-T11-08). Path segments that decode to `.` or `..` are rejected by the HTTP parser before routing. */ + name: components["parameters"]["StreamNamePath"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Zones for the stream (possibly empty). */ + 200: { + headers: { + "Cache-Control": components["headers"]["CacheControl"]; + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ZonesResponse"]; + }; + }; + 400: components["responses"]["BadRequest"]; + 401: components["responses"]["Unauthorized"]; + 403: components["responses"]["Forbidden"]; + 404: components["responses"]["StreamNotFound"]; + 500: components["responses"]["InternalError"]; + }; + }; +} diff --git a/web/js/api/generated/validators.d.mts b/web/js/api/generated/validators.d.mts new file mode 100644 index 000000000..6d392364d --- /dev/null +++ b/web/js/api/generated/validators.d.mts @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +import type { components } from './types.js'; + +export interface ValidationIssue { readonly instancePath: string; readonly schemaPath: string; readonly keyword: string; readonly params: Readonly>; readonly message?: string; } +export interface ContractValidator { (data: unknown): data is T; errors?: readonly ValidationIssue[] | null; } + +export const validateAuthRole: ContractValidator; +export const validateAuthVerifyAuthDisabled: ContractValidator; +export const validateAuthVerifyAuthenticated: ContractValidator; +export const validateAuthVerifyDemo: ContractValidator; +export const validateAuthVerifyResponse: ContractValidator; +export const validateAvailability: ContractValidator; +export const validateCameraUuid: ContractValidator; +export const validateClientConfig: ContractValidator; +export const validateDetailStatus: ContractValidator; +export const validateDetectionModel: ContractValidator; +export const validateDetectionModelsResponse: ContractValidator; +export const validateDetectionUrl: ContractValidator; +export const validateDetectionZone: ContractValidator; +export const validateEmptyString: ContractValidator; +export const validateEpochSecondsOrZero: ContractValidator; +export const validateEptzConfigString: ContractValidator; +export const validateEptzConfigV1: ContractValidator; +export const validateErrorResponse: ContractValidator; +export const validateHourOfWeekSchedule: ContractValidator; +export const validateInt32: ContractValidator; +export const validateLegacyStreamList: ContractValidator; +export const validateNullableClearableString: ContractValidator; +export const validatePlaybackTransport: ContractValidator; +export const validatePublishUrlList: ContractValidator; +export const validateRetentionDays: ContractValidator; +export const validateStreamDetail: ContractValidator; +export const validateStreamDetailBase: ContractValidator; +export const validateStreamDetailConfigurable: ContractValidator; +export const validateStreamDetailLiveOnly: ContractValidator; +export const validateStreamFullResponse: ContractValidator; +export const validateStreamFullResponseConfigurable: ContractValidator; +export const validateStreamFullResponseLiveOnly: ContractValidator; +export const validateStreamName: ContractValidator; +export const validateStreamPrivacyModeRequest: ContractValidator; +export const validateStreamPrivacyModeResponse: ContractValidator; +export const validateStreamProtocol: ContractValidator; +export const validateStreamSummaryAdmin: ContractValidator; +export const validateStreamSummaryBase: ContractValidator; +export const validateStreamSummaryLive: ContractValidator; +export const validateStreamSummaryLpr: ContractValidator; +export const validateStreamSummaryPageAdmin: ContractValidator; +export const validateStreamSummaryPageLive: ContractValidator; +export const validateStreamSummaryPageLpr: ContractValidator; +export const validateStreamUpdateAccepted: ContractValidator; +export const validateStreamUpdateRequest: ContractValidator; +export const validateSummaryForbiddenSensitiveKeys: ContractValidator; +export const validateSummaryPageMeta: ContractValidator; +export const validateSummaryStatus: ContractValidator; +export const validateUrlWithoutQuerySecrets: ContractValidator; +export const validateUrlWithoutUserinfo: ContractValidator; +export const validateViewerSafeUrl: ContractValidator; +export const validateZonePoint: ContractValidator; +export const validateZonesResponse: ContractValidator; diff --git a/web/js/api/generated/validators.mjs b/web/js/api/generated/validators.mjs new file mode 100644 index 000000000..89f427211 --- /dev/null +++ b/web/js/api/generated/validators.mjs @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateAuthRole } from './validators/AuthRole.mjs'; +export { validateAuthVerifyAuthDisabled } from './validators/AuthVerifyAuthDisabled.mjs'; +export { validateAuthVerifyAuthenticated } from './validators/AuthVerifyAuthenticated.mjs'; +export { validateAuthVerifyDemo } from './validators/AuthVerifyDemo.mjs'; +export { validateAuthVerifyResponse } from './validators/AuthVerifyResponse.mjs'; +export { validateAvailability } from './validators/Availability.mjs'; +export { validateCameraUuid } from './validators/CameraUuid.mjs'; +export { validateClientConfig } from './validators/ClientConfig.mjs'; +export { validateDetailStatus } from './validators/DetailStatus.mjs'; +export { validateDetectionModel } from './validators/DetectionModel.mjs'; +export { validateDetectionModelsResponse } from './validators/DetectionModelsResponse.mjs'; +export { validateDetectionUrl } from './validators/DetectionUrl.mjs'; +export { validateDetectionZone } from './validators/DetectionZone.mjs'; +export { validateEmptyString } from './validators/EmptyString.mjs'; +export { validateEpochSecondsOrZero } from './validators/EpochSecondsOrZero.mjs'; +export { validateEptzConfigString } from './validators/EptzConfigString.mjs'; +export { validateEptzConfigV1 } from './validators/EptzConfigV1.mjs'; +export { validateErrorResponse } from './validators/ErrorResponse.mjs'; +export { validateHourOfWeekSchedule } from './validators/HourOfWeekSchedule.mjs'; +export { validateInt32 } from './validators/Int32.mjs'; +export { validateLegacyStreamList } from './validators/LegacyStreamList.mjs'; +export { validateNullableClearableString } from './validators/NullableClearableString.mjs'; +export { validatePlaybackTransport } from './validators/PlaybackTransport.mjs'; +export { validatePublishUrlList } from './validators/PublishUrlList.mjs'; +export { validateRetentionDays } from './validators/RetentionDays.mjs'; +export { validateStreamDetail } from './validators/StreamDetail.mjs'; +export { validateStreamDetailBase } from './validators/StreamDetailBase.mjs'; +export { validateStreamDetailConfigurable } from './validators/StreamDetailConfigurable.mjs'; +export { validateStreamDetailLiveOnly } from './validators/StreamDetailLiveOnly.mjs'; +export { validateStreamFullResponse } from './validators/StreamFullResponse.mjs'; +export { validateStreamFullResponseConfigurable } from './validators/StreamFullResponseConfigurable.mjs'; +export { validateStreamFullResponseLiveOnly } from './validators/StreamFullResponseLiveOnly.mjs'; +export { validateStreamName } from './validators/StreamName.mjs'; +export { validateStreamPrivacyModeRequest } from './validators/StreamPrivacyModeRequest.mjs'; +export { validateStreamPrivacyModeResponse } from './validators/StreamPrivacyModeResponse.mjs'; +export { validateStreamProtocol } from './validators/StreamProtocol.mjs'; +export { validateStreamSummaryAdmin } from './validators/StreamSummaryAdmin.mjs'; +export { validateStreamSummaryBase } from './validators/StreamSummaryBase.mjs'; +export { validateStreamSummaryLive } from './validators/StreamSummaryLive.mjs'; +export { validateStreamSummaryLpr } from './validators/StreamSummaryLpr.mjs'; +export { validateStreamSummaryPageAdmin } from './validators/StreamSummaryPageAdmin.mjs'; +export { validateStreamSummaryPageLive } from './validators/StreamSummaryPageLive.mjs'; +export { validateStreamSummaryPageLpr } from './validators/StreamSummaryPageLpr.mjs'; +export { validateStreamUpdateAccepted } from './validators/StreamUpdateAccepted.mjs'; +export { validateStreamUpdateRequest } from './validators/StreamUpdateRequest.mjs'; +export { validateSummaryForbiddenSensitiveKeys } from './validators/SummaryForbiddenSensitiveKeys.mjs'; +export { validateSummaryPageMeta } from './validators/SummaryPageMeta.mjs'; +export { validateSummaryStatus } from './validators/SummaryStatus.mjs'; +export { validateUrlWithoutQuerySecrets } from './validators/UrlWithoutQuerySecrets.mjs'; +export { validateUrlWithoutUserinfo } from './validators/UrlWithoutUserinfo.mjs'; +export { validateViewerSafeUrl } from './validators/ViewerSafeUrl.mjs'; +export { validateZonePoint } from './validators/ZonePoint.mjs'; +export { validateZonesResponse } from './validators/ZonesResponse.mjs'; diff --git a/web/js/api/generated/validators/AuthRole.d.mts b/web/js/api/generated/validators/AuthRole.d.mts new file mode 100644 index 000000000..ce8c5a6fe --- /dev/null +++ b/web/js/api/generated/validators/AuthRole.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateAuthRole } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/AuthRole.mjs b/web/js/api/generated/validators/AuthRole.mjs new file mode 100644 index 000000000..f3a1839a4 --- /dev/null +++ b/web/js/api/generated/validators/AuthRole.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var p=r,o={type:"string",enum:["admin","user","viewer","api","unknown"],$id:"urn:lightnvr:contract:AuthRole"};function r(e,{instancePath:s="",parentData:i,parentDataProperty:u,rootData:l=e,dynamicAnchors:m={}}={}){let t=null,a=0,n=r.evaluated;return n.dynamicProps&&(n.props=void 0),n.dynamicItems&&(n.items=void 0),typeof e!="string"?(r.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1):e==="admin"||e==="user"||e==="viewer"||e==="api"||e==="unknown"?(r.errors=t,a===0):(r.errors=[{instancePath:s,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:o.enum},message:"must be equal to one of the allowed values"}],!1)}r.evaluated={dynamicProps:!1,dynamicItems:!1};export{p as validateAuthRole}; diff --git a/web/js/api/generated/validators/AuthVerifyAuthDisabled.d.mts b/web/js/api/generated/validators/AuthVerifyAuthDisabled.d.mts new file mode 100644 index 000000000..9e93f0588 --- /dev/null +++ b/web/js/api/generated/validators/AuthVerifyAuthDisabled.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateAuthVerifyAuthDisabled } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/AuthVerifyAuthDisabled.mjs b/web/js/api/generated/validators/AuthVerifyAuthDisabled.mjs new file mode 100644 index 000000000..052e0eeba --- /dev/null +++ b/web/js/api/generated/validators/AuthVerifyAuthDisabled.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var c=a;function a(e,{instancePath:u="",parentData:l,parentDataProperty:_,rootData:m=e,dynamicAnchors:h={}}={}){let d=null,s=0,i=a.evaluated;if(i.dynamicProps&&(i.props=void 0),i.dynamicItems&&(i.items=void 0),s===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let o;if(e.authenticated===void 0&&(o="authenticated")||e.username===void 0&&(o="username")||e.role===void 0&&(o="role")||e.must_change_password===void 0&&(o="must_change_password")||e.auth_enabled===void 0&&(o="auth_enabled")||e.auth_timeout_hours===void 0&&(o="auth_timeout_hours")||e.auth_absolute_timeout_hours===void 0&&(o="auth_absolute_timeout_hours")||e.trusted_device_days===void 0&&(o="trusted_device_days"))return a.errors=[{instancePath:u,schemaPath:"#/required",keyword:"required",params:{missingProperty:o},message:"must have required property '"+o+"'"}],!1;if(e.authenticated!==void 0){let t=s;if(e.authenticated!==!0)return a.errors=[{instancePath:u+"/authenticated",schemaPath:"#/properties/authenticated/const",keyword:"const",params:{allowedValue:!0},message:"must be equal to constant"}],!1;var r=t===s}else var r=!0;if(r){if(e.username!==void 0){let t=s;if(e.username!=="admin")return a.errors=[{instancePath:u+"/username",schemaPath:"#/properties/username/const",keyword:"const",params:{allowedValue:"admin"},message:"must be equal to constant"}],!1;var r=t===s}else var r=!0;if(r){if(e.role!==void 0){let t=s;if(e.role!=="admin")return a.errors=[{instancePath:u+"/role",schemaPath:"#/properties/role/const",keyword:"const",params:{allowedValue:"admin"},message:"must be equal to constant"}],!1;var r=t===s}else var r=!0;if(r){if(e.must_change_password!==void 0){let t=s;if(e.must_change_password!==!1)return a.errors=[{instancePath:u+"/must_change_password",schemaPath:"#/properties/must_change_password/const",keyword:"const",params:{allowedValue:!1},message:"must be equal to constant"}],!1;var r=t===s}else var r=!0;if(r){if(e.auth_enabled!==void 0){let t=s;if(e.auth_enabled!==!1)return a.errors=[{instancePath:u+"/auth_enabled",schemaPath:"#/properties/auth_enabled/const",keyword:"const",params:{allowedValue:!1},message:"must be equal to constant"}],!1;var r=t===s}else var r=!0;if(r){if(e.auth_timeout_hours!==void 0){let t=e.auth_timeout_hours,n=s;if(!(typeof t=="number"&&!(t%1)&&!isNaN(t)&&isFinite(t)))return a.errors=[{instancePath:u+"/auth_timeout_hours",schemaPath:"#/properties/auth_timeout_hours/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;var r=n===s}else var r=!0;if(r){if(e.auth_absolute_timeout_hours!==void 0){let t=e.auth_absolute_timeout_hours,n=s;if(!(typeof t=="number"&&!(t%1)&&!isNaN(t)&&isFinite(t)))return a.errors=[{instancePath:u+"/auth_absolute_timeout_hours",schemaPath:"#/properties/auth_absolute_timeout_hours/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;var r=n===s}else var r=!0;if(r)if(e.trusted_device_days!==void 0){let t=e.trusted_device_days,n=s;if(!(typeof t=="number"&&!(t%1)&&!isNaN(t)&&isFinite(t)))return a.errors=[{instancePath:u+"/trusted_device_days",schemaPath:"#/properties/trusted_device_days/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;var r=n===s}else var r=!0}}}}}}}else return a.errors=[{instancePath:u,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return a.errors=d,s===0}a.evaluated={props:{authenticated:!0,username:!0,role:!0,must_change_password:!0,auth_enabled:!0,auth_timeout_hours:!0,auth_absolute_timeout_hours:!0,trusted_device_days:!0},dynamicProps:!1,dynamicItems:!1};export{c as validateAuthVerifyAuthDisabled}; diff --git a/web/js/api/generated/validators/AuthVerifyAuthenticated.d.mts b/web/js/api/generated/validators/AuthVerifyAuthenticated.d.mts new file mode 100644 index 000000000..a173ff6cd --- /dev/null +++ b/web/js/api/generated/validators/AuthVerifyAuthenticated.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateAuthVerifyAuthenticated } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/AuthVerifyAuthenticated.mjs b/web/js/api/generated/validators/AuthVerifyAuthenticated.mjs new file mode 100644 index 000000000..f9d16368b --- /dev/null +++ b/web/js/api/generated/validators/AuthVerifyAuthenticated.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var v=(e,a)=>()=>{try{return a||e((a={exports:{}}).exports,a),a.exports}catch(c){throw a=0,c}};var y=v(_=>{"use strict";Object.defineProperty(_,"__esModule",{value:!0});function f(e){let a=e.length,c=0,d=0,l;for(;d=55296&&l<=56319&&d63)return i.errors=[{instancePath:a+"/username",schemaPath:"#/properties/username/maxLength",keyword:"maxLength",params:{limit:63},message:"must NOT have more than 63 characters"}],!1}else return i.errors=[{instancePath:a+"/username",schemaPath:"#/properties/username/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var t=u===s}else var t=!0;if(t){if(e.email!==void 0){let r=e.email,u=s;if(s===u)if(typeof r=="string"){if(g(r)>127)return i.errors=[{instancePath:a+"/email",schemaPath:"#/properties/email/maxLength",keyword:"maxLength",params:{limit:127},message:"must NOT have more than 127 characters"}],!1}else return i.errors=[{instancePath:a+"/email",schemaPath:"#/properties/email/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var t=u===s}else var t=!0;if(t){if(e.role!==void 0){let r=s;m(e.role,{instancePath:a+"/role",parentData:e,parentDataProperty:"role",rootData:l,dynamicAnchors:h})||(p=p===null?m.errors:p.concat(m.errors),s=p.length);var t=r===s}else var t=!0;if(t){if(e.role_id!==void 0){let r=e.role_id,u=s;if(!(typeof r=="number"&&!(r%1)&&!isNaN(r)&&isFinite(r)))return i.errors=[{instancePath:a+"/role_id",schemaPath:"#/properties/role_id/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(s===u&&typeof r=="number"&&isFinite(r)){if(r>3||isNaN(r))return i.errors=[{instancePath:a+"/role_id",schemaPath:"#/properties/role_id/maximum",keyword:"maximum",params:{comparison:"<=",limit:3},message:"must be <= 3"}],!1;if(r<0||isNaN(r))return i.errors=[{instancePath:a+"/role_id",schemaPath:"#/properties/role_id/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1}var t=u===s}else var t=!0;if(t){if(e.is_active!==void 0){let r=s;if(typeof e.is_active!="boolean")return i.errors=[{instancePath:a+"/is_active",schemaPath:"#/properties/is_active/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var t=r===s}else var t=!0;if(t){if(e.password_change_locked!==void 0){let r=s;if(typeof e.password_change_locked!="boolean")return i.errors=[{instancePath:a+"/password_change_locked",schemaPath:"#/properties/password_change_locked/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var t=r===s}else var t=!0;if(t){if(e.must_change_password!==void 0){let r=s;if(typeof e.must_change_password!="boolean")return i.errors=[{instancePath:a+"/must_change_password",schemaPath:"#/properties/must_change_password/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var t=r===s}else var t=!0;if(t){if(e.auth_enabled!==void 0){let r=s;if(e.auth_enabled!==!0)return i.errors=[{instancePath:a+"/auth_enabled",schemaPath:"#/properties/auth_enabled/const",keyword:"const",params:{allowedValue:!0},message:"must be equal to constant"}],!1;var t=r===s}else var t=!0;if(t){if(e.auth_timeout_hours!==void 0){let r=e.auth_timeout_hours,u=s;if(!(typeof r=="number"&&!(r%1)&&!isNaN(r)&&isFinite(r)))return i.errors=[{instancePath:a+"/auth_timeout_hours",schemaPath:"#/properties/auth_timeout_hours/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;var t=u===s}else var t=!0;if(t){if(e.auth_absolute_timeout_hours!==void 0){let r=e.auth_absolute_timeout_hours,u=s;if(!(typeof r=="number"&&!(r%1)&&!isNaN(r)&&isFinite(r)))return i.errors=[{instancePath:a+"/auth_absolute_timeout_hours",schemaPath:"#/properties/auth_absolute_timeout_hours/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;var t=u===s}else var t=!0;if(t)if(e.trusted_device_days!==void 0){let r=e.trusted_device_days,u=s;if(!(typeof r=="number"&&!(r%1)&&!isNaN(r)&&isFinite(r)))return i.errors=[{instancePath:a+"/trusted_device_days",schemaPath:"#/properties/trusted_device_days/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;var t=u===s}else var t=!0}}}}}}}}}}}}else return i.errors=[{instancePath:a,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return i.errors=p,s===0}i.evaluated={props:{authenticated:!0,id:!0,username:!0,email:!0,role:!0,role_id:!0,is_active:!0,password_change_locked:!0,must_change_password:!0,auth_enabled:!0,auth_timeout_hours:!0,auth_absolute_timeout_hours:!0,trusted_device_days:!0},dynamicProps:!1,dynamicItems:!1};export{P as validateAuthVerifyAuthenticated}; diff --git a/web/js/api/generated/validators/AuthVerifyDemo.d.mts b/web/js/api/generated/validators/AuthVerifyDemo.d.mts new file mode 100644 index 000000000..5c711d0f3 --- /dev/null +++ b/web/js/api/generated/validators/AuthVerifyDemo.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateAuthVerifyDemo } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/AuthVerifyDemo.mjs b/web/js/api/generated/validators/AuthVerifyDemo.mjs new file mode 100644 index 000000000..19c2e30d1 --- /dev/null +++ b/web/js/api/generated/validators/AuthVerifyDemo.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var f=t;function t(e,{instancePath:o="",parentData:d,parentDataProperty:i,rootData:l=e,dynamicAnchors:c={}}={}){let m=null,s=0,u=t.evaluated;if(u.dynamicProps&&(u.props=void 0),u.dynamicItems&&(u.items=void 0),s===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let n;if(e.authenticated===void 0&&(n="authenticated")||e.demo_mode===void 0&&(n="demo_mode")||e.username===void 0&&(n="username")||e.role===void 0&&(n="role")||e.must_change_password===void 0&&(n="must_change_password"))return t.errors=[{instancePath:o,schemaPath:"#/required",keyword:"required",params:{missingProperty:n},message:"must have required property '"+n+"'"}],!1;if(e.authenticated!==void 0){let a=s;if(e.authenticated!==!1)return t.errors=[{instancePath:o+"/authenticated",schemaPath:"#/properties/authenticated/const",keyword:"const",params:{allowedValue:!1},message:"must be equal to constant"}],!1;var r=a===s}else var r=!0;if(r){if(e.demo_mode!==void 0){let a=s;if(e.demo_mode!==!0)return t.errors=[{instancePath:o+"/demo_mode",schemaPath:"#/properties/demo_mode/const",keyword:"const",params:{allowedValue:!0},message:"must be equal to constant"}],!1;var r=a===s}else var r=!0;if(r){if(e.username!==void 0){let a=s;if(e.username!=="demo")return t.errors=[{instancePath:o+"/username",schemaPath:"#/properties/username/const",keyword:"const",params:{allowedValue:"demo"},message:"must be equal to constant"}],!1;var r=a===s}else var r=!0;if(r){if(e.role!==void 0){let a=s;if(e.role!=="viewer")return t.errors=[{instancePath:o+"/role",schemaPath:"#/properties/role/const",keyword:"const",params:{allowedValue:"viewer"},message:"must be equal to constant"}],!1;var r=a===s}else var r=!0;if(r)if(e.must_change_password!==void 0){let a=s;if(e.must_change_password!==!1)return t.errors=[{instancePath:o+"/must_change_password",schemaPath:"#/properties/must_change_password/const",keyword:"const",params:{allowedValue:!1},message:"must be equal to constant"}],!1;var r=a===s}else var r=!0}}}}else return t.errors=[{instancePath:o,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return t.errors=m,s===0}t.evaluated={props:{authenticated:!0,demo_mode:!0,username:!0,role:!0,must_change_password:!0},dynamicProps:!1,dynamicItems:!1};export{f as validateAuthVerifyDemo}; diff --git a/web/js/api/generated/validators/AuthVerifyResponse.d.mts b/web/js/api/generated/validators/AuthVerifyResponse.d.mts new file mode 100644 index 000000000..8c848b818 --- /dev/null +++ b/web/js/api/generated/validators/AuthVerifyResponse.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateAuthVerifyResponse } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/AuthVerifyResponse.mjs b/web/js/api/generated/validators/AuthVerifyResponse.mjs new file mode 100644 index 000000000..64f38b75b --- /dev/null +++ b/web/js/api/generated/validators/AuthVerifyResponse.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var N=(e,a)=>()=>{try{return a||e((a={exports:{}}).exports,a),a.exports}catch(f){throw a=0,f}};var P=N(w=>{"use strict";Object.defineProperty(w,"__esModule",{value:!0});function k(e){let a=e.length,f=0,_=0,c;for(;_=55296&&c<=56319&&_63)return d.errors=[{instancePath:a+"/username",schemaPath:"#/properties/username/maxLength",keyword:"maxLength",params:{limit:63},message:"must NOT have more than 63 characters"}],!1}else return d.errors=[{instancePath:a+"/username",schemaPath:"#/properties/username/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var s=l===t}else var s=!0;if(s){if(e.email!==void 0){let r=e.email,l=t;if(t===l)if(typeof r=="string"){if(q(r)>127)return d.errors=[{instancePath:a+"/email",schemaPath:"#/properties/email/maxLength",keyword:"maxLength",params:{limit:127},message:"must NOT have more than 127 characters"}],!1}else return d.errors=[{instancePath:a+"/email",schemaPath:"#/properties/email/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var s=l===t}else var s=!0;if(s){if(e.role!==void 0){let r=t;y(e.role,{instancePath:a+"/role",parentData:e,parentDataProperty:"role",rootData:c,dynamicAnchors:p})||(n=n===null?y.errors:n.concat(y.errors),t=n.length);var s=r===t}else var s=!0;if(s){if(e.role_id!==void 0){let r=e.role_id,l=t;if(!(typeof r=="number"&&!(r%1)&&!isNaN(r)&&isFinite(r)))return d.errors=[{instancePath:a+"/role_id",schemaPath:"#/properties/role_id/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(t===l&&typeof r=="number"&&isFinite(r)){if(r>3||isNaN(r))return d.errors=[{instancePath:a+"/role_id",schemaPath:"#/properties/role_id/maximum",keyword:"maximum",params:{comparison:"<=",limit:3},message:"must be <= 3"}],!1;if(r<0||isNaN(r))return d.errors=[{instancePath:a+"/role_id",schemaPath:"#/properties/role_id/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1}var s=l===t}else var s=!0;if(s){if(e.is_active!==void 0){let r=t;if(typeof e.is_active!="boolean")return d.errors=[{instancePath:a+"/is_active",schemaPath:"#/properties/is_active/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var s=r===t}else var s=!0;if(s){if(e.password_change_locked!==void 0){let r=t;if(typeof e.password_change_locked!="boolean")return d.errors=[{instancePath:a+"/password_change_locked",schemaPath:"#/properties/password_change_locked/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var s=r===t}else var s=!0;if(s){if(e.must_change_password!==void 0){let r=t;if(typeof e.must_change_password!="boolean")return d.errors=[{instancePath:a+"/must_change_password",schemaPath:"#/properties/must_change_password/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var s=r===t}else var s=!0;if(s){if(e.auth_enabled!==void 0){let r=t;if(e.auth_enabled!==!0)return d.errors=[{instancePath:a+"/auth_enabled",schemaPath:"#/properties/auth_enabled/const",keyword:"const",params:{allowedValue:!0},message:"must be equal to constant"}],!1;var s=r===t}else var s=!0;if(s){if(e.auth_timeout_hours!==void 0){let r=e.auth_timeout_hours,l=t;if(!(typeof r=="number"&&!(r%1)&&!isNaN(r)&&isFinite(r)))return d.errors=[{instancePath:a+"/auth_timeout_hours",schemaPath:"#/properties/auth_timeout_hours/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;var s=l===t}else var s=!0;if(s){if(e.auth_absolute_timeout_hours!==void 0){let r=e.auth_absolute_timeout_hours,l=t;if(!(typeof r=="number"&&!(r%1)&&!isNaN(r)&&isFinite(r)))return d.errors=[{instancePath:a+"/auth_absolute_timeout_hours",schemaPath:"#/properties/auth_absolute_timeout_hours/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;var s=l===t}else var s=!0;if(s)if(e.trusted_device_days!==void 0){let r=e.trusted_device_days,l=t;if(!(typeof r=="number"&&!(r%1)&&!isNaN(r)&&isFinite(r)))return d.errors=[{instancePath:a+"/trusted_device_days",schemaPath:"#/properties/trusted_device_days/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;var s=l===t}else var s=!0}}}}}}}}}}}}else return d.errors=[{instancePath:a,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return d.errors=n,t===0}d.evaluated={props:{authenticated:!0,id:!0,username:!0,email:!0,role:!0,role_id:!0,is_active:!0,password_change_locked:!0,must_change_password:!0,auth_enabled:!0,auth_timeout_hours:!0,auth_absolute_timeout_hours:!0,trusted_device_days:!0},dynamicProps:!1,dynamicItems:!1};function m(e,{instancePath:a="",parentData:f,parentDataProperty:_,rootData:c=e,dynamicAnchors:p={}}={}){let n=null,t=0,o=m.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),t===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let u;if(e.authenticated===void 0&&(u="authenticated")||e.username===void 0&&(u="username")||e.role===void 0&&(u="role")||e.must_change_password===void 0&&(u="must_change_password")||e.auth_enabled===void 0&&(u="auth_enabled")||e.auth_timeout_hours===void 0&&(u="auth_timeout_hours")||e.auth_absolute_timeout_hours===void 0&&(u="auth_absolute_timeout_hours")||e.trusted_device_days===void 0&&(u="trusted_device_days"))return m.errors=[{instancePath:a,schemaPath:"#/required",keyword:"required",params:{missingProperty:u},message:"must have required property '"+u+"'"}],!1;if(e.authenticated!==void 0){let r=t;if(e.authenticated!==!0)return m.errors=[{instancePath:a+"/authenticated",schemaPath:"#/properties/authenticated/const",keyword:"const",params:{allowedValue:!0},message:"must be equal to constant"}],!1;var s=r===t}else var s=!0;if(s){if(e.username!==void 0){let r=t;if(e.username!=="admin")return m.errors=[{instancePath:a+"/username",schemaPath:"#/properties/username/const",keyword:"const",params:{allowedValue:"admin"},message:"must be equal to constant"}],!1;var s=r===t}else var s=!0;if(s){if(e.role!==void 0){let r=t;if(e.role!=="admin")return m.errors=[{instancePath:a+"/role",schemaPath:"#/properties/role/const",keyword:"const",params:{allowedValue:"admin"},message:"must be equal to constant"}],!1;var s=r===t}else var s=!0;if(s){if(e.must_change_password!==void 0){let r=t;if(e.must_change_password!==!1)return m.errors=[{instancePath:a+"/must_change_password",schemaPath:"#/properties/must_change_password/const",keyword:"const",params:{allowedValue:!1},message:"must be equal to constant"}],!1;var s=r===t}else var s=!0;if(s){if(e.auth_enabled!==void 0){let r=t;if(e.auth_enabled!==!1)return m.errors=[{instancePath:a+"/auth_enabled",schemaPath:"#/properties/auth_enabled/const",keyword:"const",params:{allowedValue:!1},message:"must be equal to constant"}],!1;var s=r===t}else var s=!0;if(s){if(e.auth_timeout_hours!==void 0){let r=e.auth_timeout_hours,l=t;if(!(typeof r=="number"&&!(r%1)&&!isNaN(r)&&isFinite(r)))return m.errors=[{instancePath:a+"/auth_timeout_hours",schemaPath:"#/properties/auth_timeout_hours/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;var s=l===t}else var s=!0;if(s){if(e.auth_absolute_timeout_hours!==void 0){let r=e.auth_absolute_timeout_hours,l=t;if(!(typeof r=="number"&&!(r%1)&&!isNaN(r)&&isFinite(r)))return m.errors=[{instancePath:a+"/auth_absolute_timeout_hours",schemaPath:"#/properties/auth_absolute_timeout_hours/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;var s=l===t}else var s=!0;if(s)if(e.trusted_device_days!==void 0){let r=e.trusted_device_days,l=t;if(!(typeof r=="number"&&!(r%1)&&!isNaN(r)&&isFinite(r)))return m.errors=[{instancePath:a+"/trusted_device_days",schemaPath:"#/properties/trusted_device_days/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;var s=l===t}else var s=!0}}}}}}}else return m.errors=[{instancePath:a,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return m.errors=n,t===0}m.evaluated={props:{authenticated:!0,username:!0,role:!0,must_change_password:!0,auth_enabled:!0,auth_timeout_hours:!0,auth_absolute_timeout_hours:!0,trusted_device_days:!0},dynamicProps:!1,dynamicItems:!1};function h(e,{instancePath:a="",parentData:f,parentDataProperty:_,rootData:c=e,dynamicAnchors:p={}}={}){let n=null,t=0,o=h.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),t===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let u;if(e.authenticated===void 0&&(u="authenticated")||e.demo_mode===void 0&&(u="demo_mode")||e.username===void 0&&(u="username")||e.role===void 0&&(u="role")||e.must_change_password===void 0&&(u="must_change_password"))return h.errors=[{instancePath:a,schemaPath:"#/required",keyword:"required",params:{missingProperty:u},message:"must have required property '"+u+"'"}],!1;if(e.authenticated!==void 0){let r=t;if(e.authenticated!==!1)return h.errors=[{instancePath:a+"/authenticated",schemaPath:"#/properties/authenticated/const",keyword:"const",params:{allowedValue:!1},message:"must be equal to constant"}],!1;var s=r===t}else var s=!0;if(s){if(e.demo_mode!==void 0){let r=t;if(e.demo_mode!==!0)return h.errors=[{instancePath:a+"/demo_mode",schemaPath:"#/properties/demo_mode/const",keyword:"const",params:{allowedValue:!0},message:"must be equal to constant"}],!1;var s=r===t}else var s=!0;if(s){if(e.username!==void 0){let r=t;if(e.username!=="demo")return h.errors=[{instancePath:a+"/username",schemaPath:"#/properties/username/const",keyword:"const",params:{allowedValue:"demo"},message:"must be equal to constant"}],!1;var s=r===t}else var s=!0;if(s){if(e.role!==void 0){let r=t;if(e.role!=="viewer")return h.errors=[{instancePath:a+"/role",schemaPath:"#/properties/role/const",keyword:"const",params:{allowedValue:"viewer"},message:"must be equal to constant"}],!1;var s=r===t}else var s=!0;if(s)if(e.must_change_password!==void 0){let r=t;if(e.must_change_password!==!1)return h.errors=[{instancePath:a+"/must_change_password",schemaPath:"#/properties/must_change_password/const",keyword:"const",params:{allowedValue:!1},message:"must be equal to constant"}],!1;var s=r===t}else var s=!0}}}}else return h.errors=[{instancePath:a,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return h.errors=n,t===0}h.evaluated={props:{authenticated:!0,demo_mode:!0,username:!0,role:!0,must_change_password:!0},dynamicProps:!1,dynamicItems:!1};function g(e,{instancePath:a="",parentData:f,parentDataProperty:_,rootData:c=e,dynamicAnchors:p={}}={}){let n=null,t=0,o=g.evaluated;o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0);let s=t,u=!1,r=null,l=t;d(e,{instancePath:a,parentData:f,parentDataProperty:_,rootData:c,dynamicAnchors:p})||(n=n===null?d.errors:n.concat(d.errors),t=n.length);var v=l===t;if(v){u=!0,r=0;var i={};i.authenticated=!0,i.id=!0,i.username=!0,i.email=!0,i.role=!0,i.role_id=!0,i.is_active=!0,i.password_change_locked=!0,i.must_change_password=!0,i.auth_enabled=!0,i.auth_timeout_hours=!0,i.auth_absolute_timeout_hours=!0,i.trusted_device_days=!0}let A=t;m(e,{instancePath:a,parentData:f,parentDataProperty:_,rootData:c,dynamicAnchors:p})||(n=n===null?m.errors:n.concat(m.errors),t=n.length);var v=A===t;if(v&&u)u=!1,r=[r,1];else{v&&(u=!0,r=1,i!==!0&&(i=i||{},i.authenticated=!0,i.username=!0,i.role=!0,i.must_change_password=!0,i.auth_enabled=!0,i.auth_timeout_hours=!0,i.auth_absolute_timeout_hours=!0,i.trusted_device_days=!0));let b=t;h(e,{instancePath:a,parentData:f,parentDataProperty:_,rootData:c,dynamicAnchors:p})||(n=n===null?h.errors:n.concat(h.errors),t=n.length);var v=b===t;v&&u?(u=!1,r=[r,2]):v&&(u=!0,r=2,i!==!0&&(i=i||{},i.authenticated=!0,i.demo_mode=!0,i.username=!0,i.role=!0,i.must_change_password=!0))}if(u)t=s,n!==null&&(s?n.length=s:n=null);else{let b={instancePath:a,schemaPath:"#/oneOf",keyword:"oneOf",params:{passingSchemas:r},message:"must match exactly one schema in oneOf"};return n===null?n=[b]:n.push(b),t++,g.errors=n,!1}return g.errors=n,o.props=i,t===0}g.evaluated={dynamicProps:!0,dynamicItems:!1};export{D as validateAuthVerifyResponse}; diff --git a/web/js/api/generated/validators/Availability.d.mts b/web/js/api/generated/validators/Availability.d.mts new file mode 100644 index 000000000..65c9920d7 --- /dev/null +++ b/web/js/api/generated/validators/Availability.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateAvailability } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/Availability.mjs b/web/js/api/generated/validators/Availability.mjs new file mode 100644 index 000000000..80c1dfdb7 --- /dev/null +++ b/web/js/api/generated/validators/Availability.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var d=r,i={type:"string",enum:["live","offline","never_connected","disabled"],$id:"urn:lightnvr:contract:Availability"};function r(e,{instancePath:n="",parentData:l,parentDataProperty:o,rootData:m=e,dynamicAnchors:u={}}={}){let s=null,a=0,t=r.evaluated;return t.dynamicProps&&(t.props=void 0),t.dynamicItems&&(t.items=void 0),typeof e!="string"?(r.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1):e==="live"||e==="offline"||e==="never_connected"||e==="disabled"?(r.errors=s,a===0):(r.errors=[{instancePath:n,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:i.enum},message:"must be equal to one of the allowed values"}],!1)}r.evaluated={dynamicProps:!1,dynamicItems:!1};export{d as validateAvailability}; diff --git a/web/js/api/generated/validators/CameraUuid.d.mts b/web/js/api/generated/validators/CameraUuid.d.mts new file mode 100644 index 000000000..30f9d7b79 --- /dev/null +++ b/web/js/api/generated/validators/CameraUuid.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateCameraUuid } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/CameraUuid.mjs b/web/js/api/generated/validators/CameraUuid.mjs new file mode 100644 index 000000000..383542609 --- /dev/null +++ b/web/js/api/generated/validators/CameraUuid.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var m=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(n){throw e=0,n}};var l=m(i=>{"use strict";Object.defineProperty(i,"__esModule",{value:!0});function o(t){let e=t.length,n=0,r=0,s;for(;r=55296&&s<=56319&&r36)return a.errors=[{instancePath:e,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:36},message:"must NOT have more than 36 characters"}],!1;if(!p.test(t))return a.errors=[{instancePath:e,schemaPath:"#/pattern",keyword:"pattern",params:{pattern:"^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$"},message:'must match pattern "^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$"'}],!1}else return a.errors=[{instancePath:e,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return a.errors=c,u===0}a.evaluated={dynamicProps:!1,dynamicItems:!1};export{g as validateCameraUuid}; diff --git a/web/js/api/generated/validators/ClientConfig.d.mts b/web/js/api/generated/validators/ClientConfig.d.mts new file mode 100644 index 000000000..2ec31c6cc --- /dev/null +++ b/web/js/api/generated/validators/ClientConfig.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateClientConfig } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/ClientConfig.mjs b/web/js/api/generated/validators/ClientConfig.mjs new file mode 100644 index 000000000..e0ff6c0e4 --- /dev/null +++ b/web/js/api/generated/validators/ClientConfig.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var f=i;function l(e,{instancePath:s="",parentData:p,parentDataProperty:b,rootData:c=e,dynamicAnchors:d={}}={}){let a=null,t=0,_=l.evaluated;if(_.dynamicProps&&(_.props=void 0),_.dynamicItems&&(_.items=void 0),!(typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)))return l.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(t===0&&typeof e=="number"&&isFinite(e)){if(e>2147483647||isNaN(e))return l.errors=[{instancePath:s,schemaPath:"#/maximum",keyword:"maximum",params:{comparison:"<=",limit:2147483647},message:"must be <= 2147483647"}],!1;if(e<-2147483648||isNaN(e))return l.errors=[{instancePath:s,schemaPath:"#/minimum",keyword:"minimum",params:{comparison:">=",limit:-2147483648},message:"must be >= -2147483648"}],!1}return l.errors=a,t===0}l.evaluated={dynamicProps:!1,dynamicItems:!1};var m={type:"string",enum:["auto","webrtc_only","mse_only","hls_only","webrtc_then_mse","mse_then_hls"],$id:"urn:lightnvr:contract:PlaybackTransport"};function u(e,{instancePath:s="",parentData:p,parentDataProperty:b,rootData:c=e,dynamicAnchors:d={}}={}){let a=null,t=0,_=u.evaluated;return _.dynamicProps&&(_.props=void 0),_.dynamicItems&&(_.items=void 0),typeof e!="string"?(u.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1):e==="auto"||e==="webrtc_only"||e==="mse_only"||e==="hls_only"||e==="webrtc_then_mse"||e==="mse_then_hls"?(u.errors=a,t===0):(u.errors=[{instancePath:s,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:m.enum},message:"must be equal to one of the allowed values"}],!1)}u.evaluated={dynamicProps:!1,dynamicItems:!1};function i(e,{instancePath:s="",parentData:p,parentDataProperty:b,rootData:c=e,dynamicAnchors:d={}}={}){let a=null,t=0,_=i.evaluated;if(_.dynamicProps&&(_.props=void 0),_.dynamicItems&&(_.items=void 0),t===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let n;if(e.go2rtc_enabled===void 0&&(n="go2rtc_enabled")||e.web_auth_enabled===void 0&&(n="web_auth_enabled")||e.demo_mode===void 0&&(n="demo_mode")||e.audio_disabled===void 0&&(n="audio_disabled")||e.auto_disabled===void 0&&(n="auto_disabled")||e.go2rtc_available===void 0&&(n="go2rtc_available")||e.go2rtc_api_port===void 0&&(n="go2rtc_api_port")||e.go2rtc_base_path===void 0&&(n="go2rtc_base_path")||e.webrtc_disabled===void 0&&(n="webrtc_disabled")||e.hls_disabled===void 0&&(n="hls_disabled")||e.mse_disabled===void 0&&(n="mse_disabled")||e.default_playback_transport===void 0&&(n="default_playback_transport")||e.go2rtc_force_native_hls===void 0&&(n="go2rtc_force_native_hls")||e.webrtc_connection_timeout_ms===void 0&&(n="webrtc_connection_timeout_ms")||e.webrtc_ice_recovery_timeout_ms===void 0&&(n="webrtc_ice_recovery_timeout_ms")||e.generate_thumbnails===void 0&&(n="generate_thumbnails")||e.thumbnails_per_recording===void 0&&(n="thumbnails_per_recording"))return i.errors=[{instancePath:s,schemaPath:"#/required",keyword:"required",params:{missingProperty:n},message:"must have required property '"+n+"'"}],!1;if(e.go2rtc_enabled!==void 0){let o=t;if(typeof e.go2rtc_enabled!="boolean")return i.errors=[{instancePath:s+"/go2rtc_enabled",schemaPath:"#/properties/go2rtc_enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var r=o===t}else var r=!0;if(r){if(e.web_auth_enabled!==void 0){let o=t;if(typeof e.web_auth_enabled!="boolean")return i.errors=[{instancePath:s+"/web_auth_enabled",schemaPath:"#/properties/web_auth_enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var r=o===t}else var r=!0;if(r){if(e.demo_mode!==void 0){let o=t;if(typeof e.demo_mode!="boolean")return i.errors=[{instancePath:s+"/demo_mode",schemaPath:"#/properties/demo_mode/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var r=o===t}else var r=!0;if(r){if(e.audio_disabled!==void 0){let o=t;if(typeof e.audio_disabled!="boolean")return i.errors=[{instancePath:s+"/audio_disabled",schemaPath:"#/properties/audio_disabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var r=o===t}else var r=!0;if(r){if(e.auto_disabled!==void 0){let o=t;if(typeof e.auto_disabled!="boolean")return i.errors=[{instancePath:s+"/auto_disabled",schemaPath:"#/properties/auto_disabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var r=o===t}else var r=!0;if(r){if(e.go2rtc_available!==void 0){let o=t;if(typeof e.go2rtc_available!="boolean")return i.errors=[{instancePath:s+"/go2rtc_available",schemaPath:"#/properties/go2rtc_available/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var r=o===t}else var r=!0;if(r){if(e.go2rtc_api_port!==void 0){let o=t;l(e.go2rtc_api_port,{instancePath:s+"/go2rtc_api_port",parentData:e,parentDataProperty:"go2rtc_api_port",rootData:c,dynamicAnchors:d})||(a=a===null?l.errors:a.concat(l.errors),t=a.length);var r=o===t}else var r=!0;if(r){if(e.go2rtc_base_path!==void 0){let o=t;if(typeof e.go2rtc_base_path!="string")return i.errors=[{instancePath:s+"/go2rtc_base_path",schemaPath:"#/properties/go2rtc_base_path/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var r=o===t}else var r=!0;if(r){if(e.webrtc_disabled!==void 0){let o=t;if(typeof e.webrtc_disabled!="boolean")return i.errors=[{instancePath:s+"/webrtc_disabled",schemaPath:"#/properties/webrtc_disabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var r=o===t}else var r=!0;if(r){if(e.hls_disabled!==void 0){let o=t;if(typeof e.hls_disabled!="boolean")return i.errors=[{instancePath:s+"/hls_disabled",schemaPath:"#/properties/hls_disabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var r=o===t}else var r=!0;if(r){if(e.mse_disabled!==void 0){let o=t;if(typeof e.mse_disabled!="boolean")return i.errors=[{instancePath:s+"/mse_disabled",schemaPath:"#/properties/mse_disabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var r=o===t}else var r=!0;if(r){if(e.default_playback_transport!==void 0){let o=t;u(e.default_playback_transport,{instancePath:s+"/default_playback_transport",parentData:e,parentDataProperty:"default_playback_transport",rootData:c,dynamicAnchors:d})||(a=a===null?u.errors:a.concat(u.errors),t=a.length);var r=o===t}else var r=!0;if(r){if(e.go2rtc_force_native_hls!==void 0){let o=t;if(typeof e.go2rtc_force_native_hls!="boolean")return i.errors=[{instancePath:s+"/go2rtc_force_native_hls",schemaPath:"#/properties/go2rtc_force_native_hls/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var r=o===t}else var r=!0;if(r){if(e.webrtc_connection_timeout_ms!==void 0){let o=t;l(e.webrtc_connection_timeout_ms,{instancePath:s+"/webrtc_connection_timeout_ms",parentData:e,parentDataProperty:"webrtc_connection_timeout_ms",rootData:c,dynamicAnchors:d})||(a=a===null?l.errors:a.concat(l.errors),t=a.length);var r=o===t}else var r=!0;if(r){if(e.webrtc_ice_recovery_timeout_ms!==void 0){let o=t;l(e.webrtc_ice_recovery_timeout_ms,{instancePath:s+"/webrtc_ice_recovery_timeout_ms",parentData:e,parentDataProperty:"webrtc_ice_recovery_timeout_ms",rootData:c,dynamicAnchors:d})||(a=a===null?l.errors:a.concat(l.errors),t=a.length);var r=o===t}else var r=!0;if(r){if(e.generate_thumbnails!==void 0){let o=t;if(typeof e.generate_thumbnails!="boolean")return i.errors=[{instancePath:s+"/generate_thumbnails",schemaPath:"#/properties/generate_thumbnails/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var r=o===t}else var r=!0;if(r)if(e.thumbnails_per_recording!==void 0){let o=t;l(e.thumbnails_per_recording,{instancePath:s+"/thumbnails_per_recording",parentData:e,parentDataProperty:"thumbnails_per_recording",rootData:c,dynamicAnchors:d})||(a=a===null?l.errors:a.concat(l.errors),t=a.length);var r=o===t}else var r=!0}}}}}}}}}}}}}}}}else return i.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return i.errors=a,t===0}i.evaluated={props:{go2rtc_enabled:!0,web_auth_enabled:!0,demo_mode:!0,audio_disabled:!0,auto_disabled:!0,go2rtc_available:!0,go2rtc_api_port:!0,go2rtc_base_path:!0,webrtc_disabled:!0,hls_disabled:!0,mse_disabled:!0,default_playback_transport:!0,go2rtc_force_native_hls:!0,webrtc_connection_timeout_ms:!0,webrtc_ice_recovery_timeout_ms:!0,generate_thumbnails:!0,thumbnails_per_recording:!0},dynamicProps:!1,dynamicItems:!1};export{f as validateClientConfig}; diff --git a/web/js/api/generated/validators/DetailStatus.d.mts b/web/js/api/generated/validators/DetailStatus.d.mts new file mode 100644 index 000000000..ed82bcba2 --- /dev/null +++ b/web/js/api/generated/validators/DetailStatus.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateDetailStatus } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/DetailStatus.mjs b/web/js/api/generated/validators/DetailStatus.mjs new file mode 100644 index 000000000..4346faf49 --- /dev/null +++ b/web/js/api/generated/validators/DetailStatus.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var m=n,a={type:"string",enum:["Running","Degraded","Error","Stopped","Unknown","Starting","Stopping","Reconnecting"],$id:"urn:lightnvr:contract:DetailStatus"};function n(e,{instancePath:t="",parentData:i,parentDataProperty:u,rootData:l=e,dynamicAnchors:p={}}={}){let s=null,o=0,r=n.evaluated;return r.dynamicProps&&(r.props=void 0),r.dynamicItems&&(r.items=void 0),typeof e!="string"?(n.errors=[{instancePath:t,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1):e==="Running"||e==="Degraded"||e==="Error"||e==="Stopped"||e==="Unknown"||e==="Starting"||e==="Stopping"||e==="Reconnecting"?(n.errors=s,o===0):(n.errors=[{instancePath:t,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:a.enum},message:"must be equal to one of the allowed values"}],!1)}n.evaluated={dynamicProps:!1,dynamicItems:!1};export{m as validateDetailStatus}; diff --git a/web/js/api/generated/validators/DetectionModel.d.mts b/web/js/api/generated/validators/DetectionModel.d.mts new file mode 100644 index 000000000..7815481f4 --- /dev/null +++ b/web/js/api/generated/validators/DetectionModel.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateDetectionModel } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/DetectionModel.mjs b/web/js/api/generated/validators/DetectionModel.mjs new file mode 100644 index 000000000..617058187 --- /dev/null +++ b/web/js/api/generated/validators/DetectionModel.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var v=i;function i(e,{instancePath:o="",parentData:l,parentDataProperty:c,rootData:h=e,dynamicAnchors:g={}}={}){let p=null,r=0,a=i.evaluated;a.dynamicProps&&(a.props=void 0),a.dynamicItems&&(a.items=void 0);let f=r,d=!0,y=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let n;if(e.supported===void 0&&(n="supported")){let s={};p===null?p=[s]:p.push(s),r++}else if(e.supported!==void 0&&e.supported!==!1){let s={};p===null?p=[s]:p.push(s),r++}}var m=y===r;if(r=f,p!==null&&(f?p.length=f:p=null),m){let n=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let u;if(e.unsupported_reason===void 0&&(u="unsupported_reason"))return i.errors=[{instancePath:o,schemaPath:"#/then/required",keyword:"required",params:{missingProperty:u},message:"must have required property '"+u+"'"}],!1}var m=n===r;d=m}if(!d){let n={instancePath:o,schemaPath:"#/if",keyword:"if",params:{failingKeyword:"then"},message:'must match "then" schema'};return p===null?p=[n]:p.push(n),r++,i.errors=p,!1}if(r===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let n;if(e.id===void 0&&(n="id")||e.name===void 0&&(n="name")||e.path===void 0&&(n="path")||e.type===void 0&&(n="type")||e.supported===void 0&&(n="supported"))return i.errors=[{instancePath:o,schemaPath:"#/required",keyword:"required",params:{missingProperty:n},message:"must have required property '"+n+"'"}],!1;if(e.id!==void 0){let s=r;if(typeof e.id!="string")return i.errors=[{instancePath:o+"/id",schemaPath:"#/properties/id/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var t=s===r}else var t=!0;if(t){if(e.name!==void 0){let s=r;if(typeof e.name!="string")return i.errors=[{instancePath:o+"/name",schemaPath:"#/properties/name/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var t=s===r}else var t=!0;if(t){if(e.path!==void 0){let s=r;if(typeof e.path!="string")return i.errors=[{instancePath:o+"/path",schemaPath:"#/properties/path/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var t=s===r}else var t=!0;if(t){if(e.type!==void 0){let s=r;if(typeof e.type!="string")return i.errors=[{instancePath:o+"/type",schemaPath:"#/properties/type/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var t=s===r}else var t=!0;if(t){if(e.supported!==void 0){let s=r;if(typeof e.supported!="boolean")return i.errors=[{instancePath:o+"/supported",schemaPath:"#/properties/supported/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var t=s===r}else var t=!0;if(t){if(e.description!==void 0){let s=r;if(typeof e.description!="string")return i.errors=[{instancePath:o+"/description",schemaPath:"#/properties/description/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var t=s===r}else var t=!0;if(t){if(e.unsupported_reason!==void 0){let s=r;if(typeof e.unsupported_reason!="string")return i.errors=[{instancePath:o+"/unsupported_reason",schemaPath:"#/properties/unsupported_reason/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var t=s===r}else var t=!0;if(t)if(e.size!==void 0){let s=e.size,u=r;if(r===u)if(typeof s=="number"&&isFinite(s)){if(s<0||isNaN(s))return i.errors=[{instancePath:o+"/size",schemaPath:"#/properties/size/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1}else return i.errors=[{instancePath:o+"/size",schemaPath:"#/properties/size/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var t=u===r}else var t=!0}}}}}}}else return i.errors=[{instancePath:o,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return i.errors=p,r===0}i.evaluated={props:{id:!0,name:!0,path:!0,type:!0,supported:!0,description:!0,unsupported_reason:!0,size:!0},dynamicProps:!1,dynamicItems:!1};export{v as validateDetectionModel}; diff --git a/web/js/api/generated/validators/DetectionModelsResponse.d.mts b/web/js/api/generated/validators/DetectionModelsResponse.d.mts new file mode 100644 index 000000000..965d75cb6 --- /dev/null +++ b/web/js/api/generated/validators/DetectionModelsResponse.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateDetectionModelsResponse } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/DetectionModelsResponse.mjs b/web/js/api/generated/validators/DetectionModelsResponse.mjs new file mode 100644 index 000000000..34b2b9a06 --- /dev/null +++ b/web/js/api/generated/validators/DetectionModelsResponse.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var b=u;function a(e,{instancePath:i="",parentData:h,parentDataProperty:g,rootData:c=e,dynamicAnchors:v={}}={}){let n=null,r=0,m=a.evaluated;m.dynamicProps&&(m.props=void 0),m.dynamicItems&&(m.items=void 0);let y=r,p=!0,d=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let l;if(e.supported===void 0&&(l="supported")){let s={};n===null?n=[s]:n.push(s),r++}else if(e.supported!==void 0&&e.supported!==!1){let s={};n===null?n=[s]:n.push(s),r++}}var o=d===r;if(r=y,n!==null&&(y?n.length=y:n=null),o){let l=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let f;if(e.unsupported_reason===void 0&&(f="unsupported_reason"))return a.errors=[{instancePath:i,schemaPath:"#/then/required",keyword:"required",params:{missingProperty:f},message:"must have required property '"+f+"'"}],!1}var o=l===r;p=o}if(!p){let l={instancePath:i,schemaPath:"#/if",keyword:"if",params:{failingKeyword:"then"},message:'must match "then" schema'};return n===null?n=[l]:n.push(l),r++,a.errors=n,!1}if(r===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let l;if(e.id===void 0&&(l="id")||e.name===void 0&&(l="name")||e.path===void 0&&(l="path")||e.type===void 0&&(l="type")||e.supported===void 0&&(l="supported"))return a.errors=[{instancePath:i,schemaPath:"#/required",keyword:"required",params:{missingProperty:l},message:"must have required property '"+l+"'"}],!1;if(e.id!==void 0){let s=r;if(typeof e.id!="string")return a.errors=[{instancePath:i+"/id",schemaPath:"#/properties/id/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var t=s===r}else var t=!0;if(t){if(e.name!==void 0){let s=r;if(typeof e.name!="string")return a.errors=[{instancePath:i+"/name",schemaPath:"#/properties/name/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var t=s===r}else var t=!0;if(t){if(e.path!==void 0){let s=r;if(typeof e.path!="string")return a.errors=[{instancePath:i+"/path",schemaPath:"#/properties/path/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var t=s===r}else var t=!0;if(t){if(e.type!==void 0){let s=r;if(typeof e.type!="string")return a.errors=[{instancePath:i+"/type",schemaPath:"#/properties/type/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var t=s===r}else var t=!0;if(t){if(e.supported!==void 0){let s=r;if(typeof e.supported!="boolean")return a.errors=[{instancePath:i+"/supported",schemaPath:"#/properties/supported/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var t=s===r}else var t=!0;if(t){if(e.description!==void 0){let s=r;if(typeof e.description!="string")return a.errors=[{instancePath:i+"/description",schemaPath:"#/properties/description/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var t=s===r}else var t=!0;if(t){if(e.unsupported_reason!==void 0){let s=r;if(typeof e.unsupported_reason!="string")return a.errors=[{instancePath:i+"/unsupported_reason",schemaPath:"#/properties/unsupported_reason/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var t=s===r}else var t=!0;if(t)if(e.size!==void 0){let s=e.size,f=r;if(r===f)if(typeof s=="number"&&isFinite(s)){if(s<0||isNaN(s))return a.errors=[{instancePath:i+"/size",schemaPath:"#/properties/size/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1}else return a.errors=[{instancePath:i+"/size",schemaPath:"#/properties/size/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var t=f===r}else var t=!0}}}}}}}else return a.errors=[{instancePath:i,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return a.errors=n,r===0}a.evaluated={props:{id:!0,name:!0,path:!0,type:!0,supported:!0,description:!0,unsupported_reason:!0,size:!0},dynamicProps:!1,dynamicItems:!1};function u(e,{instancePath:i="",parentData:h,parentDataProperty:g,rootData:c=e,dynamicAnchors:v={}}={}){let n=null,r=0,m=u.evaluated;if(m.dynamicProps&&(m.props=void 0),m.dynamicItems&&(m.items=void 0),r===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let d;if(e.models===void 0&&(d="models")||e.litert_available===void 0&&(d="litert_available")||e.sod_available===void 0&&(d="sod_available")||e.count===void 0&&(d="count"))return u.errors=[{instancePath:i,schemaPath:"#/required",keyword:"required",params:{missingProperty:d},message:"must have required property '"+d+"'"}],!1;if(e.models!==void 0){let o=e.models,t=r;if(r===t)if(Array.isArray(o)){if(o.length<3)return u.errors=[{instancePath:i+"/models",schemaPath:"#/properties/models/minItems",keyword:"minItems",params:{limit:3},message:"must NOT have fewer than 3 items"}],!1;{var y=!0;let l=o.length;for(let s=0;s=",limit:3},message:"must be >= 3"}],!1;var p=t===r}else var p=!0;if(p)if(e.message!==void 0){let o=r;if(e.message!=="Models directory does not exist")return u.errors=[{instancePath:i+"/message",schemaPath:"#/properties/message/const",keyword:"const",params:{allowedValue:"Models directory does not exist"},message:"must be equal to constant"}],!1;var p=o===r}else var p=!0}}}}else return u.errors=[{instancePath:i,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return u.errors=n,r===0}u.evaluated={props:{models:!0,litert_available:!0,sod_available:!0,count:!0,message:!0},dynamicProps:!1,dynamicItems:!1};export{b as validateDetectionModelsResponse}; diff --git a/web/js/api/generated/validators/DetectionUrl.d.mts b/web/js/api/generated/validators/DetectionUrl.d.mts new file mode 100644 index 000000000..bb73289bf --- /dev/null +++ b/web/js/api/generated/validators/DetectionUrl.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateDetectionUrl } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/DetectionUrl.mjs b/web/js/api/generated/validators/DetectionUrl.mjs new file mode 100644 index 000000000..733ebab1d --- /dev/null +++ b/web/js/api/generated/validators/DetectionUrl.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var p=(e,t)=>()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(a){throw t=0,a}};var c=p(i=>{"use strict";Object.defineProperty(i,"__esModule",{value:!0});function u(e){let t=e.length,a=0,s=0,n;for(;s=55296&&n<=56319&&s511)return r.errors=[{instancePath:t,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1;if(d.test(e)){if(new TextEncoder().encode(e).byteLength>511)return r.errors=[{instancePath:t,schemaPath:"#/x-lightnvr-max-bytes",keyword:"x-lightnvr-max-bytes",params:{},message:"must fit the UTF-8 byte limit"}],!1}else return r.errors=[{instancePath:t,schemaPath:"#/pattern",keyword:"pattern",params:{pattern:"^($|([Hh][Tt][Tt][Pp][Ss]?|[Rr][Tt][Ss][Pp][Ss]?)://)"},message:'must match pattern "^($|([Hh][Tt][Tt][Pp][Ss]?|[Rr][Tt][Ss][Pp][Ss]?)://)"'}],!1}return r.errors=m,o===0}r.evaluated={dynamicProps:!1,dynamicItems:!1};export{T as validateDetectionUrl}; diff --git a/web/js/api/generated/validators/DetectionZone.d.mts b/web/js/api/generated/validators/DetectionZone.d.mts new file mode 100644 index 000000000..efa7b8bf6 --- /dev/null +++ b/web/js/api/generated/validators/DetectionZone.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateDetectionZone } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/DetectionZone.mjs b/web/js/api/generated/validators/DetectionZone.mjs new file mode 100644 index 000000000..496c4db5e --- /dev/null +++ b/web/js/api/generated/validators/DetectionZone.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var k=(e,t)=>()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(y){throw t=0,y}};var x=k(b=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0});function _(e){let t=e.length,y=0,c=0,p;for(;c=55296&&p<=56319&&c255)return f.errors=[{instancePath:t,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1;if(h(e)<1)return f.errors=[{instancePath:t,schemaPath:"#/minLength",keyword:"minLength",params:{limit:1},message:"must NOT have fewer than 1 characters"}],!1;if(new TextEncoder().encode(e).byteLength>255)return f.errors=[{instancePath:t,schemaPath:"#/x-lightnvr-max-bytes",keyword:"x-lightnvr-max-bytes",params:{},message:"must fit the UTF-8 byte limit"}],!1}else return f.errors=[{instancePath:t,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return f.errors=l,r===0}f.evaluated={dynamicProps:!1,dynamicItems:!1};function u(e,{instancePath:t="",parentData:y,parentDataProperty:c,rootData:p=e,dynamicAnchors:v={}}={}){let l=null,r=0,m=u.evaluated;if(m.dynamicProps&&(m.props=void 0),m.dynamicItems&&(m.items=void 0),r===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let d;if(e.x===void 0&&(d="x")||e.y===void 0&&(d="y"))return u.errors=[{instancePath:t,schemaPath:"#/required",keyword:"required",params:{missingProperty:d},message:"must have required property '"+d+"'"}],!1;if(e.x!==void 0){let i=e.x,s=r;if(!(typeof i=="number"&&isFinite(i)))return u.errors=[{instancePath:t+"/x",schemaPath:"#/properties/x/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var n=s===r}else var n=!0;if(n)if(e.y!==void 0){let i=e.y,s=r;if(!(typeof i=="number"&&isFinite(i)))return u.errors=[{instancePath:t+"/y",schemaPath:"#/properties/y/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var n=s===r}else var n=!0}else return u.errors=[{instancePath:t,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return u.errors=l,r===0}u.evaluated={props:{x:!0,y:!0},dynamicProps:!1,dynamicItems:!1};function a(e,{instancePath:t="",parentData:y,parentDataProperty:c,rootData:p=e,dynamicAnchors:v={}}={}){let l=null,r=0,m=a.evaluated;if(m.dynamicProps&&(m.props=void 0),m.dynamicItems&&(m.items=void 0),r===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let i;if(e.id===void 0&&(i="id")||e.stream_name===void 0&&(i="stream_name")||e.name===void 0&&(i="name")||e.enabled===void 0&&(i="enabled")||e.color===void 0&&(i="color")||e.polygon===void 0&&(i="polygon")||e.filter_classes===void 0&&(i="filter_classes")||e.min_confidence===void 0&&(i="min_confidence"))return a.errors=[{instancePath:t,schemaPath:"#/required",keyword:"required",params:{missingProperty:i},message:"must have required property '"+i+"'"}],!1;if(e.id!==void 0){let s=e.id,o=r;if(r===o)if(typeof s=="string"){if(h(s)>63)return a.errors=[{instancePath:t+"/id",schemaPath:"#/properties/id/maxLength",keyword:"maxLength",params:{limit:63},message:"must NOT have more than 63 characters"}],!1}else return a.errors=[{instancePath:t+"/id",schemaPath:"#/properties/id/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=o===r}else var n=!0;if(n){if(e.stream_name!==void 0){let s=r;f(e.stream_name,{instancePath:t+"/stream_name",parentData:e,parentDataProperty:"stream_name",rootData:p,dynamicAnchors:v})||(l=l===null?f.errors:l.concat(f.errors),r=l.length);var n=s===r}else var n=!0;if(n){if(e.name!==void 0){let s=e.name,o=r;if(r===o)if(typeof s=="string"){if(h(s)>63)return a.errors=[{instancePath:t+"/name",schemaPath:"#/properties/name/maxLength",keyword:"maxLength",params:{limit:63},message:"must NOT have more than 63 characters"}],!1}else return a.errors=[{instancePath:t+"/name",schemaPath:"#/properties/name/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=o===r}else var n=!0;if(n){if(e.enabled!==void 0){let s=r;if(typeof e.enabled!="boolean")return a.errors=[{instancePath:t+"/enabled",schemaPath:"#/properties/enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=s===r}else var n=!0;if(n){if(e.color!==void 0){let s=e.color,o=r;if(r===o)if(typeof s=="string"){if(h(s)>7)return a.errors=[{instancePath:t+"/color",schemaPath:"#/properties/color/maxLength",keyword:"maxLength",params:{limit:7},message:"must NOT have more than 7 characters"}],!1}else return a.errors=[{instancePath:t+"/color",schemaPath:"#/properties/color/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=o===r}else var n=!0;if(n){if(e.polygon!==void 0){let s=e.polygon,o=r;if(r===o)if(Array.isArray(s)){if(s.length>32)return a.errors=[{instancePath:t+"/polygon",schemaPath:"#/properties/polygon/maxItems",keyword:"maxItems",params:{limit:32},message:"must NOT have more than 32 items"}],!1;{var d=!0;let P=s.length;for(let g=0;g255)return a.errors=[{instancePath:t+"/filter_classes",schemaPath:"#/properties/filter_classes/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1}else return a.errors=[{instancePath:t+"/filter_classes",schemaPath:"#/properties/filter_classes/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=o===r}else var n=!0;if(n)if(e.min_confidence!==void 0){let s=e.min_confidence,o=r;if(!(typeof s=="number"&&isFinite(s)))return a.errors=[{instancePath:t+"/min_confidence",schemaPath:"#/properties/min_confidence/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var n=o===r}else var n=!0}}}}}}}else return a.errors=[{instancePath:t,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return a.errors=l,r===0}a.evaluated={props:{id:!0,stream_name:!0,name:!0,enabled:!0,color:!0,polygon:!0,filter_classes:!0,min_confidence:!0},dynamicProps:!1,dynamicItems:!1};export{j as validateDetectionZone}; diff --git a/web/js/api/generated/validators/EmptyString.d.mts b/web/js/api/generated/validators/EmptyString.d.mts new file mode 100644 index 000000000..6933cf56a --- /dev/null +++ b/web/js/api/generated/validators/EmptyString.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateEmptyString } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/EmptyString.mjs b/web/js/api/generated/validators/EmptyString.mjs new file mode 100644 index 000000000..daf6e0598 --- /dev/null +++ b/web/js/api/generated/validators/EmptyString.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var l=e;function e(r,{instancePath:s="",parentData:o,parentDataProperty:i,rootData:c=r,dynamicAnchors:m={}}={}){let a=null,n=0,t=e.evaluated;return t.dynamicProps&&(t.props=void 0),t.dynamicItems&&(t.items=void 0),typeof r!="string"?(e.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1):r!==""?(e.errors=[{instancePath:s,schemaPath:"#/const",keyword:"const",params:{allowedValue:""},message:"must be equal to constant"}],!1):(e.errors=a,n===0)}e.evaluated={dynamicProps:!1,dynamicItems:!1};export{l as validateEmptyString}; diff --git a/web/js/api/generated/validators/EpochSecondsOrZero.d.mts b/web/js/api/generated/validators/EpochSecondsOrZero.d.mts new file mode 100644 index 000000000..dda67df3f --- /dev/null +++ b/web/js/api/generated/validators/EpochSecondsOrZero.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateEpochSecondsOrZero } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/EpochSecondsOrZero.mjs b/web/js/api/generated/validators/EpochSecondsOrZero.mjs new file mode 100644 index 000000000..563969800 --- /dev/null +++ b/web/js/api/generated/validators/EpochSecondsOrZero.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var p=r;function r(e,{instancePath:s="",parentData:m,parentDataProperty:o,rootData:a=e,dynamicAnchors:c={}}={}){let n=null,t=0,i=r.evaluated;return i.dynamicProps&&(i.props=void 0),i.dynamicItems&&(i.items=void 0),typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)?t===0&&typeof e=="number"&&isFinite(e)&&(e<0||isNaN(e))?(r.errors=[{instancePath:s,schemaPath:"#/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1):(r.errors=n,t===0):(r.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1)}r.evaluated={dynamicProps:!1,dynamicItems:!1};export{p as validateEpochSecondsOrZero}; diff --git a/web/js/api/generated/validators/EptzConfigString.d.mts b/web/js/api/generated/validators/EptzConfigString.d.mts new file mode 100644 index 000000000..cce369569 --- /dev/null +++ b/web/js/api/generated/validators/EptzConfigString.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateEptzConfigString } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/EptzConfigString.mjs b/web/js/api/generated/validators/EptzConfigString.mjs new file mode 100644 index 000000000..1e28ef18e --- /dev/null +++ b/web/js/api/generated/validators/EptzConfigString.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var b=(r,t)=>()=>{try{return t||r((t={exports:{}}).exports,t),t.exports}catch(c){throw t=0,c}};var v=b(d=>{"use strict";Object.defineProperty(d,"__esModule",{value:!0});function h(r){let t=r.length,c=0,u=0,l;for(;u=55296&&l<=56319&&u1||isNaN(e))return i.errors=[{instancePath:t+"/centerX",schemaPath:"#/properties/centerX/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(e<0||isNaN(e))return i.errors=[{instancePath:t+"/centerX",schemaPath:"#/properties/centerX/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1}else return i.errors=[{instancePath:t+"/centerX",schemaPath:"#/properties/centerX/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var a=m===s}else var a=!0;if(a){if(r.centerY!==void 0){let e=r.centerY,m=s;if(s===m)if(typeof e=="number"&&isFinite(e)){if(e>1||isNaN(e))return i.errors=[{instancePath:t+"/centerY",schemaPath:"#/properties/centerY/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(e<0||isNaN(e))return i.errors=[{instancePath:t+"/centerY",schemaPath:"#/properties/centerY/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1}else return i.errors=[{instancePath:t+"/centerY",schemaPath:"#/properties/centerY/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var a=m===s}else var a=!0;if(a){if(r.radius!==void 0){let e=r.radius,m=s;if(s===m)if(typeof e=="number"&&isFinite(e)){if(e>1||isNaN(e))return i.errors=[{instancePath:t+"/radius",schemaPath:"#/properties/radius/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(e<.05||isNaN(e))return i.errors=[{instancePath:t+"/radius",schemaPath:"#/properties/radius/minimum",keyword:"minimum",params:{comparison:">=",limit:.05},message:"must be >= 0.05"}],!1}else return i.errors=[{instancePath:t+"/radius",schemaPath:"#/properties/radius/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var a=m===s}else var a=!0;if(a){if(r.fov!==void 0){let e=r.fov,m=s;if(s===m)if(typeof e=="number"&&isFinite(e)){if(e>360||isNaN(e))return i.errors=[{instancePath:t+"/fov",schemaPath:"#/properties/fov/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(e<160||isNaN(e))return i.errors=[{instancePath:t+"/fov",schemaPath:"#/properties/fov/minimum",keyword:"minimum",params:{comparison:">=",limit:160},message:"must be >= 160"}],!1}else return i.errors=[{instancePath:t+"/fov",schemaPath:"#/properties/fov/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var a=m===s}else var a=!0;if(a){if(r.rotation!==void 0){let e=r.rotation,m=s;if(s===m)if(typeof e=="number"&&isFinite(e)){if(e>360||isNaN(e))return i.errors=[{instancePath:t+"/rotation",schemaPath:"#/properties/rotation/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(e<-360||isNaN(e))return i.errors=[{instancePath:t+"/rotation",schemaPath:"#/properties/rotation/minimum",keyword:"minimum",params:{comparison:">=",limit:-360},message:"must be >= -360"}],!1}else return i.errors=[{instancePath:t+"/rotation",schemaPath:"#/properties/rotation/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var a=m===s}else var a=!0;if(a){if(r.defaultYaw!==void 0){let e=r.defaultYaw,m=s;if(s===m)if(typeof e=="number"&&isFinite(e)){if(e>360||isNaN(e))return i.errors=[{instancePath:t+"/defaultYaw",schemaPath:"#/properties/defaultYaw/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(e<-360||isNaN(e))return i.errors=[{instancePath:t+"/defaultYaw",schemaPath:"#/properties/defaultYaw/minimum",keyword:"minimum",params:{comparison:">=",limit:-360},message:"must be >= -360"}],!1}else return i.errors=[{instancePath:t+"/defaultYaw",schemaPath:"#/properties/defaultYaw/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var a=m===s}else var a=!0;if(a){if(r.defaultTilt!==void 0){let e=r.defaultTilt,m=s;if(s===m)if(typeof e=="number"&&isFinite(e)){if(e>30||isNaN(e))return i.errors=[{instancePath:t+"/defaultTilt",schemaPath:"#/properties/defaultTilt/maximum",keyword:"maximum",params:{comparison:"<=",limit:30},message:"must be <= 30"}],!1;if(e<-90||isNaN(e))return i.errors=[{instancePath:t+"/defaultTilt",schemaPath:"#/properties/defaultTilt/minimum",keyword:"minimum",params:{comparison:">=",limit:-90},message:"must be >= -90"}],!1}else return i.errors=[{instancePath:t+"/defaultTilt",schemaPath:"#/properties/defaultTilt/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var a=m===s}else var a=!0;if(a)if(r.defaultViewFov!==void 0){let e=r.defaultViewFov,m=s;if(s===m)if(typeof e=="number"&&isFinite(e)){if(e>120||isNaN(e))return i.errors=[{instancePath:t+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/maximum",keyword:"maximum",params:{comparison:"<=",limit:120},message:"must be <= 120"}],!1;if(e<20||isNaN(e))return i.errors=[{instancePath:t+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/minimum",keyword:"minimum",params:{comparison:">=",limit:20},message:"must be >= 20"}],!1}else return i.errors=[{instancePath:t+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var a=m===s}else var a=!0}}}}}}}}}}else return i.errors=[{instancePath:t,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return i.errors=p,s===0}i.evaluated={props:{version:!0,projection:!0,mount:!0,centerX:!0,centerY:!0,radius:!0,fov:!0,rotation:!0,defaultYaw:!0,defaultTilt:!0,defaultViewFov:!0},dynamicProps:!1,dynamicItems:!1};function f(r,{instancePath:t="",parentData:c,parentDataProperty:u,rootData:l=r,dynamicAnchors:y={}}={}){let p=null,s=0,o=f.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),s===0)if(typeof r=="string"){if(g(r)>1023)return f.errors=[{instancePath:t,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:1023},message:"must NOT have more than 1023 characters"}],!1;if(new TextEncoder().encode(r).byteLength>1023)return f.errors=[{instancePath:t,schemaPath:"#/x-lightnvr-max-bytes",keyword:"x-lightnvr-max-bytes",params:{},message:"must fit the UTF-8 byte limit"}],!1;if(r!==""){let n,e=!0;try{n=JSON.parse(r)}catch{e=!1}if(e){let m=s;i(n,{instancePath:t,parentData:r,parentDataProperty:u,rootData:l,dynamicAnchors:y})||(p=p===null?i.errors:p.concat(i.errors),s=p.length);var a=m===s;e=a}if(!e)return f.errors=[{instancePath:t,schemaPath:"#/contentSchema",keyword:"contentSchema",params:{},message:"must contain valid JSON matching contentSchema (or be empty)"}],!1}}else return f.errors=[{instancePath:t,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return f.errors=p,s===0}f.evaluated={dynamicProps:!1,dynamicItems:!1};export{N as validateEptzConfigString}; diff --git a/web/js/api/generated/validators/EptzConfigV1.d.mts b/web/js/api/generated/validators/EptzConfigV1.d.mts new file mode 100644 index 000000000..d2efa12b0 --- /dev/null +++ b/web/js/api/generated/validators/EptzConfigV1.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateEptzConfigV1 } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/EptzConfigV1.mjs b/web/js/api/generated/validators/EptzConfigV1.mjs new file mode 100644 index 000000000..b5ba71c36 --- /dev/null +++ b/web/js/api/generated/validators/EptzConfigV1.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var c=i;function i(r,{instancePath:m="",parentData:f,parentDataProperty:l,rootData:p=r,dynamicAnchors:d={}}={}){let u=null,s=0,o=i.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),s===0)if(r&&typeof r=="object"&&!Array.isArray(r)){let n;if(r.version===void 0&&(n="version")||r.projection===void 0&&(n="projection")||r.mount===void 0&&(n="mount")||r.centerX===void 0&&(n="centerX")||r.centerY===void 0&&(n="centerY")||r.radius===void 0&&(n="radius")||r.fov===void 0&&(n="fov")||r.rotation===void 0&&(n="rotation")||r.defaultYaw===void 0&&(n="defaultYaw")||r.defaultTilt===void 0&&(n="defaultTilt")||r.defaultViewFov===void 0&&(n="defaultViewFov"))return i.errors=[{instancePath:m,schemaPath:"#/required",keyword:"required",params:{missingProperty:n},message:"must have required property '"+n+"'"}],!1;if(r.version!==void 0){let e=s;if(r.version!==1)return i.errors=[{instancePath:m+"/version",schemaPath:"#/properties/version/const",keyword:"const",params:{allowedValue:1},message:"must be equal to constant"}],!1;var t=e===s}else var t=!0;if(t){if(r.projection!==void 0){let e=s;if(r.projection!=="equidistant")return i.errors=[{instancePath:m+"/projection",schemaPath:"#/properties/projection/const",keyword:"const",params:{allowedValue:"equidistant"},message:"must be equal to constant"}],!1;var t=e===s}else var t=!0;if(t){if(r.mount!==void 0){let e=s;if(r.mount!=="ceiling")return i.errors=[{instancePath:m+"/mount",schemaPath:"#/properties/mount/const",keyword:"const",params:{allowedValue:"ceiling"},message:"must be equal to constant"}],!1;var t=e===s}else var t=!0;if(t){if(r.centerX!==void 0){let e=r.centerX,a=s;if(s===a)if(typeof e=="number"&&isFinite(e)){if(e>1||isNaN(e))return i.errors=[{instancePath:m+"/centerX",schemaPath:"#/properties/centerX/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(e<0||isNaN(e))return i.errors=[{instancePath:m+"/centerX",schemaPath:"#/properties/centerX/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1}else return i.errors=[{instancePath:m+"/centerX",schemaPath:"#/properties/centerX/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var t=a===s}else var t=!0;if(t){if(r.centerY!==void 0){let e=r.centerY,a=s;if(s===a)if(typeof e=="number"&&isFinite(e)){if(e>1||isNaN(e))return i.errors=[{instancePath:m+"/centerY",schemaPath:"#/properties/centerY/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(e<0||isNaN(e))return i.errors=[{instancePath:m+"/centerY",schemaPath:"#/properties/centerY/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1}else return i.errors=[{instancePath:m+"/centerY",schemaPath:"#/properties/centerY/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var t=a===s}else var t=!0;if(t){if(r.radius!==void 0){let e=r.radius,a=s;if(s===a)if(typeof e=="number"&&isFinite(e)){if(e>1||isNaN(e))return i.errors=[{instancePath:m+"/radius",schemaPath:"#/properties/radius/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(e<.05||isNaN(e))return i.errors=[{instancePath:m+"/radius",schemaPath:"#/properties/radius/minimum",keyword:"minimum",params:{comparison:">=",limit:.05},message:"must be >= 0.05"}],!1}else return i.errors=[{instancePath:m+"/radius",schemaPath:"#/properties/radius/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var t=a===s}else var t=!0;if(t){if(r.fov!==void 0){let e=r.fov,a=s;if(s===a)if(typeof e=="number"&&isFinite(e)){if(e>360||isNaN(e))return i.errors=[{instancePath:m+"/fov",schemaPath:"#/properties/fov/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(e<160||isNaN(e))return i.errors=[{instancePath:m+"/fov",schemaPath:"#/properties/fov/minimum",keyword:"minimum",params:{comparison:">=",limit:160},message:"must be >= 160"}],!1}else return i.errors=[{instancePath:m+"/fov",schemaPath:"#/properties/fov/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var t=a===s}else var t=!0;if(t){if(r.rotation!==void 0){let e=r.rotation,a=s;if(s===a)if(typeof e=="number"&&isFinite(e)){if(e>360||isNaN(e))return i.errors=[{instancePath:m+"/rotation",schemaPath:"#/properties/rotation/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(e<-360||isNaN(e))return i.errors=[{instancePath:m+"/rotation",schemaPath:"#/properties/rotation/minimum",keyword:"minimum",params:{comparison:">=",limit:-360},message:"must be >= -360"}],!1}else return i.errors=[{instancePath:m+"/rotation",schemaPath:"#/properties/rotation/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var t=a===s}else var t=!0;if(t){if(r.defaultYaw!==void 0){let e=r.defaultYaw,a=s;if(s===a)if(typeof e=="number"&&isFinite(e)){if(e>360||isNaN(e))return i.errors=[{instancePath:m+"/defaultYaw",schemaPath:"#/properties/defaultYaw/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(e<-360||isNaN(e))return i.errors=[{instancePath:m+"/defaultYaw",schemaPath:"#/properties/defaultYaw/minimum",keyword:"minimum",params:{comparison:">=",limit:-360},message:"must be >= -360"}],!1}else return i.errors=[{instancePath:m+"/defaultYaw",schemaPath:"#/properties/defaultYaw/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var t=a===s}else var t=!0;if(t){if(r.defaultTilt!==void 0){let e=r.defaultTilt,a=s;if(s===a)if(typeof e=="number"&&isFinite(e)){if(e>30||isNaN(e))return i.errors=[{instancePath:m+"/defaultTilt",schemaPath:"#/properties/defaultTilt/maximum",keyword:"maximum",params:{comparison:"<=",limit:30},message:"must be <= 30"}],!1;if(e<-90||isNaN(e))return i.errors=[{instancePath:m+"/defaultTilt",schemaPath:"#/properties/defaultTilt/minimum",keyword:"minimum",params:{comparison:">=",limit:-90},message:"must be >= -90"}],!1}else return i.errors=[{instancePath:m+"/defaultTilt",schemaPath:"#/properties/defaultTilt/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var t=a===s}else var t=!0;if(t)if(r.defaultViewFov!==void 0){let e=r.defaultViewFov,a=s;if(s===a)if(typeof e=="number"&&isFinite(e)){if(e>120||isNaN(e))return i.errors=[{instancePath:m+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/maximum",keyword:"maximum",params:{comparison:"<=",limit:120},message:"must be <= 120"}],!1;if(e<20||isNaN(e))return i.errors=[{instancePath:m+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/minimum",keyword:"minimum",params:{comparison:">=",limit:20},message:"must be >= 20"}],!1}else return i.errors=[{instancePath:m+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var t=a===s}else var t=!0}}}}}}}}}}else return i.errors=[{instancePath:m,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return i.errors=u,s===0}i.evaluated={props:{version:!0,projection:!0,mount:!0,centerX:!0,centerY:!0,radius:!0,fov:!0,rotation:!0,defaultYaw:!0,defaultTilt:!0,defaultViewFov:!0},dynamicProps:!1,dynamicItems:!1};export{c as validateEptzConfigV1}; diff --git a/web/js/api/generated/validators/ErrorResponse.d.mts b/web/js/api/generated/validators/ErrorResponse.d.mts new file mode 100644 index 000000000..5a936f24c --- /dev/null +++ b/web/js/api/generated/validators/ErrorResponse.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateErrorResponse } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/ErrorResponse.mjs b/web/js/api/generated/validators/ErrorResponse.mjs new file mode 100644 index 000000000..635a9700c --- /dev/null +++ b/web/js/api/generated/validators/ErrorResponse.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var m=(e,r)=>()=>{try{return r||e((r={exports:{}}).exports,r),r.exports}catch(n){throw r=0,n}};var d=m(c=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0});function p(e){let r=e.length,n=0,s=0,o;for(;s=55296&&o<=56319&&s168)return e.errors=[{instancePath:t,schemaPath:"#/maxItems",keyword:"maxItems",params:{limit:168},message:"must NOT have more than 168 items"}],!1;if(r.length<168)return e.errors=[{instancePath:t,schemaPath:"#/minItems",keyword:"minItems",params:{limit:168},message:"must NOT have fewer than 168 items"}],!1;{var o=!0;let i=r.length;for(let m=0;m2147483647||isNaN(e))return r.errors=[{instancePath:m,schemaPath:"#/maximum",keyword:"maximum",params:{comparison:"<=",limit:2147483647},message:"must be <= 2147483647"}],!1;if(e<-2147483648||isNaN(e))return r.errors=[{instancePath:m,schemaPath:"#/minimum",keyword:"minimum",params:{comparison:">=",limit:-2147483648},message:"must be >= -2147483648"}],!1}return r.errors=t,s===0}r.evaluated={dynamicProps:!1,dynamicItems:!1};export{p as validateInt32}; diff --git a/web/js/api/generated/validators/LegacyStreamList.d.mts b/web/js/api/generated/validators/LegacyStreamList.d.mts new file mode 100644 index 000000000..644229458 --- /dev/null +++ b/web/js/api/generated/validators/LegacyStreamList.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateLegacyStreamList } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/LegacyStreamList.mjs b/web/js/api/generated/validators/LegacyStreamList.mjs new file mode 100644 index 000000000..dff3db7c7 --- /dev/null +++ b/web/js/api/generated/validators/LegacyStreamList.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var H=(e,n)=>()=>{try{return n||e((n={exports:{}}).exports,n),n.exports}catch(b){throw n=0,b}};var K=H(W=>{"use strict";Object.defineProperty(W,"__esModule",{value:!0});function Z(e){let n=e.length,b=0,g=0,c;for(;g=55296&&c<=56319&&g36)return N.errors=[{instancePath:n,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:36},message:"must NOT have more than 36 characters"}],!1;if(!J.test(e))return N.errors=[{instancePath:n,schemaPath:"#/pattern",keyword:"pattern",params:{pattern:"^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$"},message:'must match pattern "^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$"'}],!1}else return N.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return N.errors=t,r===0}N.evaluated={dynamicProps:!1,dynamicItems:!1};function I(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=I.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(typeof e=="string"){if(x(e)>255)return I.errors=[{instancePath:n,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1;if(x(e)<1)return I.errors=[{instancePath:n,schemaPath:"#/minLength",keyword:"minLength",params:{limit:1},message:"must NOT have fewer than 1 characters"}],!1;if(new TextEncoder().encode(e).byteLength>255)return I.errors=[{instancePath:n,schemaPath:"#/x-lightnvr-max-bytes",keyword:"x-lightnvr-max-bytes",params:{},message:"must fit the UTF-8 byte limit"}],!1}else return I.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return I.errors=t,r===0}I.evaluated={dynamicProps:!1,dynamicItems:!1};var M={type:"string",enum:["auto","webrtc_only","mse_only","hls_only","webrtc_then_mse","mse_then_hls"],$id:"urn:lightnvr:contract:PlaybackTransport"};function T(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=T.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e!="string"?(T.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1):e==="auto"||e==="webrtc_only"||e==="mse_only"||e==="hls_only"||e==="webrtc_then_mse"||e==="mse_then_hls"?(T.errors=t,r===0):(T.errors=[{instancePath:n,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:M.enum},message:"must be equal to one of the allowed values"}],!1)}T.evaluated={dynamicProps:!1,dynamicItems:!1};function v(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=v.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let y;if(e.version===void 0&&(y="version")||e.projection===void 0&&(y="projection")||e.mount===void 0&&(y="mount")||e.centerX===void 0&&(y="centerX")||e.centerY===void 0&&(y="centerY")||e.radius===void 0&&(y="radius")||e.fov===void 0&&(y="fov")||e.rotation===void 0&&(y="rotation")||e.defaultYaw===void 0&&(y="defaultYaw")||e.defaultTilt===void 0&&(y="defaultTilt")||e.defaultViewFov===void 0&&(y="defaultViewFov"))return v.errors=[{instancePath:n,schemaPath:"#/required",keyword:"required",params:{missingProperty:y},message:"must have required property '"+y+"'"}],!1;if(e.version!==void 0){let a=r;if(e.version!==1)return v.errors=[{instancePath:n+"/version",schemaPath:"#/properties/version/const",keyword:"const",params:{allowedValue:1},message:"must be equal to constant"}],!1;var p=a===r}else var p=!0;if(p){if(e.projection!==void 0){let a=r;if(e.projection!=="equidistant")return v.errors=[{instancePath:n+"/projection",schemaPath:"#/properties/projection/const",keyword:"const",params:{allowedValue:"equidistant"},message:"must be equal to constant"}],!1;var p=a===r}else var p=!0;if(p){if(e.mount!==void 0){let a=r;if(e.mount!=="ceiling")return v.errors=[{instancePath:n+"/mount",schemaPath:"#/properties/mount/const",keyword:"const",params:{allowedValue:"ceiling"},message:"must be equal to constant"}],!1;var p=a===r}else var p=!0;if(p){if(e.centerX!==void 0){let a=e.centerX,l=r;if(r===l)if(typeof a=="number"&&isFinite(a)){if(a>1||isNaN(a))return v.errors=[{instancePath:n+"/centerX",schemaPath:"#/properties/centerX/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(a<0||isNaN(a))return v.errors=[{instancePath:n+"/centerX",schemaPath:"#/properties/centerX/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1}else return v.errors=[{instancePath:n+"/centerX",schemaPath:"#/properties/centerX/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=l===r}else var p=!0;if(p){if(e.centerY!==void 0){let a=e.centerY,l=r;if(r===l)if(typeof a=="number"&&isFinite(a)){if(a>1||isNaN(a))return v.errors=[{instancePath:n+"/centerY",schemaPath:"#/properties/centerY/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(a<0||isNaN(a))return v.errors=[{instancePath:n+"/centerY",schemaPath:"#/properties/centerY/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1}else return v.errors=[{instancePath:n+"/centerY",schemaPath:"#/properties/centerY/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=l===r}else var p=!0;if(p){if(e.radius!==void 0){let a=e.radius,l=r;if(r===l)if(typeof a=="number"&&isFinite(a)){if(a>1||isNaN(a))return v.errors=[{instancePath:n+"/radius",schemaPath:"#/properties/radius/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(a<.05||isNaN(a))return v.errors=[{instancePath:n+"/radius",schemaPath:"#/properties/radius/minimum",keyword:"minimum",params:{comparison:">=",limit:.05},message:"must be >= 0.05"}],!1}else return v.errors=[{instancePath:n+"/radius",schemaPath:"#/properties/radius/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=l===r}else var p=!0;if(p){if(e.fov!==void 0){let a=e.fov,l=r;if(r===l)if(typeof a=="number"&&isFinite(a)){if(a>360||isNaN(a))return v.errors=[{instancePath:n+"/fov",schemaPath:"#/properties/fov/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(a<160||isNaN(a))return v.errors=[{instancePath:n+"/fov",schemaPath:"#/properties/fov/minimum",keyword:"minimum",params:{comparison:">=",limit:160},message:"must be >= 160"}],!1}else return v.errors=[{instancePath:n+"/fov",schemaPath:"#/properties/fov/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=l===r}else var p=!0;if(p){if(e.rotation!==void 0){let a=e.rotation,l=r;if(r===l)if(typeof a=="number"&&isFinite(a)){if(a>360||isNaN(a))return v.errors=[{instancePath:n+"/rotation",schemaPath:"#/properties/rotation/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(a<-360||isNaN(a))return v.errors=[{instancePath:n+"/rotation",schemaPath:"#/properties/rotation/minimum",keyword:"minimum",params:{comparison:">=",limit:-360},message:"must be >= -360"}],!1}else return v.errors=[{instancePath:n+"/rotation",schemaPath:"#/properties/rotation/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=l===r}else var p=!0;if(p){if(e.defaultYaw!==void 0){let a=e.defaultYaw,l=r;if(r===l)if(typeof a=="number"&&isFinite(a)){if(a>360||isNaN(a))return v.errors=[{instancePath:n+"/defaultYaw",schemaPath:"#/properties/defaultYaw/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(a<-360||isNaN(a))return v.errors=[{instancePath:n+"/defaultYaw",schemaPath:"#/properties/defaultYaw/minimum",keyword:"minimum",params:{comparison:">=",limit:-360},message:"must be >= -360"}],!1}else return v.errors=[{instancePath:n+"/defaultYaw",schemaPath:"#/properties/defaultYaw/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=l===r}else var p=!0;if(p){if(e.defaultTilt!==void 0){let a=e.defaultTilt,l=r;if(r===l)if(typeof a=="number"&&isFinite(a)){if(a>30||isNaN(a))return v.errors=[{instancePath:n+"/defaultTilt",schemaPath:"#/properties/defaultTilt/maximum",keyword:"maximum",params:{comparison:"<=",limit:30},message:"must be <= 30"}],!1;if(a<-90||isNaN(a))return v.errors=[{instancePath:n+"/defaultTilt",schemaPath:"#/properties/defaultTilt/minimum",keyword:"minimum",params:{comparison:">=",limit:-90},message:"must be >= -90"}],!1}else return v.errors=[{instancePath:n+"/defaultTilt",schemaPath:"#/properties/defaultTilt/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=l===r}else var p=!0;if(p)if(e.defaultViewFov!==void 0){let a=e.defaultViewFov,l=r;if(r===l)if(typeof a=="number"&&isFinite(a)){if(a>120||isNaN(a))return v.errors=[{instancePath:n+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/maximum",keyword:"maximum",params:{comparison:"<=",limit:120},message:"must be <= 120"}],!1;if(a<20||isNaN(a))return v.errors=[{instancePath:n+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/minimum",keyword:"minimum",params:{comparison:">=",limit:20},message:"must be >= 20"}],!1}else return v.errors=[{instancePath:n+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=l===r}else var p=!0}}}}}}}}}}else return v.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return v.errors=t,r===0}v.evaluated={props:{version:!0,projection:!0,mount:!0,centerX:!0,centerY:!0,radius:!0,fov:!0,rotation:!0,defaultYaw:!0,defaultTilt:!0,defaultViewFov:!0},dynamicProps:!1,dynamicItems:!1};function S(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=S.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(typeof e=="string"){if(x(e)>1023)return S.errors=[{instancePath:n,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:1023},message:"must NOT have more than 1023 characters"}],!1;if(new TextEncoder().encode(e).byteLength>1023)return S.errors=[{instancePath:n,schemaPath:"#/x-lightnvr-max-bytes",keyword:"x-lightnvr-max-bytes",params:{},message:"must fit the UTF-8 byte limit"}],!1;if(e!==""){let y,a=!0;try{y=JSON.parse(e)}catch{a=!1}if(a){let l=r;v(y,{instancePath:n,parentData:e,parentDataProperty:g,rootData:c,dynamicAnchors:d})||(t=t===null?v.errors:t.concat(v.errors),r=t.length);var p=l===r;a=p}if(!a)return S.errors=[{instancePath:n,schemaPath:"#/contentSchema",keyword:"contentSchema",params:{},message:"must contain valid JSON matching contentSchema (or be empty)"}],!1}}else return S.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return S.errors=t,r===0}S.evaluated={dynamicProps:!1,dynamicItems:!1};function h(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=h.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),!(typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)))return h.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(r===0&&typeof e=="number"&&isFinite(e)){if(e>2147483647||isNaN(e))return h.errors=[{instancePath:n,schemaPath:"#/maximum",keyword:"maximum",params:{comparison:"<=",limit:2147483647},message:"must be <= 2147483647"}],!1;if(e<-2147483648||isNaN(e))return h.errors=[{instancePath:n,schemaPath:"#/minimum",keyword:"minimum",params:{comparison:">=",limit:-2147483648},message:"must be >= -2147483648"}],!1}return h.errors=t,r===0}h.evaluated={dynamicProps:!1,dynamicItems:!1};var Q={type:"integer",enum:[0,1],$id:"urn:lightnvr:contract:StreamProtocol"};function E(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=E.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)?e===0||e===1?(E.errors=t,r===0):(E.errors=[{instancePath:n,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:Q.enum},message:"must be equal to one of the allowed values"}],!1):(E.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1)}E.evaluated={dynamicProps:!1,dynamicItems:!1};function L(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=L.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),!(typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)))return L.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(r===0&&typeof e=="number"&&isFinite(e)){if(e>365||isNaN(e))return L.errors=[{instancePath:n,schemaPath:"#/maximum",keyword:"maximum",params:{comparison:"<=",limit:365},message:"must be <= 365"}],!1;if(e<-1||isNaN(e))return L.errors=[{instancePath:n,schemaPath:"#/minimum",keyword:"minimum",params:{comparison:">=",limit:-1},message:"must be >= -1"}],!1}return L.errors=t,r===0}L.evaluated={dynamicProps:!1,dynamicItems:!1};function D(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=D.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(Array.isArray(e)){if(e.length>168)return D.errors=[{instancePath:n,schemaPath:"#/maxItems",keyword:"maxItems",params:{limit:168},message:"must NOT have more than 168 items"}],!1;if(e.length<168)return D.errors=[{instancePath:n,schemaPath:"#/minItems",keyword:"minItems",params:{limit:168},message:"must NOT have fewer than 168 items"}],!1;{var p=!0;let y=e.length;for(let a=0;a511)return _.errors=[{instancePath:n+"/url",schemaPath:"#/properties/url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return _.errors=[{instancePath:n+"/url",schemaPath:"#/properties/url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=f===r}else var i=!0;if(i){if(e.enabled!==void 0){let s=r;if(typeof e.enabled!="boolean")return _.errors=[{instancePath:n+"/enabled",schemaPath:"#/properties/enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.streaming_enabled!==void 0){let s=r;if(typeof e.streaming_enabled!="boolean")return _.errors=[{instancePath:n+"/streaming_enabled",schemaPath:"#/properties/streaming_enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.playback_transport!==void 0){let s=r;T(e.playback_transport,{instancePath:n+"/playback_transport",parentData:e,parentDataProperty:"playback_transport",rootData:c,dynamicAnchors:d})||(t=t===null?T.errors:t.concat(T.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.eptz_config!==void 0){let s=r;S(e.eptz_config,{instancePath:n+"/eptz_config",parentData:e,parentDataProperty:"eptz_config",rootData:c,dynamicAnchors:d})||(t=t===null?S.errors:t.concat(S.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.width!==void 0){let s=r;h(e.width,{instancePath:n+"/width",parentData:e,parentDataProperty:"width",rootData:c,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.height!==void 0){let s=r;h(e.height,{instancePath:n+"/height",parentData:e,parentDataProperty:"height",rootData:c,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.fps!==void 0){let s=r;h(e.fps,{instancePath:n+"/fps",parentData:e,parentDataProperty:"fps",rootData:c,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.codec!==void 0){let s=e.codec,f=r;if(r===f)if(typeof s=="string"){if(x(s)>15)return _.errors=[{instancePath:n+"/codec",schemaPath:"#/properties/codec/maxLength",keyword:"maxLength",params:{limit:15},message:"must NOT have more than 15 characters"}],!1}else return _.errors=[{instancePath:n+"/codec",schemaPath:"#/properties/codec/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=f===r}else var i=!0;if(i){if(e.priority!==void 0){let s=r;h(e.priority,{instancePath:n+"/priority",parentData:e,parentDataProperty:"priority",rootData:c,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.record!==void 0){let s=r;if(typeof e.record!="boolean")return _.errors=[{instancePath:n+"/record",schemaPath:"#/properties/record/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.segment_duration!==void 0){let s=r;h(e.segment_duration,{instancePath:n+"/segment_duration",parentData:e,parentDataProperty:"segment_duration",rootData:c,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.detection_based_recording!==void 0){let s=r;if(typeof e.detection_based_recording!="boolean")return _.errors=[{instancePath:n+"/detection_based_recording",schemaPath:"#/properties/detection_based_recording/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.detection_model!==void 0){let s=e.detection_model,f=r;if(r===f)if(typeof s=="string"){if(x(s)>511)return _.errors=[{instancePath:n+"/detection_model",schemaPath:"#/properties/detection_model/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return _.errors=[{instancePath:n+"/detection_model",schemaPath:"#/properties/detection_model/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=f===r}else var i=!0;if(i){if(e.detection_threshold!==void 0){let s=e.detection_threshold,f=r;if(!(typeof s=="number"&&!(s%1)&&!isNaN(s)&&isFinite(s)))return _.errors=[{instancePath:n+"/detection_threshold",schemaPath:"#/properties/detection_threshold/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;var i=f===r}else var i=!0;if(i){if(e.detection_interval!==void 0){let s=r;h(e.detection_interval,{instancePath:n+"/detection_interval",parentData:e,parentDataProperty:"detection_interval",rootData:c,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.pre_detection_buffer!==void 0){let s=r;h(e.pre_detection_buffer,{instancePath:n+"/pre_detection_buffer",parentData:e,parentDataProperty:"pre_detection_buffer",rootData:c,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.post_detection_buffer!==void 0){let s=r;h(e.post_detection_buffer,{instancePath:n+"/post_detection_buffer",parentData:e,parentDataProperty:"post_detection_buffer",rootData:c,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.detection_object_filter!==void 0){let s=e.detection_object_filter,f=r;if(r===f)if(typeof s=="string"){if(x(s)>15)return _.errors=[{instancePath:n+"/detection_object_filter",schemaPath:"#/properties/detection_object_filter/maxLength",keyword:"maxLength",params:{limit:15},message:"must NOT have more than 15 characters"}],!1}else return _.errors=[{instancePath:n+"/detection_object_filter",schemaPath:"#/properties/detection_object_filter/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=f===r}else var i=!0;if(i){if(e.detection_object_filter_list!==void 0){let s=e.detection_object_filter_list,f=r;if(r===f)if(typeof s=="string"){if(x(s)>255)return _.errors=[{instancePath:n+"/detection_object_filter_list",schemaPath:"#/properties/detection_object_filter_list/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1}else return _.errors=[{instancePath:n+"/detection_object_filter_list",schemaPath:"#/properties/detection_object_filter_list/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=f===r}else var i=!0;if(i){if(e.protocol!==void 0){let s=r;E(e.protocol,{instancePath:n+"/protocol",parentData:e,parentDataProperty:"protocol",rootData:c,dynamicAnchors:d})||(t=t===null?E.errors:t.concat(E.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.record_audio!==void 0){let s=r;if(typeof e.record_audio!="boolean")return _.errors=[{instancePath:n+"/record_audio",schemaPath:"#/properties/record_audio/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.audio_voice_enhancement!==void 0){let s=r;if(typeof e.audio_voice_enhancement!="boolean")return _.errors=[{instancePath:n+"/audio_voice_enhancement",schemaPath:"#/properties/audio_voice_enhancement/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.isOnvif!==void 0){let s=r;if(typeof e.isOnvif!="boolean")return _.errors=[{instancePath:n+"/isOnvif",schemaPath:"#/properties/isOnvif/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.backchannel_enabled!==void 0){let s=r;if(typeof e.backchannel_enabled!="boolean")return _.errors=[{instancePath:n+"/backchannel_enabled",schemaPath:"#/properties/backchannel_enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.retention_days!==void 0){let s=r;L(e.retention_days,{instancePath:n+"/retention_days",parentData:e,parentDataProperty:"retention_days",rootData:c,dynamicAnchors:d})||(t=t===null?L.errors:t.concat(L.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.detection_retention_days!==void 0){let s=r;L(e.detection_retention_days,{instancePath:n+"/detection_retention_days",parentData:e,parentDataProperty:"detection_retention_days",rootData:c,dynamicAnchors:d})||(t=t===null?L.errors:t.concat(L.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.max_storage_mb!==void 0){let s=r;h(e.max_storage_mb,{instancePath:n+"/max_storage_mb",parentData:e,parentDataProperty:"max_storage_mb",rootData:c,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.tier_critical_multiplier!==void 0){let s=e.tier_critical_multiplier,f=r;if(!(typeof s=="number"&&isFinite(s)))return _.errors=[{instancePath:n+"/tier_critical_multiplier",schemaPath:"#/properties/tier_critical_multiplier/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var i=f===r}else var i=!0;if(i){if(e.tier_important_multiplier!==void 0){let s=e.tier_important_multiplier,f=r;if(!(typeof s=="number"&&isFinite(s)))return _.errors=[{instancePath:n+"/tier_important_multiplier",schemaPath:"#/properties/tier_important_multiplier/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var i=f===r}else var i=!0;if(i){if(e.tier_ephemeral_multiplier!==void 0){let s=e.tier_ephemeral_multiplier,f=r;if(!(typeof s=="number"&&isFinite(s)))return _.errors=[{instancePath:n+"/tier_ephemeral_multiplier",schemaPath:"#/properties/tier_ephemeral_multiplier/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var i=f===r}else var i=!0;if(i){if(e.storage_priority!==void 0){let s=r;h(e.storage_priority,{instancePath:n+"/storage_priority",parentData:e,parentDataProperty:"storage_priority",rootData:c,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.ptz_enabled!==void 0){let s=r;if(typeof e.ptz_enabled!="boolean")return _.errors=[{instancePath:n+"/ptz_enabled",schemaPath:"#/properties/ptz_enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.ptz_max_x!==void 0){let s=r;h(e.ptz_max_x,{instancePath:n+"/ptz_max_x",parentData:e,parentDataProperty:"ptz_max_x",rootData:c,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.ptz_max_y!==void 0){let s=r;h(e.ptz_max_y,{instancePath:n+"/ptz_max_y",parentData:e,parentDataProperty:"ptz_max_y",rootData:c,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.ptz_max_z!==void 0){let s=r;h(e.ptz_max_z,{instancePath:n+"/ptz_max_z",parentData:e,parentDataProperty:"ptz_max_z",rootData:c,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.ptz_has_home!==void 0){let s=r;if(typeof e.ptz_has_home!="boolean")return _.errors=[{instancePath:n+"/ptz_has_home",schemaPath:"#/properties/ptz_has_home/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.onvif_username!==void 0){let s=e.onvif_username,f=r;if(r===f)if(typeof s=="string"){if(x(s)>63)return _.errors=[{instancePath:n+"/onvif_username",schemaPath:"#/properties/onvif_username/maxLength",keyword:"maxLength",params:{limit:63},message:"must NOT have more than 63 characters"}],!1}else return _.errors=[{instancePath:n+"/onvif_username",schemaPath:"#/properties/onvif_username/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=f===r}else var i=!0;if(i){if(e.onvif_password!==void 0){let s=e.onvif_password,f=r;if(r===f)if(typeof s=="string"){if(x(s)>63)return _.errors=[{instancePath:n+"/onvif_password",schemaPath:"#/properties/onvif_password/maxLength",keyword:"maxLength",params:{limit:63},message:"must NOT have more than 63 characters"}],!1}else return _.errors=[{instancePath:n+"/onvif_password",schemaPath:"#/properties/onvif_password/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=f===r}else var i=!0;if(i){if(e.onvif_profile!==void 0){let s=e.onvif_profile,f=r;if(r===f)if(typeof s=="string"){if(x(s)>63)return _.errors=[{instancePath:n+"/onvif_profile",schemaPath:"#/properties/onvif_profile/maxLength",keyword:"maxLength",params:{limit:63},message:"must NOT have more than 63 characters"}],!1}else return _.errors=[{instancePath:n+"/onvif_profile",schemaPath:"#/properties/onvif_profile/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=f===r}else var i=!0;if(i){if(e.onvif_port!==void 0){let s=r;h(e.onvif_port,{instancePath:n+"/onvif_port",parentData:e,parentDataProperty:"onvif_port",rootData:c,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.record_on_schedule!==void 0){let s=r;if(typeof e.record_on_schedule!="boolean")return _.errors=[{instancePath:n+"/record_on_schedule",schemaPath:"#/properties/record_on_schedule/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.recording_schedule!==void 0){let s=r;D(e.recording_schedule,{instancePath:n+"/recording_schedule",parentData:e,parentDataProperty:"recording_schedule",rootData:c,dynamicAnchors:d})||(t=t===null?D.errors:t.concat(D.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.detection_record_on_schedule!==void 0){let s=r;if(typeof e.detection_record_on_schedule!="boolean")return _.errors=[{instancePath:n+"/detection_record_on_schedule",schemaPath:"#/properties/detection_record_on_schedule/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.detection_recording_schedule!==void 0){let s=r;D(e.detection_recording_schedule,{instancePath:n+"/detection_recording_schedule",parentData:e,parentDataProperty:"detection_recording_schedule",rootData:c,dynamicAnchors:d})||(t=t===null?D.errors:t.concat(D.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.tags!==void 0){let s=e.tags,f=r;if(r===f)if(typeof s=="string"){if(x(s)>255)return _.errors=[{instancePath:n+"/tags",schemaPath:"#/properties/tags/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1}else return _.errors=[{instancePath:n+"/tags",schemaPath:"#/properties/tags/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=f===r}else var i=!0;if(i){if(e.admin_url!==void 0){let s=e.admin_url,f=r;if(r===f)if(typeof s=="string"){if(x(s)>511)return _.errors=[{instancePath:n+"/admin_url",schemaPath:"#/properties/admin_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return _.errors=[{instancePath:n+"/admin_url",schemaPath:"#/properties/admin_url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=f===r}else var i=!0;if(i){if(e.privacy_mode!==void 0){let s=r;if(typeof e.privacy_mode!="boolean")return _.errors=[{instancePath:n+"/privacy_mode",schemaPath:"#/properties/privacy_mode/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.can_control_privacy!==void 0){let s=r;if(typeof e.can_control_privacy!="boolean")return _.errors=[{instancePath:n+"/can_control_privacy",schemaPath:"#/properties/can_control_privacy/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.motion_trigger_source!==void 0){let s=e.motion_trigger_source,f=r;if(r===f)if(typeof s=="string"){if(x(s)>255)return _.errors=[{instancePath:n+"/motion_trigger_source",schemaPath:"#/properties/motion_trigger_source/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1}else return _.errors=[{instancePath:n+"/motion_trigger_source",schemaPath:"#/properties/motion_trigger_source/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=f===r}else var i=!0;if(i){if(e.go2rtc_source_override!==void 0){let s=e.go2rtc_source_override,f=r;if(r===f)if(typeof s=="string"){if(x(s)>8191)return _.errors=[{instancePath:n+"/go2rtc_source_override",schemaPath:"#/properties/go2rtc_source_override/maxLength",keyword:"maxLength",params:{limit:8191},message:"must NOT have more than 8191 characters"}],!1}else return _.errors=[{instancePath:n+"/go2rtc_source_override",schemaPath:"#/properties/go2rtc_source_override/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=f===r}else var i=!0;if(i){if(e.sub_stream_url!==void 0){let s=e.sub_stream_url,f=r;if(r===f)if(typeof s=="string"){if(x(s)>511)return _.errors=[{instancePath:n+"/sub_stream_url",schemaPath:"#/properties/sub_stream_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return _.errors=[{instancePath:n+"/sub_stream_url",schemaPath:"#/properties/sub_stream_url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=f===r}else var i=!0;if(i){if(e.has_sub_stream!==void 0){let s=r;if(typeof e.has_sub_stream!="boolean")return _.errors=[{instancePath:n+"/has_sub_stream",schemaPath:"#/properties/has_sub_stream/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.detection_url!==void 0){let s=e.detection_url,f=r;if(r===f)if(typeof s=="string"){if(x(s)>511)return _.errors=[{instancePath:n+"/detection_url",schemaPath:"#/properties/detection_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return _.errors=[{instancePath:n+"/detection_url",schemaPath:"#/properties/detection_url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=f===r}else var i=!0;if(i){if(e.publish_url!==void 0){let s=e.publish_url,f=r;if(r===f)if(typeof s=="string"){if(x(s)>511)return _.errors=[{instancePath:n+"/publish_url",schemaPath:"#/properties/publish_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return _.errors=[{instancePath:n+"/publish_url",schemaPath:"#/properties/publish_url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=f===r}else var i=!0;if(i){if(e.status!==void 0){let s=r;A(e.status,{instancePath:n+"/status",parentData:e,parentDataProperty:"status",rootData:c,dynamicAnchors:d})||(t=t===null?A.errors:t.concat(A.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.error_message!==void 0){let s=e.error_message,f=r;if(r===f)if(typeof s=="string"){if(x(s)>255)return _.errors=[{instancePath:n+"/error_message",schemaPath:"#/properties/error_message/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1;if(x(s)<1)return _.errors=[{instancePath:n+"/error_message",schemaPath:"#/properties/error_message/minLength",keyword:"minLength",params:{limit:1},message:"must NOT have fewer than 1 characters"}],!1}else return _.errors=[{instancePath:n+"/error_message",schemaPath:"#/properties/error_message/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=f===r}else var i=!0;if(i)if(e.go2rtc_hls_available!==void 0){let s=r;if(typeof e.go2rtc_hls_available!="boolean")return _.errors=[{instancePath:n+"/go2rtc_hls_available",schemaPath:"#/properties/go2rtc_hls_available/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}else return _.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return _.errors=t,r===0}_.evaluated={props:{camera_uuid:!0,location_uuid:!0,name:!0,url:!0,enabled:!0,streaming_enabled:!0,playback_transport:!0,eptz_config:!0,width:!0,height:!0,fps:!0,codec:!0,priority:!0,record:!0,segment_duration:!0,detection_based_recording:!0,detection_model:!0,detection_threshold:!0,detection_interval:!0,pre_detection_buffer:!0,post_detection_buffer:!0,detection_object_filter:!0,detection_object_filter_list:!0,protocol:!0,record_audio:!0,audio_voice_enhancement:!0,isOnvif:!0,backchannel_enabled:!0,retention_days:!0,detection_retention_days:!0,max_storage_mb:!0,tier_critical_multiplier:!0,tier_important_multiplier:!0,tier_ephemeral_multiplier:!0,storage_priority:!0,ptz_enabled:!0,ptz_max_x:!0,ptz_max_y:!0,ptz_max_z:!0,ptz_has_home:!0,onvif_username:!0,onvif_password:!0,onvif_profile:!0,onvif_port:!0,record_on_schedule:!0,recording_schedule:!0,detection_record_on_schedule:!0,detection_recording_schedule:!0,tags:!0,admin_url:!0,privacy_mode:!0,can_control_privacy:!0,motion_trigger_source:!0,go2rtc_source_override:!0,sub_stream_url:!0,has_sub_stream:!0,detection_url:!0,publish_url:!0,status:!0,error_message:!0,go2rtc_hls_available:!0},dynamicProps:!1,dynamicItems:!1};var ee=new RegExp("^(?![A-Za-z][A-Za-z0-9+.-]*://[^/?#]*@)","u");function O(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=O.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(typeof e=="string"){if(x(e)>511)return O.errors=[{instancePath:n,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1;if(!ee.test(e))return O.errors=[{instancePath:n,schemaPath:"#/pattern",keyword:"pattern",params:{pattern:"^(?![A-Za-z][A-Za-z0-9+.-]*://[^/?#]*@)"},message:'must match pattern "^(?![A-Za-z][A-Za-z0-9+.-]*://[^/?#]*@)"'}],!1}else return O.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return O.errors=t,r===0}O.evaluated={dynamicProps:!1,dynamicItems:!1};function $(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=$.evaluated;o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0);let p=r;_(e,{instancePath:n,parentData:b,parentDataProperty:g,rootData:c,dynamicAnchors:d})||(t=t===null?_.errors:t.concat(_.errors),r=t.length);var y=p===r;if(y){let j=r,i=r,m=!0,s=r,f=r,z=!1,R=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let P;if(e.isOnvif===void 0&&(P="isOnvif")){let k={};t===null?t=[k]:t.push(k),r++}else if(e.isOnvif!==void 0&&e.isOnvif!==!0){let k={};t===null?t=[k]:t.push(k),r++}}var l=R===r;if(z=z||l,l){var a={};a.isOnvif=!0}let X=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let P;if(e.onvif_username===void 0&&(P="onvif_username")){let k={};t===null?t=[k]:t.push(k),r++}else if(e.onvif_username!==void 0){let k=e.onvif_username;if(typeof k=="string"&&x(k)<1){let U={};t===null?t=[U]:t.push(U),r++}}}var l=X===r;z=z||l,l&&a!==!0&&(a=a||{},a.onvif_username=!0);let B=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let P;if(e.onvif_password===void 0&&(P="onvif_password")){let k={};t===null?t=[k]:t.push(k),r++}else if(e.onvif_password!==void 0){let k=e.onvif_password;if(typeof k=="string"&&x(k)<1){let U={};t===null?t=[U]:t.push(U),r++}}}var l=B===r;if(z=z||l,l&&a!==!0&&(a=a||{},a.onvif_password=!0),z)r=f,t!==null&&(f?t.length=f:t=null);else{let P={};t===null?t=[P]:t.push(P),r++}var u=s===r;if(r=i,t!==null&&(i?t.length=i:t=null),u){let P=r;e&&typeof e=="object"&&!Array.isArray(e)&&e.url!==void 0&&(O(e.url,{instancePath:n+"/url",parentData:e,parentDataProperty:"url",rootData:c,dynamicAnchors:d})||(t=t===null?O.errors:t.concat(O.errors),r=t.length));var u=P===r;m=u,m&&a!==!0&&(a=a||{},a.url=!0)}if(!m){let P={instancePath:n,schemaPath:"#/allOf/1/if",keyword:"if",params:{failingKeyword:"then"},message:'must match "then" schema'};return t===null?t=[P]:t.push(P),r++,$.errors=t,!1}if(r===j)if(e&&typeof e=="object"&&!Array.isArray(e)){let P;if(e.url===void 0&&(P="url")||e.onvif_username===void 0&&(P="onvif_username")||e.onvif_password===void 0&&(P="onvif_password")||e.admin_url===void 0&&(P="admin_url")||e.go2rtc_source_override===void 0&&(P="go2rtc_source_override")||e.sub_stream_url===void 0&&(P="sub_stream_url")||e.detection_url===void 0&&(P="detection_url")||e.publish_url===void 0&&(P="publish_url"))return $.errors=[{instancePath:n,schemaPath:"#/allOf/1/required",keyword:"required",params:{missingProperty:P},message:"must have required property '"+P+"'"}],!1;if(a!==!0&&(a=a||{},a.can_control_privacy=!0),e.can_control_privacy!==void 0&&e.can_control_privacy!==!0)return $.errors=[{instancePath:n+"/can_control_privacy",schemaPath:"#/allOf/1/properties/can_control_privacy/const",keyword:"const",params:{allowedValue:!0},message:"must be equal to constant"}],!1}else return $.errors=[{instancePath:n,schemaPath:"#/allOf/1/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;var y=j===r;y&&a!==!0&&(a=a||{},a.camera_uuid=!0,a.location_uuid=!0,a.name=!0,a.url=!0,a.enabled=!0,a.streaming_enabled=!0,a.playback_transport=!0,a.eptz_config=!0,a.width=!0,a.height=!0,a.fps=!0,a.codec=!0,a.priority=!0,a.record=!0,a.segment_duration=!0,a.detection_based_recording=!0,a.detection_model=!0,a.detection_threshold=!0,a.detection_interval=!0,a.pre_detection_buffer=!0,a.post_detection_buffer=!0,a.detection_object_filter=!0,a.detection_object_filter_list=!0,a.protocol=!0,a.record_audio=!0,a.audio_voice_enhancement=!0,a.isOnvif=!0,a.backchannel_enabled=!0,a.retention_days=!0,a.detection_retention_days=!0,a.max_storage_mb=!0,a.tier_critical_multiplier=!0,a.tier_important_multiplier=!0,a.tier_ephemeral_multiplier=!0,a.storage_priority=!0,a.ptz_enabled=!0,a.ptz_max_x=!0,a.ptz_max_y=!0,a.ptz_max_z=!0,a.ptz_has_home=!0,a.onvif_username=!0,a.onvif_password=!0,a.onvif_profile=!0,a.onvif_port=!0,a.record_on_schedule=!0,a.recording_schedule=!0,a.detection_record_on_schedule=!0,a.detection_recording_schedule=!0,a.tags=!0,a.admin_url=!0,a.privacy_mode=!0,a.can_control_privacy=!0,a.motion_trigger_source=!0,a.go2rtc_source_override=!0,a.sub_stream_url=!0,a.has_sub_stream=!0,a.detection_url=!0,a.publish_url=!0,a.status=!0,a.error_message=!0,a.go2rtc_hls_available=!0)}return $.errors=t,o.props=a,r===0}$.evaluated={dynamicProps:!0,dynamicItems:!1};var re=new RegExp("[?&;][^=&#]*([Pp][Aa][Ss][Ss]|[Pp][Ww][Dd]|[Tt][Oo][Kk][Ee][Nn]|[Ss][Ee][Cc][Rr][Ee][Tt]|[Aa][Pp][Ii]_?[Kk][Ee][Yy])[^=&#]*=[^&#]","u");function q(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=q.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e!="string")return q.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;let p=r,y=r;if(typeof e=="string"&&!re.test(e)){let l={};t===null?t=[l]:t.push(l),r++}var a=y===r;return a?(q.errors=[{instancePath:n,schemaPath:"#/not",keyword:"not",params:{},message:"must NOT be valid"}],!1):(r=p,t!==null&&(p?t.length=p:t=null),q.errors=t,r===0)}q.evaluated={dynamicProps:!1,dynamicItems:!1};function V(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=V.evaluated;o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0);let p=r;O(e,{instancePath:n,parentData:b,parentDataProperty:g,rootData:c,dynamicAnchors:d})||(t=t===null?O.errors:t.concat(O.errors),r=t.length);var y=p===r;if(y){let a=r;q(e,{instancePath:n,parentData:b,parentDataProperty:g,rootData:c,dynamicAnchors:d})||(t=t===null?q.errors:t.concat(q.errors),r=t.length);var y=a===r}return V.errors=t,r===0}V.evaluated={dynamicProps:!1,dynamicItems:!1};function w(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=w.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e!="string"?(w.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1):e!==""?(w.errors=[{instancePath:n,schemaPath:"#/const",keyword:"const",params:{allowedValue:""},message:"must be equal to constant"}],!1):(w.errors=t,r===0)}w.evaluated={dynamicProps:!1,dynamicItems:!1};function F(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=F.evaluated;o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0);let p=r;_(e,{instancePath:n,parentData:b,parentDataProperty:g,rootData:c,dynamicAnchors:d})||(t=t===null?_.errors:t.concat(_.errors),r=t.length);var y=p===r;if(y){let u=r,j=r,i=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let s;if(e.detection_api_url===void 0&&(s="detection_api_url")){let f={};t===null?t=[f]:t.push(f),r++}}var a=i===r;if(a)return F.errors=[{instancePath:n,schemaPath:"#/allOf/1/not",keyword:"not",params:{},message:"must NOT be valid"}],!1;if(r=j,t!==null&&(j?t.length=j:t=null),r===u)if(e&&typeof e=="object"&&!Array.isArray(e)){if(e.can_control_privacy!==void 0){let s=r;if(e.can_control_privacy!==!1)return F.errors=[{instancePath:n+"/can_control_privacy",schemaPath:"#/allOf/1/properties/can_control_privacy/const",keyword:"const",params:{allowedValue:!1},message:"must be equal to constant"}],!1;var l=s===r}else var l=!0;if(l){if(e.url!==void 0){let s=r;V(e.url,{instancePath:n+"/url",parentData:e,parentDataProperty:"url",rootData:c,dynamicAnchors:d})||(t=t===null?V.errors:t.concat(V.errors),r=t.length);var l=s===r}else var l=!0;if(l){if(e.onvif_username!==void 0){let s=r;w(e.onvif_username,{instancePath:n+"/onvif_username",parentData:e,parentDataProperty:"onvif_username",rootData:c,dynamicAnchors:d})||(t=t===null?w.errors:t.concat(w.errors),r=t.length);var l=s===r}else var l=!0;if(l){if(e.onvif_password!==void 0){let s=r;w(e.onvif_password,{instancePath:n+"/onvif_password",parentData:e,parentDataProperty:"onvif_password",rootData:c,dynamicAnchors:d})||(t=t===null?w.errors:t.concat(w.errors),r=t.length);var l=s===r}else var l=!0;if(l){if(e.admin_url!==void 0){let s=r;w(e.admin_url,{instancePath:n+"/admin_url",parentData:e,parentDataProperty:"admin_url",rootData:c,dynamicAnchors:d})||(t=t===null?w.errors:t.concat(w.errors),r=t.length);var l=s===r}else var l=!0;if(l){if(e.go2rtc_source_override!==void 0){let s=r;w(e.go2rtc_source_override,{instancePath:n+"/go2rtc_source_override",parentData:e,parentDataProperty:"go2rtc_source_override",rootData:c,dynamicAnchors:d})||(t=t===null?w.errors:t.concat(w.errors),r=t.length);var l=s===r}else var l=!0;if(l){if(e.sub_stream_url!==void 0){let s=r;w(e.sub_stream_url,{instancePath:n+"/sub_stream_url",parentData:e,parentDataProperty:"sub_stream_url",rootData:c,dynamicAnchors:d})||(t=t===null?w.errors:t.concat(w.errors),r=t.length);var l=s===r}else var l=!0;if(l){if(e.detection_url!==void 0){let s=r;w(e.detection_url,{instancePath:n+"/detection_url",parentData:e,parentDataProperty:"detection_url",rootData:c,dynamicAnchors:d})||(t=t===null?w.errors:t.concat(w.errors),r=t.length);var l=s===r}else var l=!0;if(l)if(e.publish_url!==void 0){let s=r;w(e.publish_url,{instancePath:n+"/publish_url",parentData:e,parentDataProperty:"publish_url",rootData:c,dynamicAnchors:d})||(t=t===null?w.errors:t.concat(w.errors),r=t.length);var l=s===r}else var l=!0}}}}}}}}else return F.errors=[{instancePath:n,schemaPath:"#/allOf/1/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;var y=u===r}return F.errors=t,r===0}F.evaluated={props:{can_control_privacy:!0,url:!0,onvif_username:!0,onvif_password:!0,admin_url:!0,go2rtc_source_override:!0,sub_stream_url:!0,detection_url:!0,publish_url:!0,camera_uuid:!0,location_uuid:!0,name:!0,enabled:!0,streaming_enabled:!0,playback_transport:!0,eptz_config:!0,width:!0,height:!0,fps:!0,codec:!0,priority:!0,record:!0,segment_duration:!0,detection_based_recording:!0,detection_model:!0,detection_threshold:!0,detection_interval:!0,pre_detection_buffer:!0,post_detection_buffer:!0,detection_object_filter:!0,detection_object_filter_list:!0,protocol:!0,record_audio:!0,audio_voice_enhancement:!0,isOnvif:!0,backchannel_enabled:!0,retention_days:!0,detection_retention_days:!0,max_storage_mb:!0,tier_critical_multiplier:!0,tier_important_multiplier:!0,tier_ephemeral_multiplier:!0,storage_priority:!0,ptz_enabled:!0,ptz_max_x:!0,ptz_max_y:!0,ptz_max_z:!0,ptz_has_home:!0,onvif_profile:!0,onvif_port:!0,record_on_schedule:!0,recording_schedule:!0,detection_record_on_schedule:!0,detection_recording_schedule:!0,tags:!0,privacy_mode:!0,motion_trigger_source:!0,has_sub_stream:!0,status:!0,error_message:!0,go2rtc_hls_available:!0},dynamicProps:!1,dynamicItems:!1};function Y(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=Y.evaluated;o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0);let p=r,y=!1,a=null,l=r;if(!$(e,{instancePath:n,parentData:b,parentDataProperty:g,rootData:c,dynamicAnchors:d}))t=t===null?$.errors:t.concat($.errors),r=t.length;else var u=$.evaluated.props;var i=l===r;i&&(y=!0,a=0);let j=r;F(e,{instancePath:n,parentData:b,parentDataProperty:g,rootData:c,dynamicAnchors:d})||(t=t===null?F.errors:t.concat(F.errors),r=t.length);var i=j===r;if(i&&y?(y=!1,a=[a,1]):i&&(y=!0,a=1,u!==!0&&(u=u||{},u.can_control_privacy=!0,u.url=!0,u.onvif_username=!0,u.onvif_password=!0,u.admin_url=!0,u.go2rtc_source_override=!0,u.sub_stream_url=!0,u.detection_url=!0,u.publish_url=!0,u.camera_uuid=!0,u.location_uuid=!0,u.name=!0,u.enabled=!0,u.streaming_enabled=!0,u.playback_transport=!0,u.eptz_config=!0,u.width=!0,u.height=!0,u.fps=!0,u.codec=!0,u.priority=!0,u.record=!0,u.segment_duration=!0,u.detection_based_recording=!0,u.detection_model=!0,u.detection_threshold=!0,u.detection_interval=!0,u.pre_detection_buffer=!0,u.post_detection_buffer=!0,u.detection_object_filter=!0,u.detection_object_filter_list=!0,u.protocol=!0,u.record_audio=!0,u.audio_voice_enhancement=!0,u.isOnvif=!0,u.backchannel_enabled=!0,u.retention_days=!0,u.detection_retention_days=!0,u.max_storage_mb=!0,u.tier_critical_multiplier=!0,u.tier_important_multiplier=!0,u.tier_ephemeral_multiplier=!0,u.storage_priority=!0,u.ptz_enabled=!0,u.ptz_max_x=!0,u.ptz_max_y=!0,u.ptz_max_z=!0,u.ptz_has_home=!0,u.onvif_profile=!0,u.onvif_port=!0,u.record_on_schedule=!0,u.recording_schedule=!0,u.detection_record_on_schedule=!0,u.detection_recording_schedule=!0,u.tags=!0,u.privacy_mode=!0,u.motion_trigger_source=!0,u.has_sub_stream=!0,u.status=!0,u.error_message=!0,u.go2rtc_hls_available=!0)),y)r=p,t!==null&&(p?t.length=p:t=null);else{let m={instancePath:n,schemaPath:"#/oneOf",keyword:"oneOf",params:{passingSchemas:a},message:"must match exactly one schema in oneOf"};return t===null?t=[m]:t.push(m),r++,Y.errors=t,!1}return Y.errors=t,o.props=u,r===0}Y.evaluated={dynamicProps:!0,dynamicItems:!1};function C(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=C.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(Array.isArray(e)){var p=!0;let y=e.length;for(let a=0;a()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(a){throw t=0,a}};var u=o(i=>{"use strict";Object.defineProperty(i,"__esModule",{value:!0});function f(e){let t=e.length,a=0,s=0,n;for(;s=55296&&n<=56319&&s511)return r.errors=[{instancePath:t,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1;if(h.test(e)){if(new TextEncoder().encode(e).byteLength>511)return r.errors=[{instancePath:t,schemaPath:"#/x-lightnvr-max-bytes",keyword:"x-lightnvr-max-bytes",params:{},message:"must fit the UTF-8 byte limit"}],!1}else return r.errors=[{instancePath:t,schemaPath:"#/pattern",keyword:"pattern",params:{pattern:"^[\\t\\n\\v\\f\\r ,]*(([Rr][Tt][Mm][Pp][Ss]?://[!#-&(-+\\x2D-\\x5B\\x5D-~]+)([\\t\\n\\v\\f\\r ,]+[Rr][Tt][Mm][Pp][Ss]?://[!#-&(-+\\x2D-\\x5B\\x5D-~]+)*)?[\\t\\n\\v\\f\\r ,]*$"},message:'must match pattern "^[\\t\\n\\v\\f\\r ,]*(([Rr][Tt][Mm][Pp][Ss]?://[!#-&(-+\\x2D-\\x5B\\x5D-~]+)([\\t\\n\\v\\f\\r ,]+[Rr][Tt][Mm][Pp][Ss]?://[!#-&(-+\\x2D-\\x5B\\x5D-~]+)*)?[\\t\\n\\v\\f\\r ,]*$"'}],!1}return r.errors=x,m===0}r.evaluated={dynamicProps:!1,dynamicItems:!1};export{g as validatePublishUrlList}; diff --git a/web/js/api/generated/validators/RetentionDays.d.mts b/web/js/api/generated/validators/RetentionDays.d.mts new file mode 100644 index 000000000..1a424d1fc --- /dev/null +++ b/web/js/api/generated/validators/RetentionDays.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateRetentionDays } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/RetentionDays.mjs b/web/js/api/generated/validators/RetentionDays.mjs new file mode 100644 index 000000000..021643fe4 --- /dev/null +++ b/web/js/api/generated/validators/RetentionDays.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var p=r;function r(e,{instancePath:s="",parentData:n,parentDataProperty:a,rootData:o=e,dynamicAnchors:u={}}={}){let t=null,m=0,i=r.evaluated;if(i.dynamicProps&&(i.props=void 0),i.dynamicItems&&(i.items=void 0),!(typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)))return r.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(m===0&&typeof e=="number"&&isFinite(e)){if(e>365||isNaN(e))return r.errors=[{instancePath:s,schemaPath:"#/maximum",keyword:"maximum",params:{comparison:"<=",limit:365},message:"must be <= 365"}],!1;if(e<-1||isNaN(e))return r.errors=[{instancePath:s,schemaPath:"#/minimum",keyword:"minimum",params:{comparison:">=",limit:-1},message:"must be >= -1"}],!1}return r.errors=t,m===0}r.evaluated={dynamicProps:!1,dynamicItems:!1};export{p as validateRetentionDays}; diff --git a/web/js/api/generated/validators/StreamDetail.d.mts b/web/js/api/generated/validators/StreamDetail.d.mts new file mode 100644 index 000000000..576215867 --- /dev/null +++ b/web/js/api/generated/validators/StreamDetail.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateStreamDetail } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/StreamDetail.mjs b/web/js/api/generated/validators/StreamDetail.mjs new file mode 100644 index 000000000..05913e8bd --- /dev/null +++ b/web/js/api/generated/validators/StreamDetail.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var B=(e,n)=>()=>{try{return n||e((n={exports:{}}).exports,n),n.exports}catch(b){throw n=0,b}};var Z=B(R=>{"use strict";Object.defineProperty(R,"__esModule",{value:!0});function W(e){let n=e.length,b=0,g=0,_;for(;g=55296&&_<=56319&&g36)return N.errors=[{instancePath:n,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:36},message:"must NOT have more than 36 characters"}],!1;if(!H.test(e))return N.errors=[{instancePath:n,schemaPath:"#/pattern",keyword:"pattern",params:{pattern:"^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$"},message:'must match pattern "^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$"'}],!1}else return N.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return N.errors=t,r===0}N.evaluated={dynamicProps:!1,dynamicItems:!1};function I(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:_=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=I.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(typeof e=="string"){if(x(e)>255)return I.errors=[{instancePath:n,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1;if(x(e)<1)return I.errors=[{instancePath:n,schemaPath:"#/minLength",keyword:"minLength",params:{limit:1},message:"must NOT have fewer than 1 characters"}],!1;if(new TextEncoder().encode(e).byteLength>255)return I.errors=[{instancePath:n,schemaPath:"#/x-lightnvr-max-bytes",keyword:"x-lightnvr-max-bytes",params:{},message:"must fit the UTF-8 byte limit"}],!1}else return I.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return I.errors=t,r===0}I.evaluated={dynamicProps:!1,dynamicItems:!1};var J={type:"string",enum:["auto","webrtc_only","mse_only","hls_only","webrtc_then_mse","mse_then_hls"],$id:"urn:lightnvr:contract:PlaybackTransport"};function T(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:_=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=T.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e!="string"?(T.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1):e==="auto"||e==="webrtc_only"||e==="mse_only"||e==="hls_only"||e==="webrtc_then_mse"||e==="mse_then_hls"?(T.errors=t,r===0):(T.errors=[{instancePath:n,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:J.enum},message:"must be equal to one of the allowed values"}],!1)}T.evaluated={dynamicProps:!1,dynamicItems:!1};function v(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:_=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=v.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let y;if(e.version===void 0&&(y="version")||e.projection===void 0&&(y="projection")||e.mount===void 0&&(y="mount")||e.centerX===void 0&&(y="centerX")||e.centerY===void 0&&(y="centerY")||e.radius===void 0&&(y="radius")||e.fov===void 0&&(y="fov")||e.rotation===void 0&&(y="rotation")||e.defaultYaw===void 0&&(y="defaultYaw")||e.defaultTilt===void 0&&(y="defaultTilt")||e.defaultViewFov===void 0&&(y="defaultViewFov"))return v.errors=[{instancePath:n,schemaPath:"#/required",keyword:"required",params:{missingProperty:y},message:"must have required property '"+y+"'"}],!1;if(e.version!==void 0){let a=r;if(e.version!==1)return v.errors=[{instancePath:n+"/version",schemaPath:"#/properties/version/const",keyword:"const",params:{allowedValue:1},message:"must be equal to constant"}],!1;var p=a===r}else var p=!0;if(p){if(e.projection!==void 0){let a=r;if(e.projection!=="equidistant")return v.errors=[{instancePath:n+"/projection",schemaPath:"#/properties/projection/const",keyword:"const",params:{allowedValue:"equidistant"},message:"must be equal to constant"}],!1;var p=a===r}else var p=!0;if(p){if(e.mount!==void 0){let a=r;if(e.mount!=="ceiling")return v.errors=[{instancePath:n+"/mount",schemaPath:"#/properties/mount/const",keyword:"const",params:{allowedValue:"ceiling"},message:"must be equal to constant"}],!1;var p=a===r}else var p=!0;if(p){if(e.centerX!==void 0){let a=e.centerX,l=r;if(r===l)if(typeof a=="number"&&isFinite(a)){if(a>1||isNaN(a))return v.errors=[{instancePath:n+"/centerX",schemaPath:"#/properties/centerX/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(a<0||isNaN(a))return v.errors=[{instancePath:n+"/centerX",schemaPath:"#/properties/centerX/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1}else return v.errors=[{instancePath:n+"/centerX",schemaPath:"#/properties/centerX/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=l===r}else var p=!0;if(p){if(e.centerY!==void 0){let a=e.centerY,l=r;if(r===l)if(typeof a=="number"&&isFinite(a)){if(a>1||isNaN(a))return v.errors=[{instancePath:n+"/centerY",schemaPath:"#/properties/centerY/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(a<0||isNaN(a))return v.errors=[{instancePath:n+"/centerY",schemaPath:"#/properties/centerY/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1}else return v.errors=[{instancePath:n+"/centerY",schemaPath:"#/properties/centerY/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=l===r}else var p=!0;if(p){if(e.radius!==void 0){let a=e.radius,l=r;if(r===l)if(typeof a=="number"&&isFinite(a)){if(a>1||isNaN(a))return v.errors=[{instancePath:n+"/radius",schemaPath:"#/properties/radius/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(a<.05||isNaN(a))return v.errors=[{instancePath:n+"/radius",schemaPath:"#/properties/radius/minimum",keyword:"minimum",params:{comparison:">=",limit:.05},message:"must be >= 0.05"}],!1}else return v.errors=[{instancePath:n+"/radius",schemaPath:"#/properties/radius/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=l===r}else var p=!0;if(p){if(e.fov!==void 0){let a=e.fov,l=r;if(r===l)if(typeof a=="number"&&isFinite(a)){if(a>360||isNaN(a))return v.errors=[{instancePath:n+"/fov",schemaPath:"#/properties/fov/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(a<160||isNaN(a))return v.errors=[{instancePath:n+"/fov",schemaPath:"#/properties/fov/minimum",keyword:"minimum",params:{comparison:">=",limit:160},message:"must be >= 160"}],!1}else return v.errors=[{instancePath:n+"/fov",schemaPath:"#/properties/fov/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=l===r}else var p=!0;if(p){if(e.rotation!==void 0){let a=e.rotation,l=r;if(r===l)if(typeof a=="number"&&isFinite(a)){if(a>360||isNaN(a))return v.errors=[{instancePath:n+"/rotation",schemaPath:"#/properties/rotation/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(a<-360||isNaN(a))return v.errors=[{instancePath:n+"/rotation",schemaPath:"#/properties/rotation/minimum",keyword:"minimum",params:{comparison:">=",limit:-360},message:"must be >= -360"}],!1}else return v.errors=[{instancePath:n+"/rotation",schemaPath:"#/properties/rotation/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=l===r}else var p=!0;if(p){if(e.defaultYaw!==void 0){let a=e.defaultYaw,l=r;if(r===l)if(typeof a=="number"&&isFinite(a)){if(a>360||isNaN(a))return v.errors=[{instancePath:n+"/defaultYaw",schemaPath:"#/properties/defaultYaw/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(a<-360||isNaN(a))return v.errors=[{instancePath:n+"/defaultYaw",schemaPath:"#/properties/defaultYaw/minimum",keyword:"minimum",params:{comparison:">=",limit:-360},message:"must be >= -360"}],!1}else return v.errors=[{instancePath:n+"/defaultYaw",schemaPath:"#/properties/defaultYaw/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=l===r}else var p=!0;if(p){if(e.defaultTilt!==void 0){let a=e.defaultTilt,l=r;if(r===l)if(typeof a=="number"&&isFinite(a)){if(a>30||isNaN(a))return v.errors=[{instancePath:n+"/defaultTilt",schemaPath:"#/properties/defaultTilt/maximum",keyword:"maximum",params:{comparison:"<=",limit:30},message:"must be <= 30"}],!1;if(a<-90||isNaN(a))return v.errors=[{instancePath:n+"/defaultTilt",schemaPath:"#/properties/defaultTilt/minimum",keyword:"minimum",params:{comparison:">=",limit:-90},message:"must be >= -90"}],!1}else return v.errors=[{instancePath:n+"/defaultTilt",schemaPath:"#/properties/defaultTilt/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=l===r}else var p=!0;if(p)if(e.defaultViewFov!==void 0){let a=e.defaultViewFov,l=r;if(r===l)if(typeof a=="number"&&isFinite(a)){if(a>120||isNaN(a))return v.errors=[{instancePath:n+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/maximum",keyword:"maximum",params:{comparison:"<=",limit:120},message:"must be <= 120"}],!1;if(a<20||isNaN(a))return v.errors=[{instancePath:n+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/minimum",keyword:"minimum",params:{comparison:">=",limit:20},message:"must be >= 20"}],!1}else return v.errors=[{instancePath:n+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=l===r}else var p=!0}}}}}}}}}}else return v.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return v.errors=t,r===0}v.evaluated={props:{version:!0,projection:!0,mount:!0,centerX:!0,centerY:!0,radius:!0,fov:!0,rotation:!0,defaultYaw:!0,defaultTilt:!0,defaultViewFov:!0},dynamicProps:!1,dynamicItems:!1};function F(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:_=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=F.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(typeof e=="string"){if(x(e)>1023)return F.errors=[{instancePath:n,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:1023},message:"must NOT have more than 1023 characters"}],!1;if(new TextEncoder().encode(e).byteLength>1023)return F.errors=[{instancePath:n,schemaPath:"#/x-lightnvr-max-bytes",keyword:"x-lightnvr-max-bytes",params:{},message:"must fit the UTF-8 byte limit"}],!1;if(e!==""){let y,a=!0;try{y=JSON.parse(e)}catch{a=!1}if(a){let l=r;v(y,{instancePath:n,parentData:e,parentDataProperty:g,rootData:_,dynamicAnchors:d})||(t=t===null?v.errors:t.concat(v.errors),r=t.length);var p=l===r;a=p}if(!a)return F.errors=[{instancePath:n,schemaPath:"#/contentSchema",keyword:"contentSchema",params:{},message:"must contain valid JSON matching contentSchema (or be empty)"}],!1}}else return F.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return F.errors=t,r===0}F.evaluated={dynamicProps:!1,dynamicItems:!1};function h(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:_=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=h.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),!(typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)))return h.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(r===0&&typeof e=="number"&&isFinite(e)){if(e>2147483647||isNaN(e))return h.errors=[{instancePath:n,schemaPath:"#/maximum",keyword:"maximum",params:{comparison:"<=",limit:2147483647},message:"must be <= 2147483647"}],!1;if(e<-2147483648||isNaN(e))return h.errors=[{instancePath:n,schemaPath:"#/minimum",keyword:"minimum",params:{comparison:">=",limit:-2147483648},message:"must be >= -2147483648"}],!1}return h.errors=t,r===0}h.evaluated={dynamicProps:!1,dynamicItems:!1};var M={type:"integer",enum:[0,1],$id:"urn:lightnvr:contract:StreamProtocol"};function E(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:_=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=E.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)?e===0||e===1?(E.errors=t,r===0):(E.errors=[{instancePath:n,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:M.enum},message:"must be equal to one of the allowed values"}],!1):(E.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1)}E.evaluated={dynamicProps:!1,dynamicItems:!1};function O(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:_=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=O.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),!(typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)))return O.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(r===0&&typeof e=="number"&&isFinite(e)){if(e>365||isNaN(e))return O.errors=[{instancePath:n,schemaPath:"#/maximum",keyword:"maximum",params:{comparison:"<=",limit:365},message:"must be <= 365"}],!1;if(e<-1||isNaN(e))return O.errors=[{instancePath:n,schemaPath:"#/minimum",keyword:"minimum",params:{comparison:">=",limit:-1},message:"must be >= -1"}],!1}return O.errors=t,r===0}O.evaluated={dynamicProps:!1,dynamicItems:!1};function D(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:_=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=D.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(Array.isArray(e)){if(e.length>168)return D.errors=[{instancePath:n,schemaPath:"#/maxItems",keyword:"maxItems",params:{limit:168},message:"must NOT have more than 168 items"}],!1;if(e.length<168)return D.errors=[{instancePath:n,schemaPath:"#/minItems",keyword:"minItems",params:{limit:168},message:"must NOT have fewer than 168 items"}],!1;{var p=!0;let y=e.length;for(let a=0;a511)return f.errors=[{instancePath:n+"/url",schemaPath:"#/properties/url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return f.errors=[{instancePath:n+"/url",schemaPath:"#/properties/url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=c===r}else var i=!0;if(i){if(e.enabled!==void 0){let s=r;if(typeof e.enabled!="boolean")return f.errors=[{instancePath:n+"/enabled",schemaPath:"#/properties/enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.streaming_enabled!==void 0){let s=r;if(typeof e.streaming_enabled!="boolean")return f.errors=[{instancePath:n+"/streaming_enabled",schemaPath:"#/properties/streaming_enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.playback_transport!==void 0){let s=r;T(e.playback_transport,{instancePath:n+"/playback_transport",parentData:e,parentDataProperty:"playback_transport",rootData:_,dynamicAnchors:d})||(t=t===null?T.errors:t.concat(T.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.eptz_config!==void 0){let s=r;F(e.eptz_config,{instancePath:n+"/eptz_config",parentData:e,parentDataProperty:"eptz_config",rootData:_,dynamicAnchors:d})||(t=t===null?F.errors:t.concat(F.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.width!==void 0){let s=r;h(e.width,{instancePath:n+"/width",parentData:e,parentDataProperty:"width",rootData:_,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.height!==void 0){let s=r;h(e.height,{instancePath:n+"/height",parentData:e,parentDataProperty:"height",rootData:_,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.fps!==void 0){let s=r;h(e.fps,{instancePath:n+"/fps",parentData:e,parentDataProperty:"fps",rootData:_,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.codec!==void 0){let s=e.codec,c=r;if(r===c)if(typeof s=="string"){if(x(s)>15)return f.errors=[{instancePath:n+"/codec",schemaPath:"#/properties/codec/maxLength",keyword:"maxLength",params:{limit:15},message:"must NOT have more than 15 characters"}],!1}else return f.errors=[{instancePath:n+"/codec",schemaPath:"#/properties/codec/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=c===r}else var i=!0;if(i){if(e.priority!==void 0){let s=r;h(e.priority,{instancePath:n+"/priority",parentData:e,parentDataProperty:"priority",rootData:_,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.record!==void 0){let s=r;if(typeof e.record!="boolean")return f.errors=[{instancePath:n+"/record",schemaPath:"#/properties/record/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.segment_duration!==void 0){let s=r;h(e.segment_duration,{instancePath:n+"/segment_duration",parentData:e,parentDataProperty:"segment_duration",rootData:_,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.detection_based_recording!==void 0){let s=r;if(typeof e.detection_based_recording!="boolean")return f.errors=[{instancePath:n+"/detection_based_recording",schemaPath:"#/properties/detection_based_recording/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.detection_model!==void 0){let s=e.detection_model,c=r;if(r===c)if(typeof s=="string"){if(x(s)>511)return f.errors=[{instancePath:n+"/detection_model",schemaPath:"#/properties/detection_model/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return f.errors=[{instancePath:n+"/detection_model",schemaPath:"#/properties/detection_model/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=c===r}else var i=!0;if(i){if(e.detection_threshold!==void 0){let s=e.detection_threshold,c=r;if(!(typeof s=="number"&&!(s%1)&&!isNaN(s)&&isFinite(s)))return f.errors=[{instancePath:n+"/detection_threshold",schemaPath:"#/properties/detection_threshold/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;var i=c===r}else var i=!0;if(i){if(e.detection_interval!==void 0){let s=r;h(e.detection_interval,{instancePath:n+"/detection_interval",parentData:e,parentDataProperty:"detection_interval",rootData:_,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.pre_detection_buffer!==void 0){let s=r;h(e.pre_detection_buffer,{instancePath:n+"/pre_detection_buffer",parentData:e,parentDataProperty:"pre_detection_buffer",rootData:_,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.post_detection_buffer!==void 0){let s=r;h(e.post_detection_buffer,{instancePath:n+"/post_detection_buffer",parentData:e,parentDataProperty:"post_detection_buffer",rootData:_,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.detection_object_filter!==void 0){let s=e.detection_object_filter,c=r;if(r===c)if(typeof s=="string"){if(x(s)>15)return f.errors=[{instancePath:n+"/detection_object_filter",schemaPath:"#/properties/detection_object_filter/maxLength",keyword:"maxLength",params:{limit:15},message:"must NOT have more than 15 characters"}],!1}else return f.errors=[{instancePath:n+"/detection_object_filter",schemaPath:"#/properties/detection_object_filter/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=c===r}else var i=!0;if(i){if(e.detection_object_filter_list!==void 0){let s=e.detection_object_filter_list,c=r;if(r===c)if(typeof s=="string"){if(x(s)>255)return f.errors=[{instancePath:n+"/detection_object_filter_list",schemaPath:"#/properties/detection_object_filter_list/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1}else return f.errors=[{instancePath:n+"/detection_object_filter_list",schemaPath:"#/properties/detection_object_filter_list/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=c===r}else var i=!0;if(i){if(e.protocol!==void 0){let s=r;E(e.protocol,{instancePath:n+"/protocol",parentData:e,parentDataProperty:"protocol",rootData:_,dynamicAnchors:d})||(t=t===null?E.errors:t.concat(E.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.record_audio!==void 0){let s=r;if(typeof e.record_audio!="boolean")return f.errors=[{instancePath:n+"/record_audio",schemaPath:"#/properties/record_audio/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.audio_voice_enhancement!==void 0){let s=r;if(typeof e.audio_voice_enhancement!="boolean")return f.errors=[{instancePath:n+"/audio_voice_enhancement",schemaPath:"#/properties/audio_voice_enhancement/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.isOnvif!==void 0){let s=r;if(typeof e.isOnvif!="boolean")return f.errors=[{instancePath:n+"/isOnvif",schemaPath:"#/properties/isOnvif/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.backchannel_enabled!==void 0){let s=r;if(typeof e.backchannel_enabled!="boolean")return f.errors=[{instancePath:n+"/backchannel_enabled",schemaPath:"#/properties/backchannel_enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.retention_days!==void 0){let s=r;O(e.retention_days,{instancePath:n+"/retention_days",parentData:e,parentDataProperty:"retention_days",rootData:_,dynamicAnchors:d})||(t=t===null?O.errors:t.concat(O.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.detection_retention_days!==void 0){let s=r;O(e.detection_retention_days,{instancePath:n+"/detection_retention_days",parentData:e,parentDataProperty:"detection_retention_days",rootData:_,dynamicAnchors:d})||(t=t===null?O.errors:t.concat(O.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.max_storage_mb!==void 0){let s=r;h(e.max_storage_mb,{instancePath:n+"/max_storage_mb",parentData:e,parentDataProperty:"max_storage_mb",rootData:_,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.tier_critical_multiplier!==void 0){let s=e.tier_critical_multiplier,c=r;if(!(typeof s=="number"&&isFinite(s)))return f.errors=[{instancePath:n+"/tier_critical_multiplier",schemaPath:"#/properties/tier_critical_multiplier/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var i=c===r}else var i=!0;if(i){if(e.tier_important_multiplier!==void 0){let s=e.tier_important_multiplier,c=r;if(!(typeof s=="number"&&isFinite(s)))return f.errors=[{instancePath:n+"/tier_important_multiplier",schemaPath:"#/properties/tier_important_multiplier/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var i=c===r}else var i=!0;if(i){if(e.tier_ephemeral_multiplier!==void 0){let s=e.tier_ephemeral_multiplier,c=r;if(!(typeof s=="number"&&isFinite(s)))return f.errors=[{instancePath:n+"/tier_ephemeral_multiplier",schemaPath:"#/properties/tier_ephemeral_multiplier/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var i=c===r}else var i=!0;if(i){if(e.storage_priority!==void 0){let s=r;h(e.storage_priority,{instancePath:n+"/storage_priority",parentData:e,parentDataProperty:"storage_priority",rootData:_,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.ptz_enabled!==void 0){let s=r;if(typeof e.ptz_enabled!="boolean")return f.errors=[{instancePath:n+"/ptz_enabled",schemaPath:"#/properties/ptz_enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.ptz_max_x!==void 0){let s=r;h(e.ptz_max_x,{instancePath:n+"/ptz_max_x",parentData:e,parentDataProperty:"ptz_max_x",rootData:_,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.ptz_max_y!==void 0){let s=r;h(e.ptz_max_y,{instancePath:n+"/ptz_max_y",parentData:e,parentDataProperty:"ptz_max_y",rootData:_,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.ptz_max_z!==void 0){let s=r;h(e.ptz_max_z,{instancePath:n+"/ptz_max_z",parentData:e,parentDataProperty:"ptz_max_z",rootData:_,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.ptz_has_home!==void 0){let s=r;if(typeof e.ptz_has_home!="boolean")return f.errors=[{instancePath:n+"/ptz_has_home",schemaPath:"#/properties/ptz_has_home/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.onvif_username!==void 0){let s=e.onvif_username,c=r;if(r===c)if(typeof s=="string"){if(x(s)>63)return f.errors=[{instancePath:n+"/onvif_username",schemaPath:"#/properties/onvif_username/maxLength",keyword:"maxLength",params:{limit:63},message:"must NOT have more than 63 characters"}],!1}else return f.errors=[{instancePath:n+"/onvif_username",schemaPath:"#/properties/onvif_username/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=c===r}else var i=!0;if(i){if(e.onvif_password!==void 0){let s=e.onvif_password,c=r;if(r===c)if(typeof s=="string"){if(x(s)>63)return f.errors=[{instancePath:n+"/onvif_password",schemaPath:"#/properties/onvif_password/maxLength",keyword:"maxLength",params:{limit:63},message:"must NOT have more than 63 characters"}],!1}else return f.errors=[{instancePath:n+"/onvif_password",schemaPath:"#/properties/onvif_password/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=c===r}else var i=!0;if(i){if(e.onvif_profile!==void 0){let s=e.onvif_profile,c=r;if(r===c)if(typeof s=="string"){if(x(s)>63)return f.errors=[{instancePath:n+"/onvif_profile",schemaPath:"#/properties/onvif_profile/maxLength",keyword:"maxLength",params:{limit:63},message:"must NOT have more than 63 characters"}],!1}else return f.errors=[{instancePath:n+"/onvif_profile",schemaPath:"#/properties/onvif_profile/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=c===r}else var i=!0;if(i){if(e.onvif_port!==void 0){let s=r;h(e.onvif_port,{instancePath:n+"/onvif_port",parentData:e,parentDataProperty:"onvif_port",rootData:_,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.record_on_schedule!==void 0){let s=r;if(typeof e.record_on_schedule!="boolean")return f.errors=[{instancePath:n+"/record_on_schedule",schemaPath:"#/properties/record_on_schedule/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.recording_schedule!==void 0){let s=r;D(e.recording_schedule,{instancePath:n+"/recording_schedule",parentData:e,parentDataProperty:"recording_schedule",rootData:_,dynamicAnchors:d})||(t=t===null?D.errors:t.concat(D.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.detection_record_on_schedule!==void 0){let s=r;if(typeof e.detection_record_on_schedule!="boolean")return f.errors=[{instancePath:n+"/detection_record_on_schedule",schemaPath:"#/properties/detection_record_on_schedule/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.detection_recording_schedule!==void 0){let s=r;D(e.detection_recording_schedule,{instancePath:n+"/detection_recording_schedule",parentData:e,parentDataProperty:"detection_recording_schedule",rootData:_,dynamicAnchors:d})||(t=t===null?D.errors:t.concat(D.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.tags!==void 0){let s=e.tags,c=r;if(r===c)if(typeof s=="string"){if(x(s)>255)return f.errors=[{instancePath:n+"/tags",schemaPath:"#/properties/tags/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1}else return f.errors=[{instancePath:n+"/tags",schemaPath:"#/properties/tags/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=c===r}else var i=!0;if(i){if(e.admin_url!==void 0){let s=e.admin_url,c=r;if(r===c)if(typeof s=="string"){if(x(s)>511)return f.errors=[{instancePath:n+"/admin_url",schemaPath:"#/properties/admin_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return f.errors=[{instancePath:n+"/admin_url",schemaPath:"#/properties/admin_url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=c===r}else var i=!0;if(i){if(e.privacy_mode!==void 0){let s=r;if(typeof e.privacy_mode!="boolean")return f.errors=[{instancePath:n+"/privacy_mode",schemaPath:"#/properties/privacy_mode/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.can_control_privacy!==void 0){let s=r;if(typeof e.can_control_privacy!="boolean")return f.errors=[{instancePath:n+"/can_control_privacy",schemaPath:"#/properties/can_control_privacy/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.motion_trigger_source!==void 0){let s=e.motion_trigger_source,c=r;if(r===c)if(typeof s=="string"){if(x(s)>255)return f.errors=[{instancePath:n+"/motion_trigger_source",schemaPath:"#/properties/motion_trigger_source/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1}else return f.errors=[{instancePath:n+"/motion_trigger_source",schemaPath:"#/properties/motion_trigger_source/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=c===r}else var i=!0;if(i){if(e.go2rtc_source_override!==void 0){let s=e.go2rtc_source_override,c=r;if(r===c)if(typeof s=="string"){if(x(s)>8191)return f.errors=[{instancePath:n+"/go2rtc_source_override",schemaPath:"#/properties/go2rtc_source_override/maxLength",keyword:"maxLength",params:{limit:8191},message:"must NOT have more than 8191 characters"}],!1}else return f.errors=[{instancePath:n+"/go2rtc_source_override",schemaPath:"#/properties/go2rtc_source_override/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=c===r}else var i=!0;if(i){if(e.sub_stream_url!==void 0){let s=e.sub_stream_url,c=r;if(r===c)if(typeof s=="string"){if(x(s)>511)return f.errors=[{instancePath:n+"/sub_stream_url",schemaPath:"#/properties/sub_stream_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return f.errors=[{instancePath:n+"/sub_stream_url",schemaPath:"#/properties/sub_stream_url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=c===r}else var i=!0;if(i){if(e.has_sub_stream!==void 0){let s=r;if(typeof e.has_sub_stream!="boolean")return f.errors=[{instancePath:n+"/has_sub_stream",schemaPath:"#/properties/has_sub_stream/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.detection_url!==void 0){let s=e.detection_url,c=r;if(r===c)if(typeof s=="string"){if(x(s)>511)return f.errors=[{instancePath:n+"/detection_url",schemaPath:"#/properties/detection_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return f.errors=[{instancePath:n+"/detection_url",schemaPath:"#/properties/detection_url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=c===r}else var i=!0;if(i){if(e.publish_url!==void 0){let s=e.publish_url,c=r;if(r===c)if(typeof s=="string"){if(x(s)>511)return f.errors=[{instancePath:n+"/publish_url",schemaPath:"#/properties/publish_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return f.errors=[{instancePath:n+"/publish_url",schemaPath:"#/properties/publish_url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=c===r}else var i=!0;if(i){if(e.status!==void 0){let s=r;A(e.status,{instancePath:n+"/status",parentData:e,parentDataProperty:"status",rootData:_,dynamicAnchors:d})||(t=t===null?A.errors:t.concat(A.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.error_message!==void 0){let s=e.error_message,c=r;if(r===c)if(typeof s=="string"){if(x(s)>255)return f.errors=[{instancePath:n+"/error_message",schemaPath:"#/properties/error_message/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1;if(x(s)<1)return f.errors=[{instancePath:n+"/error_message",schemaPath:"#/properties/error_message/minLength",keyword:"minLength",params:{limit:1},message:"must NOT have fewer than 1 characters"}],!1}else return f.errors=[{instancePath:n+"/error_message",schemaPath:"#/properties/error_message/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=c===r}else var i=!0;if(i)if(e.go2rtc_hls_available!==void 0){let s=r;if(typeof e.go2rtc_hls_available!="boolean")return f.errors=[{instancePath:n+"/go2rtc_hls_available",schemaPath:"#/properties/go2rtc_hls_available/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}else return f.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return f.errors=t,r===0}f.evaluated={props:{camera_uuid:!0,location_uuid:!0,name:!0,url:!0,enabled:!0,streaming_enabled:!0,playback_transport:!0,eptz_config:!0,width:!0,height:!0,fps:!0,codec:!0,priority:!0,record:!0,segment_duration:!0,detection_based_recording:!0,detection_model:!0,detection_threshold:!0,detection_interval:!0,pre_detection_buffer:!0,post_detection_buffer:!0,detection_object_filter:!0,detection_object_filter_list:!0,protocol:!0,record_audio:!0,audio_voice_enhancement:!0,isOnvif:!0,backchannel_enabled:!0,retention_days:!0,detection_retention_days:!0,max_storage_mb:!0,tier_critical_multiplier:!0,tier_important_multiplier:!0,tier_ephemeral_multiplier:!0,storage_priority:!0,ptz_enabled:!0,ptz_max_x:!0,ptz_max_y:!0,ptz_max_z:!0,ptz_has_home:!0,onvif_username:!0,onvif_password:!0,onvif_profile:!0,onvif_port:!0,record_on_schedule:!0,recording_schedule:!0,detection_record_on_schedule:!0,detection_recording_schedule:!0,tags:!0,admin_url:!0,privacy_mode:!0,can_control_privacy:!0,motion_trigger_source:!0,go2rtc_source_override:!0,sub_stream_url:!0,has_sub_stream:!0,detection_url:!0,publish_url:!0,status:!0,error_message:!0,go2rtc_hls_available:!0},dynamicProps:!1,dynamicItems:!1};var G=new RegExp("^(?![A-Za-z][A-Za-z0-9+.-]*://[^/?#]*@)","u");function L(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:_=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=L.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(typeof e=="string"){if(x(e)>511)return L.errors=[{instancePath:n,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1;if(!G.test(e))return L.errors=[{instancePath:n,schemaPath:"#/pattern",keyword:"pattern",params:{pattern:"^(?![A-Za-z][A-Za-z0-9+.-]*://[^/?#]*@)"},message:'must match pattern "^(?![A-Za-z][A-Za-z0-9+.-]*://[^/?#]*@)"'}],!1}else return L.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return L.errors=t,r===0}L.evaluated={dynamicProps:!1,dynamicItems:!1};function j(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:_=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=j.evaluated;o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0);let p=r;f(e,{instancePath:n,parentData:b,parentDataProperty:g,rootData:_,dynamicAnchors:d})||(t=t===null?f.errors:t.concat(f.errors),r=t.length);var y=p===r;if(y){let $=r,i=r,m=!0,s=r,c=r,z=!1,X=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let P;if(e.isOnvif===void 0&&(P="isOnvif")){let k={};t===null?t=[k]:t.push(k),r++}else if(e.isOnvif!==void 0&&e.isOnvif!==!0){let k={};t===null?t=[k]:t.push(k),r++}}var l=X===r;if(z=z||l,l){var a={};a.isOnvif=!0}let C=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let P;if(e.onvif_username===void 0&&(P="onvif_username")){let k={};t===null?t=[k]:t.push(k),r++}else if(e.onvif_username!==void 0){let k=e.onvif_username;if(typeof k=="string"&&x(k)<1){let V={};t===null?t=[V]:t.push(V),r++}}}var l=C===r;z=z||l,l&&a!==!0&&(a=a||{},a.onvif_username=!0);let K=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let P;if(e.onvif_password===void 0&&(P="onvif_password")){let k={};t===null?t=[k]:t.push(k),r++}else if(e.onvif_password!==void 0){let k=e.onvif_password;if(typeof k=="string"&&x(k)<1){let V={};t===null?t=[V]:t.push(V),r++}}}var l=K===r;if(z=z||l,l&&a!==!0&&(a=a||{},a.onvif_password=!0),z)r=c,t!==null&&(c?t.length=c:t=null);else{let P={};t===null?t=[P]:t.push(P),r++}var u=s===r;if(r=i,t!==null&&(i?t.length=i:t=null),u){let P=r;e&&typeof e=="object"&&!Array.isArray(e)&&e.url!==void 0&&(L(e.url,{instancePath:n+"/url",parentData:e,parentDataProperty:"url",rootData:_,dynamicAnchors:d})||(t=t===null?L.errors:t.concat(L.errors),r=t.length));var u=P===r;m=u,m&&a!==!0&&(a=a||{},a.url=!0)}if(!m){let P={instancePath:n,schemaPath:"#/allOf/1/if",keyword:"if",params:{failingKeyword:"then"},message:'must match "then" schema'};return t===null?t=[P]:t.push(P),r++,j.errors=t,!1}if(r===$)if(e&&typeof e=="object"&&!Array.isArray(e)){let P;if(e.url===void 0&&(P="url")||e.onvif_username===void 0&&(P="onvif_username")||e.onvif_password===void 0&&(P="onvif_password")||e.admin_url===void 0&&(P="admin_url")||e.go2rtc_source_override===void 0&&(P="go2rtc_source_override")||e.sub_stream_url===void 0&&(P="sub_stream_url")||e.detection_url===void 0&&(P="detection_url")||e.publish_url===void 0&&(P="publish_url"))return j.errors=[{instancePath:n,schemaPath:"#/allOf/1/required",keyword:"required",params:{missingProperty:P},message:"must have required property '"+P+"'"}],!1;if(a!==!0&&(a=a||{},a.can_control_privacy=!0),e.can_control_privacy!==void 0&&e.can_control_privacy!==!0)return j.errors=[{instancePath:n+"/can_control_privacy",schemaPath:"#/allOf/1/properties/can_control_privacy/const",keyword:"const",params:{allowedValue:!0},message:"must be equal to constant"}],!1}else return j.errors=[{instancePath:n,schemaPath:"#/allOf/1/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;var y=$===r;y&&a!==!0&&(a=a||{},a.camera_uuid=!0,a.location_uuid=!0,a.name=!0,a.url=!0,a.enabled=!0,a.streaming_enabled=!0,a.playback_transport=!0,a.eptz_config=!0,a.width=!0,a.height=!0,a.fps=!0,a.codec=!0,a.priority=!0,a.record=!0,a.segment_duration=!0,a.detection_based_recording=!0,a.detection_model=!0,a.detection_threshold=!0,a.detection_interval=!0,a.pre_detection_buffer=!0,a.post_detection_buffer=!0,a.detection_object_filter=!0,a.detection_object_filter_list=!0,a.protocol=!0,a.record_audio=!0,a.audio_voice_enhancement=!0,a.isOnvif=!0,a.backchannel_enabled=!0,a.retention_days=!0,a.detection_retention_days=!0,a.max_storage_mb=!0,a.tier_critical_multiplier=!0,a.tier_important_multiplier=!0,a.tier_ephemeral_multiplier=!0,a.storage_priority=!0,a.ptz_enabled=!0,a.ptz_max_x=!0,a.ptz_max_y=!0,a.ptz_max_z=!0,a.ptz_has_home=!0,a.onvif_username=!0,a.onvif_password=!0,a.onvif_profile=!0,a.onvif_port=!0,a.record_on_schedule=!0,a.recording_schedule=!0,a.detection_record_on_schedule=!0,a.detection_recording_schedule=!0,a.tags=!0,a.admin_url=!0,a.privacy_mode=!0,a.can_control_privacy=!0,a.motion_trigger_source=!0,a.go2rtc_source_override=!0,a.sub_stream_url=!0,a.has_sub_stream=!0,a.detection_url=!0,a.publish_url=!0,a.status=!0,a.error_message=!0,a.go2rtc_hls_available=!0)}return j.errors=t,o.props=a,r===0}j.evaluated={dynamicProps:!0,dynamicItems:!1};var ee=new RegExp("[?&;][^=&#]*([Pp][Aa][Ss][Ss]|[Pp][Ww][Dd]|[Tt][Oo][Kk][Ee][Nn]|[Ss][Ee][Cc][Rr][Ee][Tt]|[Aa][Pp][Ii]_?[Kk][Ee][Yy])[^=&#]*=[^&#]","u");function q(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:_=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=q.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e!="string")return q.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;let p=r,y=r;if(typeof e=="string"&&!ee.test(e)){let l={};t===null?t=[l]:t.push(l),r++}var a=y===r;return a?(q.errors=[{instancePath:n,schemaPath:"#/not",keyword:"not",params:{},message:"must NOT be valid"}],!1):(r=p,t!==null&&(p?t.length=p:t=null),q.errors=t,r===0)}q.evaluated={dynamicProps:!1,dynamicItems:!1};function Y(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:_=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=Y.evaluated;o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0);let p=r;L(e,{instancePath:n,parentData:b,parentDataProperty:g,rootData:_,dynamicAnchors:d})||(t=t===null?L.errors:t.concat(L.errors),r=t.length);var y=p===r;if(y){let a=r;q(e,{instancePath:n,parentData:b,parentDataProperty:g,rootData:_,dynamicAnchors:d})||(t=t===null?q.errors:t.concat(q.errors),r=t.length);var y=a===r}return Y.errors=t,r===0}Y.evaluated={dynamicProps:!1,dynamicItems:!1};function w(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:_=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=w.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e!="string"?(w.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1):e!==""?(w.errors=[{instancePath:n,schemaPath:"#/const",keyword:"const",params:{allowedValue:""},message:"must be equal to constant"}],!1):(w.errors=t,r===0)}w.evaluated={dynamicProps:!1,dynamicItems:!1};function S(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:_=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=S.evaluated;o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0);let p=r;f(e,{instancePath:n,parentData:b,parentDataProperty:g,rootData:_,dynamicAnchors:d})||(t=t===null?f.errors:t.concat(f.errors),r=t.length);var y=p===r;if(y){let u=r,$=r,i=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let s;if(e.detection_api_url===void 0&&(s="detection_api_url")){let c={};t===null?t=[c]:t.push(c),r++}}var a=i===r;if(a)return S.errors=[{instancePath:n,schemaPath:"#/allOf/1/not",keyword:"not",params:{},message:"must NOT be valid"}],!1;if(r=$,t!==null&&($?t.length=$:t=null),r===u)if(e&&typeof e=="object"&&!Array.isArray(e)){if(e.can_control_privacy!==void 0){let s=r;if(e.can_control_privacy!==!1)return S.errors=[{instancePath:n+"/can_control_privacy",schemaPath:"#/allOf/1/properties/can_control_privacy/const",keyword:"const",params:{allowedValue:!1},message:"must be equal to constant"}],!1;var l=s===r}else var l=!0;if(l){if(e.url!==void 0){let s=r;Y(e.url,{instancePath:n+"/url",parentData:e,parentDataProperty:"url",rootData:_,dynamicAnchors:d})||(t=t===null?Y.errors:t.concat(Y.errors),r=t.length);var l=s===r}else var l=!0;if(l){if(e.onvif_username!==void 0){let s=r;w(e.onvif_username,{instancePath:n+"/onvif_username",parentData:e,parentDataProperty:"onvif_username",rootData:_,dynamicAnchors:d})||(t=t===null?w.errors:t.concat(w.errors),r=t.length);var l=s===r}else var l=!0;if(l){if(e.onvif_password!==void 0){let s=r;w(e.onvif_password,{instancePath:n+"/onvif_password",parentData:e,parentDataProperty:"onvif_password",rootData:_,dynamicAnchors:d})||(t=t===null?w.errors:t.concat(w.errors),r=t.length);var l=s===r}else var l=!0;if(l){if(e.admin_url!==void 0){let s=r;w(e.admin_url,{instancePath:n+"/admin_url",parentData:e,parentDataProperty:"admin_url",rootData:_,dynamicAnchors:d})||(t=t===null?w.errors:t.concat(w.errors),r=t.length);var l=s===r}else var l=!0;if(l){if(e.go2rtc_source_override!==void 0){let s=r;w(e.go2rtc_source_override,{instancePath:n+"/go2rtc_source_override",parentData:e,parentDataProperty:"go2rtc_source_override",rootData:_,dynamicAnchors:d})||(t=t===null?w.errors:t.concat(w.errors),r=t.length);var l=s===r}else var l=!0;if(l){if(e.sub_stream_url!==void 0){let s=r;w(e.sub_stream_url,{instancePath:n+"/sub_stream_url",parentData:e,parentDataProperty:"sub_stream_url",rootData:_,dynamicAnchors:d})||(t=t===null?w.errors:t.concat(w.errors),r=t.length);var l=s===r}else var l=!0;if(l){if(e.detection_url!==void 0){let s=r;w(e.detection_url,{instancePath:n+"/detection_url",parentData:e,parentDataProperty:"detection_url",rootData:_,dynamicAnchors:d})||(t=t===null?w.errors:t.concat(w.errors),r=t.length);var l=s===r}else var l=!0;if(l)if(e.publish_url!==void 0){let s=r;w(e.publish_url,{instancePath:n+"/publish_url",parentData:e,parentDataProperty:"publish_url",rootData:_,dynamicAnchors:d})||(t=t===null?w.errors:t.concat(w.errors),r=t.length);var l=s===r}else var l=!0}}}}}}}}else return S.errors=[{instancePath:n,schemaPath:"#/allOf/1/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;var y=u===r}return S.errors=t,r===0}S.evaluated={props:{can_control_privacy:!0,url:!0,onvif_username:!0,onvif_password:!0,admin_url:!0,go2rtc_source_override:!0,sub_stream_url:!0,detection_url:!0,publish_url:!0,camera_uuid:!0,location_uuid:!0,name:!0,enabled:!0,streaming_enabled:!0,playback_transport:!0,eptz_config:!0,width:!0,height:!0,fps:!0,codec:!0,priority:!0,record:!0,segment_duration:!0,detection_based_recording:!0,detection_model:!0,detection_threshold:!0,detection_interval:!0,pre_detection_buffer:!0,post_detection_buffer:!0,detection_object_filter:!0,detection_object_filter_list:!0,protocol:!0,record_audio:!0,audio_voice_enhancement:!0,isOnvif:!0,backchannel_enabled:!0,retention_days:!0,detection_retention_days:!0,max_storage_mb:!0,tier_critical_multiplier:!0,tier_important_multiplier:!0,tier_ephemeral_multiplier:!0,storage_priority:!0,ptz_enabled:!0,ptz_max_x:!0,ptz_max_y:!0,ptz_max_z:!0,ptz_has_home:!0,onvif_profile:!0,onvif_port:!0,record_on_schedule:!0,recording_schedule:!0,detection_record_on_schedule:!0,detection_recording_schedule:!0,tags:!0,privacy_mode:!0,motion_trigger_source:!0,has_sub_stream:!0,status:!0,error_message:!0,go2rtc_hls_available:!0},dynamicProps:!1,dynamicItems:!1};function U(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:_=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=U.evaluated;o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0);let p=r,y=!1,a=null,l=r;if(!j(e,{instancePath:n,parentData:b,parentDataProperty:g,rootData:_,dynamicAnchors:d}))t=t===null?j.errors:t.concat(j.errors),r=t.length;else var u=j.evaluated.props;var i=l===r;i&&(y=!0,a=0);let $=r;S(e,{instancePath:n,parentData:b,parentDataProperty:g,rootData:_,dynamicAnchors:d})||(t=t===null?S.errors:t.concat(S.errors),r=t.length);var i=$===r;if(i&&y?(y=!1,a=[a,1]):i&&(y=!0,a=1,u!==!0&&(u=u||{},u.can_control_privacy=!0,u.url=!0,u.onvif_username=!0,u.onvif_password=!0,u.admin_url=!0,u.go2rtc_source_override=!0,u.sub_stream_url=!0,u.detection_url=!0,u.publish_url=!0,u.camera_uuid=!0,u.location_uuid=!0,u.name=!0,u.enabled=!0,u.streaming_enabled=!0,u.playback_transport=!0,u.eptz_config=!0,u.width=!0,u.height=!0,u.fps=!0,u.codec=!0,u.priority=!0,u.record=!0,u.segment_duration=!0,u.detection_based_recording=!0,u.detection_model=!0,u.detection_threshold=!0,u.detection_interval=!0,u.pre_detection_buffer=!0,u.post_detection_buffer=!0,u.detection_object_filter=!0,u.detection_object_filter_list=!0,u.protocol=!0,u.record_audio=!0,u.audio_voice_enhancement=!0,u.isOnvif=!0,u.backchannel_enabled=!0,u.retention_days=!0,u.detection_retention_days=!0,u.max_storage_mb=!0,u.tier_critical_multiplier=!0,u.tier_important_multiplier=!0,u.tier_ephemeral_multiplier=!0,u.storage_priority=!0,u.ptz_enabled=!0,u.ptz_max_x=!0,u.ptz_max_y=!0,u.ptz_max_z=!0,u.ptz_has_home=!0,u.onvif_profile=!0,u.onvif_port=!0,u.record_on_schedule=!0,u.recording_schedule=!0,u.detection_record_on_schedule=!0,u.detection_recording_schedule=!0,u.tags=!0,u.privacy_mode=!0,u.motion_trigger_source=!0,u.has_sub_stream=!0,u.status=!0,u.error_message=!0,u.go2rtc_hls_available=!0)),y)r=p,t!==null&&(p?t.length=p:t=null);else{let m={instancePath:n,schemaPath:"#/oneOf",keyword:"oneOf",params:{passingSchemas:a},message:"must match exactly one schema in oneOf"};return t===null?t=[m]:t.push(m),r++,U.errors=t,!1}return U.errors=t,o.props=u,r===0}U.evaluated={dynamicProps:!0,dynamicItems:!1};export{ne as validateStreamDetail}; diff --git a/web/js/api/generated/validators/StreamDetailBase.d.mts b/web/js/api/generated/validators/StreamDetailBase.d.mts new file mode 100644 index 000000000..aaf3c8152 --- /dev/null +++ b/web/js/api/generated/validators/StreamDetailBase.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateStreamDetailBase } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/StreamDetailBase.mjs b/web/js/api/generated/validators/StreamDetailBase.mjs new file mode 100644 index 000000000..2cc96319a --- /dev/null +++ b/web/js/api/generated/validators/StreamDetailBase.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var E=(e,s)=>()=>{try{return s||e((s={exports:{}}).exports,s),s.exports}catch(b){throw s=0,b}};var $=E(T=>{"use strict";Object.defineProperty(T,"__esModule",{value:!0});function O(e){let s=e.length,b=0,v=0,f;for(;v=55296&&f<=56319&&v36)return x.errors=[{instancePath:s,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:36},message:"must NOT have more than 36 characters"}],!1;if(!q.test(e))return x.errors=[{instancePath:s,schemaPath:"#/pattern",keyword:"pattern",params:{pattern:"^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$"},message:'must match pattern "^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$"'}],!1}else return x.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return x.errors=n,r===0}x.evaluated={dynamicProps:!1,dynamicItems:!1};function k(e,{instancePath:s="",parentData:b,parentDataProperty:v,rootData:f=e,dynamicAnchors:d={}}={}){let n=null,r=0,u=k.evaluated;if(u.dynamicProps&&(u.props=void 0),u.dynamicItems&&(u.items=void 0),r===0)if(typeof e=="string"){if(g(e)>255)return k.errors=[{instancePath:s,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1;if(g(e)<1)return k.errors=[{instancePath:s,schemaPath:"#/minLength",keyword:"minLength",params:{limit:1},message:"must NOT have fewer than 1 characters"}],!1;if(new TextEncoder().encode(e).byteLength>255)return k.errors=[{instancePath:s,schemaPath:"#/x-lightnvr-max-bytes",keyword:"x-lightnvr-max-bytes",params:{},message:"must fit the UTF-8 byte limit"}],!1}else return k.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return k.errors=n,r===0}k.evaluated={dynamicProps:!1,dynamicItems:!1};var V={type:"string",enum:["auto","webrtc_only","mse_only","hls_only","webrtc_then_mse","mse_then_hls"],$id:"urn:lightnvr:contract:PlaybackTransport"};function z(e,{instancePath:s="",parentData:b,parentDataProperty:v,rootData:f=e,dynamicAnchors:d={}}={}){let n=null,r=0,u=z.evaluated;return u.dynamicProps&&(u.props=void 0),u.dynamicItems&&(u.items=void 0),typeof e!="string"?(z.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1):e==="auto"||e==="webrtc_only"||e==="mse_only"||e==="hls_only"||e==="webrtc_then_mse"||e==="mse_then_hls"?(z.errors=n,r===0):(z.errors=[{instancePath:s,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:V.enum},message:"must be equal to one of the allowed values"}],!1)}z.evaluated={dynamicProps:!1,dynamicItems:!1};function _(e,{instancePath:s="",parentData:b,parentDataProperty:v,rootData:f=e,dynamicAnchors:d={}}={}){let n=null,r=0,u=_.evaluated;if(u.dynamicProps&&(u.props=void 0),u.dynamicItems&&(u.items=void 0),r===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let y;if(e.version===void 0&&(y="version")||e.projection===void 0&&(y="projection")||e.mount===void 0&&(y="mount")||e.centerX===void 0&&(y="centerX")||e.centerY===void 0&&(y="centerY")||e.radius===void 0&&(y="radius")||e.fov===void 0&&(y="fov")||e.rotation===void 0&&(y="rotation")||e.defaultYaw===void 0&&(y="defaultYaw")||e.defaultTilt===void 0&&(y="defaultTilt")||e.defaultViewFov===void 0&&(y="defaultViewFov"))return _.errors=[{instancePath:s,schemaPath:"#/required",keyword:"required",params:{missingProperty:y},message:"must have required property '"+y+"'"}],!1;if(e.version!==void 0){let o=r;if(e.version!==1)return _.errors=[{instancePath:s+"/version",schemaPath:"#/properties/version/const",keyword:"const",params:{allowedValue:1},message:"must be equal to constant"}],!1;var c=o===r}else var c=!0;if(c){if(e.projection!==void 0){let o=r;if(e.projection!=="equidistant")return _.errors=[{instancePath:s+"/projection",schemaPath:"#/properties/projection/const",keyword:"const",params:{allowedValue:"equidistant"},message:"must be equal to constant"}],!1;var c=o===r}else var c=!0;if(c){if(e.mount!==void 0){let o=r;if(e.mount!=="ceiling")return _.errors=[{instancePath:s+"/mount",schemaPath:"#/properties/mount/const",keyword:"const",params:{allowedValue:"ceiling"},message:"must be equal to constant"}],!1;var c=o===r}else var c=!0;if(c){if(e.centerX!==void 0){let o=e.centerX,h=r;if(r===h)if(typeof o=="number"&&isFinite(o)){if(o>1||isNaN(o))return _.errors=[{instancePath:s+"/centerX",schemaPath:"#/properties/centerX/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(o<0||isNaN(o))return _.errors=[{instancePath:s+"/centerX",schemaPath:"#/properties/centerX/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1}else return _.errors=[{instancePath:s+"/centerX",schemaPath:"#/properties/centerX/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var c=h===r}else var c=!0;if(c){if(e.centerY!==void 0){let o=e.centerY,h=r;if(r===h)if(typeof o=="number"&&isFinite(o)){if(o>1||isNaN(o))return _.errors=[{instancePath:s+"/centerY",schemaPath:"#/properties/centerY/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(o<0||isNaN(o))return _.errors=[{instancePath:s+"/centerY",schemaPath:"#/properties/centerY/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1}else return _.errors=[{instancePath:s+"/centerY",schemaPath:"#/properties/centerY/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var c=h===r}else var c=!0;if(c){if(e.radius!==void 0){let o=e.radius,h=r;if(r===h)if(typeof o=="number"&&isFinite(o)){if(o>1||isNaN(o))return _.errors=[{instancePath:s+"/radius",schemaPath:"#/properties/radius/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(o<.05||isNaN(o))return _.errors=[{instancePath:s+"/radius",schemaPath:"#/properties/radius/minimum",keyword:"minimum",params:{comparison:">=",limit:.05},message:"must be >= 0.05"}],!1}else return _.errors=[{instancePath:s+"/radius",schemaPath:"#/properties/radius/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var c=h===r}else var c=!0;if(c){if(e.fov!==void 0){let o=e.fov,h=r;if(r===h)if(typeof o=="number"&&isFinite(o)){if(o>360||isNaN(o))return _.errors=[{instancePath:s+"/fov",schemaPath:"#/properties/fov/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(o<160||isNaN(o))return _.errors=[{instancePath:s+"/fov",schemaPath:"#/properties/fov/minimum",keyword:"minimum",params:{comparison:">=",limit:160},message:"must be >= 160"}],!1}else return _.errors=[{instancePath:s+"/fov",schemaPath:"#/properties/fov/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var c=h===r}else var c=!0;if(c){if(e.rotation!==void 0){let o=e.rotation,h=r;if(r===h)if(typeof o=="number"&&isFinite(o)){if(o>360||isNaN(o))return _.errors=[{instancePath:s+"/rotation",schemaPath:"#/properties/rotation/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(o<-360||isNaN(o))return _.errors=[{instancePath:s+"/rotation",schemaPath:"#/properties/rotation/minimum",keyword:"minimum",params:{comparison:">=",limit:-360},message:"must be >= -360"}],!1}else return _.errors=[{instancePath:s+"/rotation",schemaPath:"#/properties/rotation/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var c=h===r}else var c=!0;if(c){if(e.defaultYaw!==void 0){let o=e.defaultYaw,h=r;if(r===h)if(typeof o=="number"&&isFinite(o)){if(o>360||isNaN(o))return _.errors=[{instancePath:s+"/defaultYaw",schemaPath:"#/properties/defaultYaw/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(o<-360||isNaN(o))return _.errors=[{instancePath:s+"/defaultYaw",schemaPath:"#/properties/defaultYaw/minimum",keyword:"minimum",params:{comparison:">=",limit:-360},message:"must be >= -360"}],!1}else return _.errors=[{instancePath:s+"/defaultYaw",schemaPath:"#/properties/defaultYaw/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var c=h===r}else var c=!0;if(c){if(e.defaultTilt!==void 0){let o=e.defaultTilt,h=r;if(r===h)if(typeof o=="number"&&isFinite(o)){if(o>30||isNaN(o))return _.errors=[{instancePath:s+"/defaultTilt",schemaPath:"#/properties/defaultTilt/maximum",keyword:"maximum",params:{comparison:"<=",limit:30},message:"must be <= 30"}],!1;if(o<-90||isNaN(o))return _.errors=[{instancePath:s+"/defaultTilt",schemaPath:"#/properties/defaultTilt/minimum",keyword:"minimum",params:{comparison:">=",limit:-90},message:"must be >= -90"}],!1}else return _.errors=[{instancePath:s+"/defaultTilt",schemaPath:"#/properties/defaultTilt/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var c=h===r}else var c=!0;if(c)if(e.defaultViewFov!==void 0){let o=e.defaultViewFov,h=r;if(r===h)if(typeof o=="number"&&isFinite(o)){if(o>120||isNaN(o))return _.errors=[{instancePath:s+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/maximum",keyword:"maximum",params:{comparison:"<=",limit:120},message:"must be <= 120"}],!1;if(o<20||isNaN(o))return _.errors=[{instancePath:s+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/minimum",keyword:"minimum",params:{comparison:">=",limit:20},message:"must be >= 20"}],!1}else return _.errors=[{instancePath:s+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var c=h===r}else var c=!0}}}}}}}}}}else return _.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return _.errors=n,r===0}_.evaluated={props:{version:!0,projection:!0,mount:!0,centerX:!0,centerY:!0,radius:!0,fov:!0,rotation:!0,defaultYaw:!0,defaultTilt:!0,defaultViewFov:!0},dynamicProps:!1,dynamicItems:!1};function N(e,{instancePath:s="",parentData:b,parentDataProperty:v,rootData:f=e,dynamicAnchors:d={}}={}){let n=null,r=0,u=N.evaluated;if(u.dynamicProps&&(u.props=void 0),u.dynamicItems&&(u.items=void 0),r===0)if(typeof e=="string"){if(g(e)>1023)return N.errors=[{instancePath:s,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:1023},message:"must NOT have more than 1023 characters"}],!1;if(new TextEncoder().encode(e).byteLength>1023)return N.errors=[{instancePath:s,schemaPath:"#/x-lightnvr-max-bytes",keyword:"x-lightnvr-max-bytes",params:{},message:"must fit the UTF-8 byte limit"}],!1;if(e!==""){let y,o=!0;try{y=JSON.parse(e)}catch{o=!1}if(o){let h=r;_(y,{instancePath:s,parentData:e,parentDataProperty:v,rootData:f,dynamicAnchors:d})||(n=n===null?_.errors:n.concat(_.errors),r=n.length);var c=h===r;o=c}if(!o)return N.errors=[{instancePath:s,schemaPath:"#/contentSchema",keyword:"contentSchema",params:{},message:"must contain valid JSON matching contentSchema (or be empty)"}],!1}}else return N.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return N.errors=n,r===0}N.evaluated={dynamicProps:!1,dynamicItems:!1};function p(e,{instancePath:s="",parentData:b,parentDataProperty:v,rootData:f=e,dynamicAnchors:d={}}={}){let n=null,r=0,u=p.evaluated;if(u.dynamicProps&&(u.props=void 0),u.dynamicItems&&(u.items=void 0),!(typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)))return p.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(r===0&&typeof e=="number"&&isFinite(e)){if(e>2147483647||isNaN(e))return p.errors=[{instancePath:s,schemaPath:"#/maximum",keyword:"maximum",params:{comparison:"<=",limit:2147483647},message:"must be <= 2147483647"}],!1;if(e<-2147483648||isNaN(e))return p.errors=[{instancePath:s,schemaPath:"#/minimum",keyword:"minimum",params:{comparison:">=",limit:-2147483648},message:"must be >= -2147483648"}],!1}return p.errors=n,r===0}p.evaluated={dynamicProps:!1,dynamicItems:!1};var A={type:"integer",enum:[0,1],$id:"urn:lightnvr:contract:StreamProtocol"};function D(e,{instancePath:s="",parentData:b,parentDataProperty:v,rootData:f=e,dynamicAnchors:d={}}={}){let n=null,r=0,u=D.evaluated;return u.dynamicProps&&(u.props=void 0),u.dynamicItems&&(u.items=void 0),typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)?e===0||e===1?(D.errors=n,r===0):(D.errors=[{instancePath:s,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:A.enum},message:"must be equal to one of the allowed values"}],!1):(D.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1)}D.evaluated={dynamicProps:!1,dynamicItems:!1};function P(e,{instancePath:s="",parentData:b,parentDataProperty:v,rootData:f=e,dynamicAnchors:d={}}={}){let n=null,r=0,u=P.evaluated;if(u.dynamicProps&&(u.props=void 0),u.dynamicItems&&(u.items=void 0),!(typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)))return P.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(r===0&&typeof e=="number"&&isFinite(e)){if(e>365||isNaN(e))return P.errors=[{instancePath:s,schemaPath:"#/maximum",keyword:"maximum",params:{comparison:"<=",limit:365},message:"must be <= 365"}],!1;if(e<-1||isNaN(e))return P.errors=[{instancePath:s,schemaPath:"#/minimum",keyword:"minimum",params:{comparison:">=",limit:-1},message:"must be >= -1"}],!1}return P.errors=n,r===0}P.evaluated={dynamicProps:!1,dynamicItems:!1};function w(e,{instancePath:s="",parentData:b,parentDataProperty:v,rootData:f=e,dynamicAnchors:d={}}={}){let n=null,r=0,u=w.evaluated;if(u.dynamicProps&&(u.props=void 0),u.dynamicItems&&(u.items=void 0),r===0)if(Array.isArray(e)){if(e.length>168)return w.errors=[{instancePath:s,schemaPath:"#/maxItems",keyword:"maxItems",params:{limit:168},message:"must NOT have more than 168 items"}],!1;if(e.length<168)return w.errors=[{instancePath:s,schemaPath:"#/minItems",keyword:"minItems",params:{limit:168},message:"must NOT have fewer than 168 items"}],!1;{var c=!0;let y=e.length;for(let o=0;o511)return l.errors=[{instancePath:s+"/url",schemaPath:"#/properties/url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return l.errors=[{instancePath:s+"/url",schemaPath:"#/properties/url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var t=m===r}else var t=!0;if(t){if(e.enabled!==void 0){let i=r;if(typeof e.enabled!="boolean")return l.errors=[{instancePath:s+"/enabled",schemaPath:"#/properties/enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var t=i===r}else var t=!0;if(t){if(e.streaming_enabled!==void 0){let i=r;if(typeof e.streaming_enabled!="boolean")return l.errors=[{instancePath:s+"/streaming_enabled",schemaPath:"#/properties/streaming_enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var t=i===r}else var t=!0;if(t){if(e.playback_transport!==void 0){let i=r;z(e.playback_transport,{instancePath:s+"/playback_transport",parentData:e,parentDataProperty:"playback_transport",rootData:f,dynamicAnchors:d})||(n=n===null?z.errors:n.concat(z.errors),r=n.length);var t=i===r}else var t=!0;if(t){if(e.eptz_config!==void 0){let i=r;N(e.eptz_config,{instancePath:s+"/eptz_config",parentData:e,parentDataProperty:"eptz_config",rootData:f,dynamicAnchors:d})||(n=n===null?N.errors:n.concat(N.errors),r=n.length);var t=i===r}else var t=!0;if(t){if(e.width!==void 0){let i=r;p(e.width,{instancePath:s+"/width",parentData:e,parentDataProperty:"width",rootData:f,dynamicAnchors:d})||(n=n===null?p.errors:n.concat(p.errors),r=n.length);var t=i===r}else var t=!0;if(t){if(e.height!==void 0){let i=r;p(e.height,{instancePath:s+"/height",parentData:e,parentDataProperty:"height",rootData:f,dynamicAnchors:d})||(n=n===null?p.errors:n.concat(p.errors),r=n.length);var t=i===r}else var t=!0;if(t){if(e.fps!==void 0){let i=r;p(e.fps,{instancePath:s+"/fps",parentData:e,parentDataProperty:"fps",rootData:f,dynamicAnchors:d})||(n=n===null?p.errors:n.concat(p.errors),r=n.length);var t=i===r}else var t=!0;if(t){if(e.codec!==void 0){let i=e.codec,m=r;if(r===m)if(typeof i=="string"){if(g(i)>15)return l.errors=[{instancePath:s+"/codec",schemaPath:"#/properties/codec/maxLength",keyword:"maxLength",params:{limit:15},message:"must NOT have more than 15 characters"}],!1}else return l.errors=[{instancePath:s+"/codec",schemaPath:"#/properties/codec/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var t=m===r}else var t=!0;if(t){if(e.priority!==void 0){let i=r;p(e.priority,{instancePath:s+"/priority",parentData:e,parentDataProperty:"priority",rootData:f,dynamicAnchors:d})||(n=n===null?p.errors:n.concat(p.errors),r=n.length);var t=i===r}else var t=!0;if(t){if(e.record!==void 0){let i=r;if(typeof e.record!="boolean")return l.errors=[{instancePath:s+"/record",schemaPath:"#/properties/record/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var t=i===r}else var t=!0;if(t){if(e.segment_duration!==void 0){let i=r;p(e.segment_duration,{instancePath:s+"/segment_duration",parentData:e,parentDataProperty:"segment_duration",rootData:f,dynamicAnchors:d})||(n=n===null?p.errors:n.concat(p.errors),r=n.length);var t=i===r}else var t=!0;if(t){if(e.detection_based_recording!==void 0){let i=r;if(typeof e.detection_based_recording!="boolean")return l.errors=[{instancePath:s+"/detection_based_recording",schemaPath:"#/properties/detection_based_recording/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var t=i===r}else var t=!0;if(t){if(e.detection_model!==void 0){let i=e.detection_model,m=r;if(r===m)if(typeof i=="string"){if(g(i)>511)return l.errors=[{instancePath:s+"/detection_model",schemaPath:"#/properties/detection_model/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return l.errors=[{instancePath:s+"/detection_model",schemaPath:"#/properties/detection_model/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var t=m===r}else var t=!0;if(t){if(e.detection_threshold!==void 0){let i=e.detection_threshold,m=r;if(!(typeof i=="number"&&!(i%1)&&!isNaN(i)&&isFinite(i)))return l.errors=[{instancePath:s+"/detection_threshold",schemaPath:"#/properties/detection_threshold/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;var t=m===r}else var t=!0;if(t){if(e.detection_interval!==void 0){let i=r;p(e.detection_interval,{instancePath:s+"/detection_interval",parentData:e,parentDataProperty:"detection_interval",rootData:f,dynamicAnchors:d})||(n=n===null?p.errors:n.concat(p.errors),r=n.length);var t=i===r}else var t=!0;if(t){if(e.pre_detection_buffer!==void 0){let i=r;p(e.pre_detection_buffer,{instancePath:s+"/pre_detection_buffer",parentData:e,parentDataProperty:"pre_detection_buffer",rootData:f,dynamicAnchors:d})||(n=n===null?p.errors:n.concat(p.errors),r=n.length);var t=i===r}else var t=!0;if(t){if(e.post_detection_buffer!==void 0){let i=r;p(e.post_detection_buffer,{instancePath:s+"/post_detection_buffer",parentData:e,parentDataProperty:"post_detection_buffer",rootData:f,dynamicAnchors:d})||(n=n===null?p.errors:n.concat(p.errors),r=n.length);var t=i===r}else var t=!0;if(t){if(e.detection_object_filter!==void 0){let i=e.detection_object_filter,m=r;if(r===m)if(typeof i=="string"){if(g(i)>15)return l.errors=[{instancePath:s+"/detection_object_filter",schemaPath:"#/properties/detection_object_filter/maxLength",keyword:"maxLength",params:{limit:15},message:"must NOT have more than 15 characters"}],!1}else return l.errors=[{instancePath:s+"/detection_object_filter",schemaPath:"#/properties/detection_object_filter/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var t=m===r}else var t=!0;if(t){if(e.detection_object_filter_list!==void 0){let i=e.detection_object_filter_list,m=r;if(r===m)if(typeof i=="string"){if(g(i)>255)return l.errors=[{instancePath:s+"/detection_object_filter_list",schemaPath:"#/properties/detection_object_filter_list/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1}else return l.errors=[{instancePath:s+"/detection_object_filter_list",schemaPath:"#/properties/detection_object_filter_list/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var t=m===r}else var t=!0;if(t){if(e.protocol!==void 0){let i=r;D(e.protocol,{instancePath:s+"/protocol",parentData:e,parentDataProperty:"protocol",rootData:f,dynamicAnchors:d})||(n=n===null?D.errors:n.concat(D.errors),r=n.length);var t=i===r}else var t=!0;if(t){if(e.record_audio!==void 0){let i=r;if(typeof e.record_audio!="boolean")return l.errors=[{instancePath:s+"/record_audio",schemaPath:"#/properties/record_audio/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var t=i===r}else var t=!0;if(t){if(e.audio_voice_enhancement!==void 0){let i=r;if(typeof e.audio_voice_enhancement!="boolean")return l.errors=[{instancePath:s+"/audio_voice_enhancement",schemaPath:"#/properties/audio_voice_enhancement/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var t=i===r}else var t=!0;if(t){if(e.isOnvif!==void 0){let i=r;if(typeof e.isOnvif!="boolean")return l.errors=[{instancePath:s+"/isOnvif",schemaPath:"#/properties/isOnvif/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var t=i===r}else var t=!0;if(t){if(e.backchannel_enabled!==void 0){let i=r;if(typeof e.backchannel_enabled!="boolean")return l.errors=[{instancePath:s+"/backchannel_enabled",schemaPath:"#/properties/backchannel_enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var t=i===r}else var t=!0;if(t){if(e.retention_days!==void 0){let i=r;P(e.retention_days,{instancePath:s+"/retention_days",parentData:e,parentDataProperty:"retention_days",rootData:f,dynamicAnchors:d})||(n=n===null?P.errors:n.concat(P.errors),r=n.length);var t=i===r}else var t=!0;if(t){if(e.detection_retention_days!==void 0){let i=r;P(e.detection_retention_days,{instancePath:s+"/detection_retention_days",parentData:e,parentDataProperty:"detection_retention_days",rootData:f,dynamicAnchors:d})||(n=n===null?P.errors:n.concat(P.errors),r=n.length);var t=i===r}else var t=!0;if(t){if(e.max_storage_mb!==void 0){let i=r;p(e.max_storage_mb,{instancePath:s+"/max_storage_mb",parentData:e,parentDataProperty:"max_storage_mb",rootData:f,dynamicAnchors:d})||(n=n===null?p.errors:n.concat(p.errors),r=n.length);var t=i===r}else var t=!0;if(t){if(e.tier_critical_multiplier!==void 0){let i=e.tier_critical_multiplier,m=r;if(!(typeof i=="number"&&isFinite(i)))return l.errors=[{instancePath:s+"/tier_critical_multiplier",schemaPath:"#/properties/tier_critical_multiplier/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var t=m===r}else var t=!0;if(t){if(e.tier_important_multiplier!==void 0){let i=e.tier_important_multiplier,m=r;if(!(typeof i=="number"&&isFinite(i)))return l.errors=[{instancePath:s+"/tier_important_multiplier",schemaPath:"#/properties/tier_important_multiplier/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var t=m===r}else var t=!0;if(t){if(e.tier_ephemeral_multiplier!==void 0){let i=e.tier_ephemeral_multiplier,m=r;if(!(typeof i=="number"&&isFinite(i)))return l.errors=[{instancePath:s+"/tier_ephemeral_multiplier",schemaPath:"#/properties/tier_ephemeral_multiplier/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var t=m===r}else var t=!0;if(t){if(e.storage_priority!==void 0){let i=r;p(e.storage_priority,{instancePath:s+"/storage_priority",parentData:e,parentDataProperty:"storage_priority",rootData:f,dynamicAnchors:d})||(n=n===null?p.errors:n.concat(p.errors),r=n.length);var t=i===r}else var t=!0;if(t){if(e.ptz_enabled!==void 0){let i=r;if(typeof e.ptz_enabled!="boolean")return l.errors=[{instancePath:s+"/ptz_enabled",schemaPath:"#/properties/ptz_enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var t=i===r}else var t=!0;if(t){if(e.ptz_max_x!==void 0){let i=r;p(e.ptz_max_x,{instancePath:s+"/ptz_max_x",parentData:e,parentDataProperty:"ptz_max_x",rootData:f,dynamicAnchors:d})||(n=n===null?p.errors:n.concat(p.errors),r=n.length);var t=i===r}else var t=!0;if(t){if(e.ptz_max_y!==void 0){let i=r;p(e.ptz_max_y,{instancePath:s+"/ptz_max_y",parentData:e,parentDataProperty:"ptz_max_y",rootData:f,dynamicAnchors:d})||(n=n===null?p.errors:n.concat(p.errors),r=n.length);var t=i===r}else var t=!0;if(t){if(e.ptz_max_z!==void 0){let i=r;p(e.ptz_max_z,{instancePath:s+"/ptz_max_z",parentData:e,parentDataProperty:"ptz_max_z",rootData:f,dynamicAnchors:d})||(n=n===null?p.errors:n.concat(p.errors),r=n.length);var t=i===r}else var t=!0;if(t){if(e.ptz_has_home!==void 0){let i=r;if(typeof e.ptz_has_home!="boolean")return l.errors=[{instancePath:s+"/ptz_has_home",schemaPath:"#/properties/ptz_has_home/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var t=i===r}else var t=!0;if(t){if(e.onvif_username!==void 0){let i=e.onvif_username,m=r;if(r===m)if(typeof i=="string"){if(g(i)>63)return l.errors=[{instancePath:s+"/onvif_username",schemaPath:"#/properties/onvif_username/maxLength",keyword:"maxLength",params:{limit:63},message:"must NOT have more than 63 characters"}],!1}else return l.errors=[{instancePath:s+"/onvif_username",schemaPath:"#/properties/onvif_username/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var t=m===r}else var t=!0;if(t){if(e.onvif_password!==void 0){let i=e.onvif_password,m=r;if(r===m)if(typeof i=="string"){if(g(i)>63)return l.errors=[{instancePath:s+"/onvif_password",schemaPath:"#/properties/onvif_password/maxLength",keyword:"maxLength",params:{limit:63},message:"must NOT have more than 63 characters"}],!1}else return l.errors=[{instancePath:s+"/onvif_password",schemaPath:"#/properties/onvif_password/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var t=m===r}else var t=!0;if(t){if(e.onvif_profile!==void 0){let i=e.onvif_profile,m=r;if(r===m)if(typeof i=="string"){if(g(i)>63)return l.errors=[{instancePath:s+"/onvif_profile",schemaPath:"#/properties/onvif_profile/maxLength",keyword:"maxLength",params:{limit:63},message:"must NOT have more than 63 characters"}],!1}else return l.errors=[{instancePath:s+"/onvif_profile",schemaPath:"#/properties/onvif_profile/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var t=m===r}else var t=!0;if(t){if(e.onvif_port!==void 0){let i=r;p(e.onvif_port,{instancePath:s+"/onvif_port",parentData:e,parentDataProperty:"onvif_port",rootData:f,dynamicAnchors:d})||(n=n===null?p.errors:n.concat(p.errors),r=n.length);var t=i===r}else var t=!0;if(t){if(e.record_on_schedule!==void 0){let i=r;if(typeof e.record_on_schedule!="boolean")return l.errors=[{instancePath:s+"/record_on_schedule",schemaPath:"#/properties/record_on_schedule/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var t=i===r}else var t=!0;if(t){if(e.recording_schedule!==void 0){let i=r;w(e.recording_schedule,{instancePath:s+"/recording_schedule",parentData:e,parentDataProperty:"recording_schedule",rootData:f,dynamicAnchors:d})||(n=n===null?w.errors:n.concat(w.errors),r=n.length);var t=i===r}else var t=!0;if(t){if(e.detection_record_on_schedule!==void 0){let i=r;if(typeof e.detection_record_on_schedule!="boolean")return l.errors=[{instancePath:s+"/detection_record_on_schedule",schemaPath:"#/properties/detection_record_on_schedule/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var t=i===r}else var t=!0;if(t){if(e.detection_recording_schedule!==void 0){let i=r;w(e.detection_recording_schedule,{instancePath:s+"/detection_recording_schedule",parentData:e,parentDataProperty:"detection_recording_schedule",rootData:f,dynamicAnchors:d})||(n=n===null?w.errors:n.concat(w.errors),r=n.length);var t=i===r}else var t=!0;if(t){if(e.tags!==void 0){let i=e.tags,m=r;if(r===m)if(typeof i=="string"){if(g(i)>255)return l.errors=[{instancePath:s+"/tags",schemaPath:"#/properties/tags/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1}else return l.errors=[{instancePath:s+"/tags",schemaPath:"#/properties/tags/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var t=m===r}else var t=!0;if(t){if(e.admin_url!==void 0){let i=e.admin_url,m=r;if(r===m)if(typeof i=="string"){if(g(i)>511)return l.errors=[{instancePath:s+"/admin_url",schemaPath:"#/properties/admin_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return l.errors=[{instancePath:s+"/admin_url",schemaPath:"#/properties/admin_url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var t=m===r}else var t=!0;if(t){if(e.privacy_mode!==void 0){let i=r;if(typeof e.privacy_mode!="boolean")return l.errors=[{instancePath:s+"/privacy_mode",schemaPath:"#/properties/privacy_mode/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var t=i===r}else var t=!0;if(t){if(e.can_control_privacy!==void 0){let i=r;if(typeof e.can_control_privacy!="boolean")return l.errors=[{instancePath:s+"/can_control_privacy",schemaPath:"#/properties/can_control_privacy/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var t=i===r}else var t=!0;if(t){if(e.motion_trigger_source!==void 0){let i=e.motion_trigger_source,m=r;if(r===m)if(typeof i=="string"){if(g(i)>255)return l.errors=[{instancePath:s+"/motion_trigger_source",schemaPath:"#/properties/motion_trigger_source/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1}else return l.errors=[{instancePath:s+"/motion_trigger_source",schemaPath:"#/properties/motion_trigger_source/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var t=m===r}else var t=!0;if(t){if(e.go2rtc_source_override!==void 0){let i=e.go2rtc_source_override,m=r;if(r===m)if(typeof i=="string"){if(g(i)>8191)return l.errors=[{instancePath:s+"/go2rtc_source_override",schemaPath:"#/properties/go2rtc_source_override/maxLength",keyword:"maxLength",params:{limit:8191},message:"must NOT have more than 8191 characters"}],!1}else return l.errors=[{instancePath:s+"/go2rtc_source_override",schemaPath:"#/properties/go2rtc_source_override/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var t=m===r}else var t=!0;if(t){if(e.sub_stream_url!==void 0){let i=e.sub_stream_url,m=r;if(r===m)if(typeof i=="string"){if(g(i)>511)return l.errors=[{instancePath:s+"/sub_stream_url",schemaPath:"#/properties/sub_stream_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return l.errors=[{instancePath:s+"/sub_stream_url",schemaPath:"#/properties/sub_stream_url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var t=m===r}else var t=!0;if(t){if(e.has_sub_stream!==void 0){let i=r;if(typeof e.has_sub_stream!="boolean")return l.errors=[{instancePath:s+"/has_sub_stream",schemaPath:"#/properties/has_sub_stream/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var t=i===r}else var t=!0;if(t){if(e.detection_url!==void 0){let i=e.detection_url,m=r;if(r===m)if(typeof i=="string"){if(g(i)>511)return l.errors=[{instancePath:s+"/detection_url",schemaPath:"#/properties/detection_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return l.errors=[{instancePath:s+"/detection_url",schemaPath:"#/properties/detection_url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var t=m===r}else var t=!0;if(t){if(e.publish_url!==void 0){let i=e.publish_url,m=r;if(r===m)if(typeof i=="string"){if(g(i)>511)return l.errors=[{instancePath:s+"/publish_url",schemaPath:"#/properties/publish_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return l.errors=[{instancePath:s+"/publish_url",schemaPath:"#/properties/publish_url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var t=m===r}else var t=!0;if(t){if(e.status!==void 0){let i=r;L(e.status,{instancePath:s+"/status",parentData:e,parentDataProperty:"status",rootData:f,dynamicAnchors:d})||(n=n===null?L.errors:n.concat(L.errors),r=n.length);var t=i===r}else var t=!0;if(t){if(e.error_message!==void 0){let i=e.error_message,m=r;if(r===m)if(typeof i=="string"){if(g(i)>255)return l.errors=[{instancePath:s+"/error_message",schemaPath:"#/properties/error_message/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1;if(g(i)<1)return l.errors=[{instancePath:s+"/error_message",schemaPath:"#/properties/error_message/minLength",keyword:"minLength",params:{limit:1},message:"must NOT have fewer than 1 characters"}],!1}else return l.errors=[{instancePath:s+"/error_message",schemaPath:"#/properties/error_message/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var t=m===r}else var t=!0;if(t)if(e.go2rtc_hls_available!==void 0){let i=r;if(typeof e.go2rtc_hls_available!="boolean")return l.errors=[{instancePath:s+"/go2rtc_hls_available",schemaPath:"#/properties/go2rtc_hls_available/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var t=i===r}else var t=!0}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}else return l.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return l.errors=n,r===0}l.evaluated={props:{camera_uuid:!0,location_uuid:!0,name:!0,url:!0,enabled:!0,streaming_enabled:!0,playback_transport:!0,eptz_config:!0,width:!0,height:!0,fps:!0,codec:!0,priority:!0,record:!0,segment_duration:!0,detection_based_recording:!0,detection_model:!0,detection_threshold:!0,detection_interval:!0,pre_detection_buffer:!0,post_detection_buffer:!0,detection_object_filter:!0,detection_object_filter_list:!0,protocol:!0,record_audio:!0,audio_voice_enhancement:!0,isOnvif:!0,backchannel_enabled:!0,retention_days:!0,detection_retention_days:!0,max_storage_mb:!0,tier_critical_multiplier:!0,tier_important_multiplier:!0,tier_ephemeral_multiplier:!0,storage_priority:!0,ptz_enabled:!0,ptz_max_x:!0,ptz_max_y:!0,ptz_max_z:!0,ptz_has_home:!0,onvif_username:!0,onvif_password:!0,onvif_profile:!0,onvif_port:!0,record_on_schedule:!0,recording_schedule:!0,detection_record_on_schedule:!0,detection_recording_schedule:!0,tags:!0,admin_url:!0,privacy_mode:!0,can_control_privacy:!0,motion_trigger_source:!0,go2rtc_source_override:!0,sub_stream_url:!0,has_sub_stream:!0,detection_url:!0,publish_url:!0,status:!0,error_message:!0,go2rtc_hls_available:!0},dynamicProps:!1,dynamicItems:!1};export{U as validateStreamDetailBase}; diff --git a/web/js/api/generated/validators/StreamDetailConfigurable.d.mts b/web/js/api/generated/validators/StreamDetailConfigurable.d.mts new file mode 100644 index 000000000..52bb031c3 --- /dev/null +++ b/web/js/api/generated/validators/StreamDetailConfigurable.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateStreamDetailConfigurable } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/StreamDetailConfigurable.mjs b/web/js/api/generated/validators/StreamDetailConfigurable.mjs new file mode 100644 index 000000000..171cf1947 --- /dev/null +++ b/web/js/api/generated/validators/StreamDetailConfigurable.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var U=(e,n)=>()=>{try{return n||e((n={exports:{}}).exports,n),n.exports}catch(w){throw n=0,w}};var X=U(E=>{"use strict";Object.defineProperty(E,"__esModule",{value:!0});function V(e){let n=e.length,w=0,b=0,c;for(;b=55296&&c<=56319&&b36)return z.errors=[{instancePath:n,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:36},message:"must NOT have more than 36 characters"}],!1;if(!R.test(e))return z.errors=[{instancePath:n,schemaPath:"#/pattern",keyword:"pattern",params:{pattern:"^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$"},message:'must match pattern "^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$"'}],!1}else return z.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return z.errors=t,r===0}z.evaluated={dynamicProps:!1,dynamicItems:!1};function D(e,{instancePath:n="",parentData:w,parentDataProperty:b,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=D.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(typeof e=="string"){if(v(e)>255)return D.errors=[{instancePath:n,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1;if(v(e)<1)return D.errors=[{instancePath:n,schemaPath:"#/minLength",keyword:"minLength",params:{limit:1},message:"must NOT have fewer than 1 characters"}],!1;if(new TextEncoder().encode(e).byteLength>255)return D.errors=[{instancePath:n,schemaPath:"#/x-lightnvr-max-bytes",keyword:"x-lightnvr-max-bytes",params:{},message:"must fit the UTF-8 byte limit"}],!1}else return D.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return D.errors=t,r===0}D.evaluated={dynamicProps:!1,dynamicItems:!1};var Z={type:"string",enum:["auto","webrtc_only","mse_only","hls_only","webrtc_then_mse","mse_then_hls"],$id:"urn:lightnvr:contract:PlaybackTransport"};function F(e,{instancePath:n="",parentData:w,parentDataProperty:b,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=F.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e!="string"?(F.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1):e==="auto"||e==="webrtc_only"||e==="mse_only"||e==="hls_only"||e==="webrtc_then_mse"||e==="mse_then_hls"?(F.errors=t,r===0):(F.errors=[{instancePath:n,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:Z.enum},message:"must be equal to one of the allowed values"}],!1)}F.evaluated={dynamicProps:!1,dynamicItems:!1};function h(e,{instancePath:n="",parentData:w,parentDataProperty:b,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=h.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let y;if(e.version===void 0&&(y="version")||e.projection===void 0&&(y="projection")||e.mount===void 0&&(y="mount")||e.centerX===void 0&&(y="centerX")||e.centerY===void 0&&(y="centerY")||e.radius===void 0&&(y="radius")||e.fov===void 0&&(y="fov")||e.rotation===void 0&&(y="rotation")||e.defaultYaw===void 0&&(y="defaultYaw")||e.defaultTilt===void 0&&(y="defaultTilt")||e.defaultViewFov===void 0&&(y="defaultViewFov"))return h.errors=[{instancePath:n,schemaPath:"#/required",keyword:"required",params:{missingProperty:y},message:"must have required property '"+y+"'"}],!1;if(e.version!==void 0){let a=r;if(e.version!==1)return h.errors=[{instancePath:n+"/version",schemaPath:"#/properties/version/const",keyword:"const",params:{allowedValue:1},message:"must be equal to constant"}],!1;var p=a===r}else var p=!0;if(p){if(e.projection!==void 0){let a=r;if(e.projection!=="equidistant")return h.errors=[{instancePath:n+"/projection",schemaPath:"#/properties/projection/const",keyword:"const",params:{allowedValue:"equidistant"},message:"must be equal to constant"}],!1;var p=a===r}else var p=!0;if(p){if(e.mount!==void 0){let a=r;if(e.mount!=="ceiling")return h.errors=[{instancePath:n+"/mount",schemaPath:"#/properties/mount/const",keyword:"const",params:{allowedValue:"ceiling"},message:"must be equal to constant"}],!1;var p=a===r}else var p=!0;if(p){if(e.centerX!==void 0){let a=e.centerX,_=r;if(r===_)if(typeof a=="number"&&isFinite(a)){if(a>1||isNaN(a))return h.errors=[{instancePath:n+"/centerX",schemaPath:"#/properties/centerX/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(a<0||isNaN(a))return h.errors=[{instancePath:n+"/centerX",schemaPath:"#/properties/centerX/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1}else return h.errors=[{instancePath:n+"/centerX",schemaPath:"#/properties/centerX/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=_===r}else var p=!0;if(p){if(e.centerY!==void 0){let a=e.centerY,_=r;if(r===_)if(typeof a=="number"&&isFinite(a)){if(a>1||isNaN(a))return h.errors=[{instancePath:n+"/centerY",schemaPath:"#/properties/centerY/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(a<0||isNaN(a))return h.errors=[{instancePath:n+"/centerY",schemaPath:"#/properties/centerY/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1}else return h.errors=[{instancePath:n+"/centerY",schemaPath:"#/properties/centerY/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=_===r}else var p=!0;if(p){if(e.radius!==void 0){let a=e.radius,_=r;if(r===_)if(typeof a=="number"&&isFinite(a)){if(a>1||isNaN(a))return h.errors=[{instancePath:n+"/radius",schemaPath:"#/properties/radius/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(a<.05||isNaN(a))return h.errors=[{instancePath:n+"/radius",schemaPath:"#/properties/radius/minimum",keyword:"minimum",params:{comparison:">=",limit:.05},message:"must be >= 0.05"}],!1}else return h.errors=[{instancePath:n+"/radius",schemaPath:"#/properties/radius/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=_===r}else var p=!0;if(p){if(e.fov!==void 0){let a=e.fov,_=r;if(r===_)if(typeof a=="number"&&isFinite(a)){if(a>360||isNaN(a))return h.errors=[{instancePath:n+"/fov",schemaPath:"#/properties/fov/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(a<160||isNaN(a))return h.errors=[{instancePath:n+"/fov",schemaPath:"#/properties/fov/minimum",keyword:"minimum",params:{comparison:">=",limit:160},message:"must be >= 160"}],!1}else return h.errors=[{instancePath:n+"/fov",schemaPath:"#/properties/fov/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=_===r}else var p=!0;if(p){if(e.rotation!==void 0){let a=e.rotation,_=r;if(r===_)if(typeof a=="number"&&isFinite(a)){if(a>360||isNaN(a))return h.errors=[{instancePath:n+"/rotation",schemaPath:"#/properties/rotation/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(a<-360||isNaN(a))return h.errors=[{instancePath:n+"/rotation",schemaPath:"#/properties/rotation/minimum",keyword:"minimum",params:{comparison:">=",limit:-360},message:"must be >= -360"}],!1}else return h.errors=[{instancePath:n+"/rotation",schemaPath:"#/properties/rotation/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=_===r}else var p=!0;if(p){if(e.defaultYaw!==void 0){let a=e.defaultYaw,_=r;if(r===_)if(typeof a=="number"&&isFinite(a)){if(a>360||isNaN(a))return h.errors=[{instancePath:n+"/defaultYaw",schemaPath:"#/properties/defaultYaw/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(a<-360||isNaN(a))return h.errors=[{instancePath:n+"/defaultYaw",schemaPath:"#/properties/defaultYaw/minimum",keyword:"minimum",params:{comparison:">=",limit:-360},message:"must be >= -360"}],!1}else return h.errors=[{instancePath:n+"/defaultYaw",schemaPath:"#/properties/defaultYaw/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=_===r}else var p=!0;if(p){if(e.defaultTilt!==void 0){let a=e.defaultTilt,_=r;if(r===_)if(typeof a=="number"&&isFinite(a)){if(a>30||isNaN(a))return h.errors=[{instancePath:n+"/defaultTilt",schemaPath:"#/properties/defaultTilt/maximum",keyword:"maximum",params:{comparison:"<=",limit:30},message:"must be <= 30"}],!1;if(a<-90||isNaN(a))return h.errors=[{instancePath:n+"/defaultTilt",schemaPath:"#/properties/defaultTilt/minimum",keyword:"minimum",params:{comparison:">=",limit:-90},message:"must be >= -90"}],!1}else return h.errors=[{instancePath:n+"/defaultTilt",schemaPath:"#/properties/defaultTilt/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=_===r}else var p=!0;if(p)if(e.defaultViewFov!==void 0){let a=e.defaultViewFov,_=r;if(r===_)if(typeof a=="number"&&isFinite(a)){if(a>120||isNaN(a))return h.errors=[{instancePath:n+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/maximum",keyword:"maximum",params:{comparison:"<=",limit:120},message:"must be <= 120"}],!1;if(a<20||isNaN(a))return h.errors=[{instancePath:n+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/minimum",keyword:"minimum",params:{comparison:">=",limit:20},message:"must be >= 20"}],!1}else return h.errors=[{instancePath:n+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=_===r}else var p=!0}}}}}}}}}}else return h.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return h.errors=t,r===0}h.evaluated={props:{version:!0,projection:!0,mount:!0,centerX:!0,centerY:!0,radius:!0,fov:!0,rotation:!0,defaultYaw:!0,defaultTilt:!0,defaultViewFov:!0},dynamicProps:!1,dynamicItems:!1};function L(e,{instancePath:n="",parentData:w,parentDataProperty:b,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=L.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(typeof e=="string"){if(v(e)>1023)return L.errors=[{instancePath:n,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:1023},message:"must NOT have more than 1023 characters"}],!1;if(new TextEncoder().encode(e).byteLength>1023)return L.errors=[{instancePath:n,schemaPath:"#/x-lightnvr-max-bytes",keyword:"x-lightnvr-max-bytes",params:{},message:"must fit the UTF-8 byte limit"}],!1;if(e!==""){let y,a=!0;try{y=JSON.parse(e)}catch{a=!1}if(a){let _=r;h(y,{instancePath:n,parentData:e,parentDataProperty:b,rootData:c,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var p=_===r;a=p}if(!a)return L.errors=[{instancePath:n,schemaPath:"#/contentSchema",keyword:"contentSchema",params:{},message:"must contain valid JSON matching contentSchema (or be empty)"}],!1}}else return L.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return L.errors=t,r===0}L.evaluated={dynamicProps:!1,dynamicItems:!1};function f(e,{instancePath:n="",parentData:w,parentDataProperty:b,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=f.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),!(typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)))return f.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(r===0&&typeof e=="number"&&isFinite(e)){if(e>2147483647||isNaN(e))return f.errors=[{instancePath:n,schemaPath:"#/maximum",keyword:"maximum",params:{comparison:"<=",limit:2147483647},message:"must be <= 2147483647"}],!1;if(e<-2147483648||isNaN(e))return f.errors=[{instancePath:n,schemaPath:"#/minimum",keyword:"minimum",params:{comparison:">=",limit:-2147483648},message:"must be >= -2147483648"}],!1}return f.errors=t,r===0}f.evaluated={dynamicProps:!1,dynamicItems:!1};var W={type:"integer",enum:[0,1],$id:"urn:lightnvr:contract:StreamProtocol"};function I(e,{instancePath:n="",parentData:w,parentDataProperty:b,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=I.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)?e===0||e===1?(I.errors=t,r===0):(I.errors=[{instancePath:n,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:W.enum},message:"must be equal to one of the allowed values"}],!1):(I.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1)}I.evaluated={dynamicProps:!1,dynamicItems:!1};function N(e,{instancePath:n="",parentData:w,parentDataProperty:b,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=N.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),!(typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)))return N.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(r===0&&typeof e=="number"&&isFinite(e)){if(e>365||isNaN(e))return N.errors=[{instancePath:n,schemaPath:"#/maximum",keyword:"maximum",params:{comparison:"<=",limit:365},message:"must be <= 365"}],!1;if(e<-1||isNaN(e))return N.errors=[{instancePath:n,schemaPath:"#/minimum",keyword:"minimum",params:{comparison:">=",limit:-1},message:"must be >= -1"}],!1}return N.errors=t,r===0}N.evaluated={dynamicProps:!1,dynamicItems:!1};function k(e,{instancePath:n="",parentData:w,parentDataProperty:b,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=k.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(Array.isArray(e)){if(e.length>168)return k.errors=[{instancePath:n,schemaPath:"#/maxItems",keyword:"maxItems",params:{limit:168},message:"must NOT have more than 168 items"}],!1;if(e.length<168)return k.errors=[{instancePath:n,schemaPath:"#/minItems",keyword:"minItems",params:{limit:168},message:"must NOT have fewer than 168 items"}],!1;{var p=!0;let y=e.length;for(let a=0;a511)return m.errors=[{instancePath:n+"/url",schemaPath:"#/properties/url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return m.errors=[{instancePath:n+"/url",schemaPath:"#/properties/url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=l===r}else var i=!0;if(i){if(e.enabled!==void 0){let s=r;if(typeof e.enabled!="boolean")return m.errors=[{instancePath:n+"/enabled",schemaPath:"#/properties/enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.streaming_enabled!==void 0){let s=r;if(typeof e.streaming_enabled!="boolean")return m.errors=[{instancePath:n+"/streaming_enabled",schemaPath:"#/properties/streaming_enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.playback_transport!==void 0){let s=r;F(e.playback_transport,{instancePath:n+"/playback_transport",parentData:e,parentDataProperty:"playback_transport",rootData:c,dynamicAnchors:d})||(t=t===null?F.errors:t.concat(F.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.eptz_config!==void 0){let s=r;L(e.eptz_config,{instancePath:n+"/eptz_config",parentData:e,parentDataProperty:"eptz_config",rootData:c,dynamicAnchors:d})||(t=t===null?L.errors:t.concat(L.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.width!==void 0){let s=r;f(e.width,{instancePath:n+"/width",parentData:e,parentDataProperty:"width",rootData:c,dynamicAnchors:d})||(t=t===null?f.errors:t.concat(f.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.height!==void 0){let s=r;f(e.height,{instancePath:n+"/height",parentData:e,parentDataProperty:"height",rootData:c,dynamicAnchors:d})||(t=t===null?f.errors:t.concat(f.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.fps!==void 0){let s=r;f(e.fps,{instancePath:n+"/fps",parentData:e,parentDataProperty:"fps",rootData:c,dynamicAnchors:d})||(t=t===null?f.errors:t.concat(f.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.codec!==void 0){let s=e.codec,l=r;if(r===l)if(typeof s=="string"){if(v(s)>15)return m.errors=[{instancePath:n+"/codec",schemaPath:"#/properties/codec/maxLength",keyword:"maxLength",params:{limit:15},message:"must NOT have more than 15 characters"}],!1}else return m.errors=[{instancePath:n+"/codec",schemaPath:"#/properties/codec/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=l===r}else var i=!0;if(i){if(e.priority!==void 0){let s=r;f(e.priority,{instancePath:n+"/priority",parentData:e,parentDataProperty:"priority",rootData:c,dynamicAnchors:d})||(t=t===null?f.errors:t.concat(f.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.record!==void 0){let s=r;if(typeof e.record!="boolean")return m.errors=[{instancePath:n+"/record",schemaPath:"#/properties/record/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.segment_duration!==void 0){let s=r;f(e.segment_duration,{instancePath:n+"/segment_duration",parentData:e,parentDataProperty:"segment_duration",rootData:c,dynamicAnchors:d})||(t=t===null?f.errors:t.concat(f.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.detection_based_recording!==void 0){let s=r;if(typeof e.detection_based_recording!="boolean")return m.errors=[{instancePath:n+"/detection_based_recording",schemaPath:"#/properties/detection_based_recording/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.detection_model!==void 0){let s=e.detection_model,l=r;if(r===l)if(typeof s=="string"){if(v(s)>511)return m.errors=[{instancePath:n+"/detection_model",schemaPath:"#/properties/detection_model/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return m.errors=[{instancePath:n+"/detection_model",schemaPath:"#/properties/detection_model/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=l===r}else var i=!0;if(i){if(e.detection_threshold!==void 0){let s=e.detection_threshold,l=r;if(!(typeof s=="number"&&!(s%1)&&!isNaN(s)&&isFinite(s)))return m.errors=[{instancePath:n+"/detection_threshold",schemaPath:"#/properties/detection_threshold/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;var i=l===r}else var i=!0;if(i){if(e.detection_interval!==void 0){let s=r;f(e.detection_interval,{instancePath:n+"/detection_interval",parentData:e,parentDataProperty:"detection_interval",rootData:c,dynamicAnchors:d})||(t=t===null?f.errors:t.concat(f.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.pre_detection_buffer!==void 0){let s=r;f(e.pre_detection_buffer,{instancePath:n+"/pre_detection_buffer",parentData:e,parentDataProperty:"pre_detection_buffer",rootData:c,dynamicAnchors:d})||(t=t===null?f.errors:t.concat(f.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.post_detection_buffer!==void 0){let s=r;f(e.post_detection_buffer,{instancePath:n+"/post_detection_buffer",parentData:e,parentDataProperty:"post_detection_buffer",rootData:c,dynamicAnchors:d})||(t=t===null?f.errors:t.concat(f.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.detection_object_filter!==void 0){let s=e.detection_object_filter,l=r;if(r===l)if(typeof s=="string"){if(v(s)>15)return m.errors=[{instancePath:n+"/detection_object_filter",schemaPath:"#/properties/detection_object_filter/maxLength",keyword:"maxLength",params:{limit:15},message:"must NOT have more than 15 characters"}],!1}else return m.errors=[{instancePath:n+"/detection_object_filter",schemaPath:"#/properties/detection_object_filter/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=l===r}else var i=!0;if(i){if(e.detection_object_filter_list!==void 0){let s=e.detection_object_filter_list,l=r;if(r===l)if(typeof s=="string"){if(v(s)>255)return m.errors=[{instancePath:n+"/detection_object_filter_list",schemaPath:"#/properties/detection_object_filter_list/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1}else return m.errors=[{instancePath:n+"/detection_object_filter_list",schemaPath:"#/properties/detection_object_filter_list/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=l===r}else var i=!0;if(i){if(e.protocol!==void 0){let s=r;I(e.protocol,{instancePath:n+"/protocol",parentData:e,parentDataProperty:"protocol",rootData:c,dynamicAnchors:d})||(t=t===null?I.errors:t.concat(I.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.record_audio!==void 0){let s=r;if(typeof e.record_audio!="boolean")return m.errors=[{instancePath:n+"/record_audio",schemaPath:"#/properties/record_audio/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.audio_voice_enhancement!==void 0){let s=r;if(typeof e.audio_voice_enhancement!="boolean")return m.errors=[{instancePath:n+"/audio_voice_enhancement",schemaPath:"#/properties/audio_voice_enhancement/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.isOnvif!==void 0){let s=r;if(typeof e.isOnvif!="boolean")return m.errors=[{instancePath:n+"/isOnvif",schemaPath:"#/properties/isOnvif/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.backchannel_enabled!==void 0){let s=r;if(typeof e.backchannel_enabled!="boolean")return m.errors=[{instancePath:n+"/backchannel_enabled",schemaPath:"#/properties/backchannel_enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.retention_days!==void 0){let s=r;N(e.retention_days,{instancePath:n+"/retention_days",parentData:e,parentDataProperty:"retention_days",rootData:c,dynamicAnchors:d})||(t=t===null?N.errors:t.concat(N.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.detection_retention_days!==void 0){let s=r;N(e.detection_retention_days,{instancePath:n+"/detection_retention_days",parentData:e,parentDataProperty:"detection_retention_days",rootData:c,dynamicAnchors:d})||(t=t===null?N.errors:t.concat(N.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.max_storage_mb!==void 0){let s=r;f(e.max_storage_mb,{instancePath:n+"/max_storage_mb",parentData:e,parentDataProperty:"max_storage_mb",rootData:c,dynamicAnchors:d})||(t=t===null?f.errors:t.concat(f.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.tier_critical_multiplier!==void 0){let s=e.tier_critical_multiplier,l=r;if(!(typeof s=="number"&&isFinite(s)))return m.errors=[{instancePath:n+"/tier_critical_multiplier",schemaPath:"#/properties/tier_critical_multiplier/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var i=l===r}else var i=!0;if(i){if(e.tier_important_multiplier!==void 0){let s=e.tier_important_multiplier,l=r;if(!(typeof s=="number"&&isFinite(s)))return m.errors=[{instancePath:n+"/tier_important_multiplier",schemaPath:"#/properties/tier_important_multiplier/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var i=l===r}else var i=!0;if(i){if(e.tier_ephemeral_multiplier!==void 0){let s=e.tier_ephemeral_multiplier,l=r;if(!(typeof s=="number"&&isFinite(s)))return m.errors=[{instancePath:n+"/tier_ephemeral_multiplier",schemaPath:"#/properties/tier_ephemeral_multiplier/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var i=l===r}else var i=!0;if(i){if(e.storage_priority!==void 0){let s=r;f(e.storage_priority,{instancePath:n+"/storage_priority",parentData:e,parentDataProperty:"storage_priority",rootData:c,dynamicAnchors:d})||(t=t===null?f.errors:t.concat(f.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.ptz_enabled!==void 0){let s=r;if(typeof e.ptz_enabled!="boolean")return m.errors=[{instancePath:n+"/ptz_enabled",schemaPath:"#/properties/ptz_enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.ptz_max_x!==void 0){let s=r;f(e.ptz_max_x,{instancePath:n+"/ptz_max_x",parentData:e,parentDataProperty:"ptz_max_x",rootData:c,dynamicAnchors:d})||(t=t===null?f.errors:t.concat(f.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.ptz_max_y!==void 0){let s=r;f(e.ptz_max_y,{instancePath:n+"/ptz_max_y",parentData:e,parentDataProperty:"ptz_max_y",rootData:c,dynamicAnchors:d})||(t=t===null?f.errors:t.concat(f.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.ptz_max_z!==void 0){let s=r;f(e.ptz_max_z,{instancePath:n+"/ptz_max_z",parentData:e,parentDataProperty:"ptz_max_z",rootData:c,dynamicAnchors:d})||(t=t===null?f.errors:t.concat(f.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.ptz_has_home!==void 0){let s=r;if(typeof e.ptz_has_home!="boolean")return m.errors=[{instancePath:n+"/ptz_has_home",schemaPath:"#/properties/ptz_has_home/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.onvif_username!==void 0){let s=e.onvif_username,l=r;if(r===l)if(typeof s=="string"){if(v(s)>63)return m.errors=[{instancePath:n+"/onvif_username",schemaPath:"#/properties/onvif_username/maxLength",keyword:"maxLength",params:{limit:63},message:"must NOT have more than 63 characters"}],!1}else return m.errors=[{instancePath:n+"/onvif_username",schemaPath:"#/properties/onvif_username/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=l===r}else var i=!0;if(i){if(e.onvif_password!==void 0){let s=e.onvif_password,l=r;if(r===l)if(typeof s=="string"){if(v(s)>63)return m.errors=[{instancePath:n+"/onvif_password",schemaPath:"#/properties/onvif_password/maxLength",keyword:"maxLength",params:{limit:63},message:"must NOT have more than 63 characters"}],!1}else return m.errors=[{instancePath:n+"/onvif_password",schemaPath:"#/properties/onvif_password/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=l===r}else var i=!0;if(i){if(e.onvif_profile!==void 0){let s=e.onvif_profile,l=r;if(r===l)if(typeof s=="string"){if(v(s)>63)return m.errors=[{instancePath:n+"/onvif_profile",schemaPath:"#/properties/onvif_profile/maxLength",keyword:"maxLength",params:{limit:63},message:"must NOT have more than 63 characters"}],!1}else return m.errors=[{instancePath:n+"/onvif_profile",schemaPath:"#/properties/onvif_profile/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=l===r}else var i=!0;if(i){if(e.onvif_port!==void 0){let s=r;f(e.onvif_port,{instancePath:n+"/onvif_port",parentData:e,parentDataProperty:"onvif_port",rootData:c,dynamicAnchors:d})||(t=t===null?f.errors:t.concat(f.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.record_on_schedule!==void 0){let s=r;if(typeof e.record_on_schedule!="boolean")return m.errors=[{instancePath:n+"/record_on_schedule",schemaPath:"#/properties/record_on_schedule/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.recording_schedule!==void 0){let s=r;k(e.recording_schedule,{instancePath:n+"/recording_schedule",parentData:e,parentDataProperty:"recording_schedule",rootData:c,dynamicAnchors:d})||(t=t===null?k.errors:t.concat(k.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.detection_record_on_schedule!==void 0){let s=r;if(typeof e.detection_record_on_schedule!="boolean")return m.errors=[{instancePath:n+"/detection_record_on_schedule",schemaPath:"#/properties/detection_record_on_schedule/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.detection_recording_schedule!==void 0){let s=r;k(e.detection_recording_schedule,{instancePath:n+"/detection_recording_schedule",parentData:e,parentDataProperty:"detection_recording_schedule",rootData:c,dynamicAnchors:d})||(t=t===null?k.errors:t.concat(k.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.tags!==void 0){let s=e.tags,l=r;if(r===l)if(typeof s=="string"){if(v(s)>255)return m.errors=[{instancePath:n+"/tags",schemaPath:"#/properties/tags/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1}else return m.errors=[{instancePath:n+"/tags",schemaPath:"#/properties/tags/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=l===r}else var i=!0;if(i){if(e.admin_url!==void 0){let s=e.admin_url,l=r;if(r===l)if(typeof s=="string"){if(v(s)>511)return m.errors=[{instancePath:n+"/admin_url",schemaPath:"#/properties/admin_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return m.errors=[{instancePath:n+"/admin_url",schemaPath:"#/properties/admin_url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=l===r}else var i=!0;if(i){if(e.privacy_mode!==void 0){let s=r;if(typeof e.privacy_mode!="boolean")return m.errors=[{instancePath:n+"/privacy_mode",schemaPath:"#/properties/privacy_mode/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.can_control_privacy!==void 0){let s=r;if(typeof e.can_control_privacy!="boolean")return m.errors=[{instancePath:n+"/can_control_privacy",schemaPath:"#/properties/can_control_privacy/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.motion_trigger_source!==void 0){let s=e.motion_trigger_source,l=r;if(r===l)if(typeof s=="string"){if(v(s)>255)return m.errors=[{instancePath:n+"/motion_trigger_source",schemaPath:"#/properties/motion_trigger_source/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1}else return m.errors=[{instancePath:n+"/motion_trigger_source",schemaPath:"#/properties/motion_trigger_source/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=l===r}else var i=!0;if(i){if(e.go2rtc_source_override!==void 0){let s=e.go2rtc_source_override,l=r;if(r===l)if(typeof s=="string"){if(v(s)>8191)return m.errors=[{instancePath:n+"/go2rtc_source_override",schemaPath:"#/properties/go2rtc_source_override/maxLength",keyword:"maxLength",params:{limit:8191},message:"must NOT have more than 8191 characters"}],!1}else return m.errors=[{instancePath:n+"/go2rtc_source_override",schemaPath:"#/properties/go2rtc_source_override/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=l===r}else var i=!0;if(i){if(e.sub_stream_url!==void 0){let s=e.sub_stream_url,l=r;if(r===l)if(typeof s=="string"){if(v(s)>511)return m.errors=[{instancePath:n+"/sub_stream_url",schemaPath:"#/properties/sub_stream_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return m.errors=[{instancePath:n+"/sub_stream_url",schemaPath:"#/properties/sub_stream_url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=l===r}else var i=!0;if(i){if(e.has_sub_stream!==void 0){let s=r;if(typeof e.has_sub_stream!="boolean")return m.errors=[{instancePath:n+"/has_sub_stream",schemaPath:"#/properties/has_sub_stream/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.detection_url!==void 0){let s=e.detection_url,l=r;if(r===l)if(typeof s=="string"){if(v(s)>511)return m.errors=[{instancePath:n+"/detection_url",schemaPath:"#/properties/detection_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return m.errors=[{instancePath:n+"/detection_url",schemaPath:"#/properties/detection_url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=l===r}else var i=!0;if(i){if(e.publish_url!==void 0){let s=e.publish_url,l=r;if(r===l)if(typeof s=="string"){if(v(s)>511)return m.errors=[{instancePath:n+"/publish_url",schemaPath:"#/properties/publish_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return m.errors=[{instancePath:n+"/publish_url",schemaPath:"#/properties/publish_url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=l===r}else var i=!0;if(i){if(e.status!==void 0){let s=r;T(e.status,{instancePath:n+"/status",parentData:e,parentDataProperty:"status",rootData:c,dynamicAnchors:d})||(t=t===null?T.errors:t.concat(T.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.error_message!==void 0){let s=e.error_message,l=r;if(r===l)if(typeof s=="string"){if(v(s)>255)return m.errors=[{instancePath:n+"/error_message",schemaPath:"#/properties/error_message/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1;if(v(s)<1)return m.errors=[{instancePath:n+"/error_message",schemaPath:"#/properties/error_message/minLength",keyword:"minLength",params:{limit:1},message:"must NOT have fewer than 1 characters"}],!1}else return m.errors=[{instancePath:n+"/error_message",schemaPath:"#/properties/error_message/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=l===r}else var i=!0;if(i)if(e.go2rtc_hls_available!==void 0){let s=r;if(typeof e.go2rtc_hls_available!="boolean")return m.errors=[{instancePath:n+"/go2rtc_hls_available",schemaPath:"#/properties/go2rtc_hls_available/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}else return m.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return m.errors=t,r===0}m.evaluated={props:{camera_uuid:!0,location_uuid:!0,name:!0,url:!0,enabled:!0,streaming_enabled:!0,playback_transport:!0,eptz_config:!0,width:!0,height:!0,fps:!0,codec:!0,priority:!0,record:!0,segment_duration:!0,detection_based_recording:!0,detection_model:!0,detection_threshold:!0,detection_interval:!0,pre_detection_buffer:!0,post_detection_buffer:!0,detection_object_filter:!0,detection_object_filter_list:!0,protocol:!0,record_audio:!0,audio_voice_enhancement:!0,isOnvif:!0,backchannel_enabled:!0,retention_days:!0,detection_retention_days:!0,max_storage_mb:!0,tier_critical_multiplier:!0,tier_important_multiplier:!0,tier_ephemeral_multiplier:!0,storage_priority:!0,ptz_enabled:!0,ptz_max_x:!0,ptz_max_y:!0,ptz_max_z:!0,ptz_has_home:!0,onvif_username:!0,onvif_password:!0,onvif_profile:!0,onvif_port:!0,record_on_schedule:!0,recording_schedule:!0,detection_record_on_schedule:!0,detection_recording_schedule:!0,tags:!0,admin_url:!0,privacy_mode:!0,can_control_privacy:!0,motion_trigger_source:!0,go2rtc_source_override:!0,sub_stream_url:!0,has_sub_stream:!0,detection_url:!0,publish_url:!0,status:!0,error_message:!0,go2rtc_hls_available:!0},dynamicProps:!1,dynamicItems:!1};var B=new RegExp("^(?![A-Za-z][A-Za-z0-9+.-]*://[^/?#]*@)","u");function O(e,{instancePath:n="",parentData:w,parentDataProperty:b,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=O.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(typeof e=="string"){if(v(e)>511)return O.errors=[{instancePath:n,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1;if(!B.test(e))return O.errors=[{instancePath:n,schemaPath:"#/pattern",keyword:"pattern",params:{pattern:"^(?![A-Za-z][A-Za-z0-9+.-]*://[^/?#]*@)"},message:'must match pattern "^(?![A-Za-z][A-Za-z0-9+.-]*://[^/?#]*@)"'}],!1}else return O.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return O.errors=t,r===0}O.evaluated={dynamicProps:!1,dynamicItems:!1};function j(e,{instancePath:n="",parentData:w,parentDataProperty:b,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=j.evaluated;o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0);let p=r;m(e,{instancePath:n,parentData:w,parentDataProperty:b,rootData:c,dynamicAnchors:d})||(t=t===null?m.errors:t.concat(m.errors),r=t.length);var y=p===r;if(y){let q=r,i=r,u=!0,s=r,l=r,P=!1,Y=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let g;if(e.isOnvif===void 0&&(g="isOnvif")){let x={};t===null?t=[x]:t.push(x),r++}else if(e.isOnvif!==void 0&&e.isOnvif!==!0){let x={};t===null?t=[x]:t.push(x),r++}}var _=Y===r;if(P=P||_,_){var a={};a.isOnvif=!0}let S=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let g;if(e.onvif_username===void 0&&(g="onvif_username")){let x={};t===null?t=[x]:t.push(x),r++}else if(e.onvif_username!==void 0){let x=e.onvif_username;if(typeof x=="string"&&v(x)<1){let A={};t===null?t=[A]:t.push(A),r++}}}var _=S===r;P=P||_,_&&a!==!0&&(a=a||{},a.onvif_username=!0);let C=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let g;if(e.onvif_password===void 0&&(g="onvif_password")){let x={};t===null?t=[x]:t.push(x),r++}else if(e.onvif_password!==void 0){let x=e.onvif_password;if(typeof x=="string"&&v(x)<1){let A={};t===null?t=[A]:t.push(A),r++}}}var _=C===r;if(P=P||_,_&&a!==!0&&(a=a||{},a.onvif_password=!0),P)r=l,t!==null&&(l?t.length=l:t=null);else{let g={};t===null?t=[g]:t.push(g),r++}var $=s===r;if(r=i,t!==null&&(i?t.length=i:t=null),$){let g=r;e&&typeof e=="object"&&!Array.isArray(e)&&e.url!==void 0&&(O(e.url,{instancePath:n+"/url",parentData:e,parentDataProperty:"url",rootData:c,dynamicAnchors:d})||(t=t===null?O.errors:t.concat(O.errors),r=t.length));var $=g===r;u=$,u&&a!==!0&&(a=a||{},a.url=!0)}if(!u){let g={instancePath:n,schemaPath:"#/allOf/1/if",keyword:"if",params:{failingKeyword:"then"},message:'must match "then" schema'};return t===null?t=[g]:t.push(g),r++,j.errors=t,!1}if(r===q)if(e&&typeof e=="object"&&!Array.isArray(e)){let g;if(e.url===void 0&&(g="url")||e.onvif_username===void 0&&(g="onvif_username")||e.onvif_password===void 0&&(g="onvif_password")||e.admin_url===void 0&&(g="admin_url")||e.go2rtc_source_override===void 0&&(g="go2rtc_source_override")||e.sub_stream_url===void 0&&(g="sub_stream_url")||e.detection_url===void 0&&(g="detection_url")||e.publish_url===void 0&&(g="publish_url"))return j.errors=[{instancePath:n,schemaPath:"#/allOf/1/required",keyword:"required",params:{missingProperty:g},message:"must have required property '"+g+"'"}],!1;if(a!==!0&&(a=a||{},a.can_control_privacy=!0),e.can_control_privacy!==void 0&&e.can_control_privacy!==!0)return j.errors=[{instancePath:n+"/can_control_privacy",schemaPath:"#/allOf/1/properties/can_control_privacy/const",keyword:"const",params:{allowedValue:!0},message:"must be equal to constant"}],!1}else return j.errors=[{instancePath:n,schemaPath:"#/allOf/1/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;var y=q===r;y&&a!==!0&&(a=a||{},a.camera_uuid=!0,a.location_uuid=!0,a.name=!0,a.url=!0,a.enabled=!0,a.streaming_enabled=!0,a.playback_transport=!0,a.eptz_config=!0,a.width=!0,a.height=!0,a.fps=!0,a.codec=!0,a.priority=!0,a.record=!0,a.segment_duration=!0,a.detection_based_recording=!0,a.detection_model=!0,a.detection_threshold=!0,a.detection_interval=!0,a.pre_detection_buffer=!0,a.post_detection_buffer=!0,a.detection_object_filter=!0,a.detection_object_filter_list=!0,a.protocol=!0,a.record_audio=!0,a.audio_voice_enhancement=!0,a.isOnvif=!0,a.backchannel_enabled=!0,a.retention_days=!0,a.detection_retention_days=!0,a.max_storage_mb=!0,a.tier_critical_multiplier=!0,a.tier_important_multiplier=!0,a.tier_ephemeral_multiplier=!0,a.storage_priority=!0,a.ptz_enabled=!0,a.ptz_max_x=!0,a.ptz_max_y=!0,a.ptz_max_z=!0,a.ptz_has_home=!0,a.onvif_username=!0,a.onvif_password=!0,a.onvif_profile=!0,a.onvif_port=!0,a.record_on_schedule=!0,a.recording_schedule=!0,a.detection_record_on_schedule=!0,a.detection_recording_schedule=!0,a.tags=!0,a.admin_url=!0,a.privacy_mode=!0,a.can_control_privacy=!0,a.motion_trigger_source=!0,a.go2rtc_source_override=!0,a.sub_stream_url=!0,a.has_sub_stream=!0,a.detection_url=!0,a.publish_url=!0,a.status=!0,a.error_message=!0,a.go2rtc_hls_available=!0)}return j.errors=t,o.props=a,r===0}j.evaluated={dynamicProps:!0,dynamicItems:!1};export{M as validateStreamDetailConfigurable}; diff --git a/web/js/api/generated/validators/StreamDetailLiveOnly.d.mts b/web/js/api/generated/validators/StreamDetailLiveOnly.d.mts new file mode 100644 index 000000000..023e77416 --- /dev/null +++ b/web/js/api/generated/validators/StreamDetailLiveOnly.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateStreamDetailLiveOnly } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/StreamDetailLiveOnly.mjs b/web/js/api/generated/validators/StreamDetailLiveOnly.mjs new file mode 100644 index 000000000..8acc2dccc --- /dev/null +++ b/web/js/api/generated/validators/StreamDetailLiveOnly.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var X=(e,s)=>()=>{try{return s||e((s={exports:{}}).exports,s),s.exports}catch(b){throw s=0,b}};var q=X(Y=>{"use strict";Object.defineProperty(Y,"__esModule",{value:!0});function V(e){let s=e.length,b=0,v=0,p;for(;v=55296&&p<=56319&&v36)return x.errors=[{instancePath:s,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:36},message:"must NOT have more than 36 characters"}],!1;if(!R.test(e))return x.errors=[{instancePath:s,schemaPath:"#/pattern",keyword:"pattern",params:{pattern:"^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$"},message:'must match pattern "^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$"'}],!1}else return x.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return x.errors=t,r===0}x.evaluated={dynamicProps:!1,dynamicItems:!1};function D(e,{instancePath:s="",parentData:b,parentDataProperty:v,rootData:p=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=D.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(typeof e=="string"){if(w(e)>255)return D.errors=[{instancePath:s,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1;if(w(e)<1)return D.errors=[{instancePath:s,schemaPath:"#/minLength",keyword:"minLength",params:{limit:1},message:"must NOT have fewer than 1 characters"}],!1;if(new TextEncoder().encode(e).byteLength>255)return D.errors=[{instancePath:s,schemaPath:"#/x-lightnvr-max-bytes",keyword:"x-lightnvr-max-bytes",params:{},message:"must fit the UTF-8 byte limit"}],!1}else return D.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return D.errors=t,r===0}D.evaluated={dynamicProps:!1,dynamicItems:!1};var C={type:"string",enum:["auto","webrtc_only","mse_only","hls_only","webrtc_then_mse","mse_then_hls"],$id:"urn:lightnvr:contract:PlaybackTransport"};function L(e,{instancePath:s="",parentData:b,parentDataProperty:v,rootData:p=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=L.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e!="string"?(L.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1):e==="auto"||e==="webrtc_only"||e==="mse_only"||e==="hls_only"||e==="webrtc_then_mse"||e==="mse_then_hls"?(L.errors=t,r===0):(L.errors=[{instancePath:s,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:C.enum},message:"must be equal to one of the allowed values"}],!1)}L.evaluated={dynamicProps:!1,dynamicItems:!1};function h(e,{instancePath:s="",parentData:b,parentDataProperty:v,rootData:p=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=h.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let y;if(e.version===void 0&&(y="version")||e.projection===void 0&&(y="projection")||e.mount===void 0&&(y="mount")||e.centerX===void 0&&(y="centerX")||e.centerY===void 0&&(y="centerY")||e.radius===void 0&&(y="radius")||e.fov===void 0&&(y="fov")||e.rotation===void 0&&(y="rotation")||e.defaultYaw===void 0&&(y="defaultYaw")||e.defaultTilt===void 0&&(y="defaultTilt")||e.defaultViewFov===void 0&&(y="defaultViewFov"))return h.errors=[{instancePath:s,schemaPath:"#/required",keyword:"required",params:{missingProperty:y},message:"must have required property '"+y+"'"}],!1;if(e.version!==void 0){let a=r;if(e.version!==1)return h.errors=[{instancePath:s+"/version",schemaPath:"#/properties/version/const",keyword:"const",params:{allowedValue:1},message:"must be equal to constant"}],!1;var d=a===r}else var d=!0;if(d){if(e.projection!==void 0){let a=r;if(e.projection!=="equidistant")return h.errors=[{instancePath:s+"/projection",schemaPath:"#/properties/projection/const",keyword:"const",params:{allowedValue:"equidistant"},message:"must be equal to constant"}],!1;var d=a===r}else var d=!0;if(d){if(e.mount!==void 0){let a=r;if(e.mount!=="ceiling")return h.errors=[{instancePath:s+"/mount",schemaPath:"#/properties/mount/const",keyword:"const",params:{allowedValue:"ceiling"},message:"must be equal to constant"}],!1;var d=a===r}else var d=!0;if(d){if(e.centerX!==void 0){let a=e.centerX,c=r;if(r===c)if(typeof a=="number"&&isFinite(a)){if(a>1||isNaN(a))return h.errors=[{instancePath:s+"/centerX",schemaPath:"#/properties/centerX/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(a<0||isNaN(a))return h.errors=[{instancePath:s+"/centerX",schemaPath:"#/properties/centerX/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1}else return h.errors=[{instancePath:s+"/centerX",schemaPath:"#/properties/centerX/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var d=c===r}else var d=!0;if(d){if(e.centerY!==void 0){let a=e.centerY,c=r;if(r===c)if(typeof a=="number"&&isFinite(a)){if(a>1||isNaN(a))return h.errors=[{instancePath:s+"/centerY",schemaPath:"#/properties/centerY/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(a<0||isNaN(a))return h.errors=[{instancePath:s+"/centerY",schemaPath:"#/properties/centerY/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1}else return h.errors=[{instancePath:s+"/centerY",schemaPath:"#/properties/centerY/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var d=c===r}else var d=!0;if(d){if(e.radius!==void 0){let a=e.radius,c=r;if(r===c)if(typeof a=="number"&&isFinite(a)){if(a>1||isNaN(a))return h.errors=[{instancePath:s+"/radius",schemaPath:"#/properties/radius/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(a<.05||isNaN(a))return h.errors=[{instancePath:s+"/radius",schemaPath:"#/properties/radius/minimum",keyword:"minimum",params:{comparison:">=",limit:.05},message:"must be >= 0.05"}],!1}else return h.errors=[{instancePath:s+"/radius",schemaPath:"#/properties/radius/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var d=c===r}else var d=!0;if(d){if(e.fov!==void 0){let a=e.fov,c=r;if(r===c)if(typeof a=="number"&&isFinite(a)){if(a>360||isNaN(a))return h.errors=[{instancePath:s+"/fov",schemaPath:"#/properties/fov/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(a<160||isNaN(a))return h.errors=[{instancePath:s+"/fov",schemaPath:"#/properties/fov/minimum",keyword:"minimum",params:{comparison:">=",limit:160},message:"must be >= 160"}],!1}else return h.errors=[{instancePath:s+"/fov",schemaPath:"#/properties/fov/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var d=c===r}else var d=!0;if(d){if(e.rotation!==void 0){let a=e.rotation,c=r;if(r===c)if(typeof a=="number"&&isFinite(a)){if(a>360||isNaN(a))return h.errors=[{instancePath:s+"/rotation",schemaPath:"#/properties/rotation/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(a<-360||isNaN(a))return h.errors=[{instancePath:s+"/rotation",schemaPath:"#/properties/rotation/minimum",keyword:"minimum",params:{comparison:">=",limit:-360},message:"must be >= -360"}],!1}else return h.errors=[{instancePath:s+"/rotation",schemaPath:"#/properties/rotation/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var d=c===r}else var d=!0;if(d){if(e.defaultYaw!==void 0){let a=e.defaultYaw,c=r;if(r===c)if(typeof a=="number"&&isFinite(a)){if(a>360||isNaN(a))return h.errors=[{instancePath:s+"/defaultYaw",schemaPath:"#/properties/defaultYaw/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(a<-360||isNaN(a))return h.errors=[{instancePath:s+"/defaultYaw",schemaPath:"#/properties/defaultYaw/minimum",keyword:"minimum",params:{comparison:">=",limit:-360},message:"must be >= -360"}],!1}else return h.errors=[{instancePath:s+"/defaultYaw",schemaPath:"#/properties/defaultYaw/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var d=c===r}else var d=!0;if(d){if(e.defaultTilt!==void 0){let a=e.defaultTilt,c=r;if(r===c)if(typeof a=="number"&&isFinite(a)){if(a>30||isNaN(a))return h.errors=[{instancePath:s+"/defaultTilt",schemaPath:"#/properties/defaultTilt/maximum",keyword:"maximum",params:{comparison:"<=",limit:30},message:"must be <= 30"}],!1;if(a<-90||isNaN(a))return h.errors=[{instancePath:s+"/defaultTilt",schemaPath:"#/properties/defaultTilt/minimum",keyword:"minimum",params:{comparison:">=",limit:-90},message:"must be >= -90"}],!1}else return h.errors=[{instancePath:s+"/defaultTilt",schemaPath:"#/properties/defaultTilt/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var d=c===r}else var d=!0;if(d)if(e.defaultViewFov!==void 0){let a=e.defaultViewFov,c=r;if(r===c)if(typeof a=="number"&&isFinite(a)){if(a>120||isNaN(a))return h.errors=[{instancePath:s+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/maximum",keyword:"maximum",params:{comparison:"<=",limit:120},message:"must be <= 120"}],!1;if(a<20||isNaN(a))return h.errors=[{instancePath:s+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/minimum",keyword:"minimum",params:{comparison:">=",limit:20},message:"must be >= 20"}],!1}else return h.errors=[{instancePath:s+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var d=c===r}else var d=!0}}}}}}}}}}else return h.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return h.errors=t,r===0}h.evaluated={props:{version:!0,projection:!0,mount:!0,centerX:!0,centerY:!0,radius:!0,fov:!0,rotation:!0,defaultYaw:!0,defaultTilt:!0,defaultViewFov:!0},dynamicProps:!1,dynamicItems:!1};function z(e,{instancePath:s="",parentData:b,parentDataProperty:v,rootData:p=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=z.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(typeof e=="string"){if(w(e)>1023)return z.errors=[{instancePath:s,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:1023},message:"must NOT have more than 1023 characters"}],!1;if(new TextEncoder().encode(e).byteLength>1023)return z.errors=[{instancePath:s,schemaPath:"#/x-lightnvr-max-bytes",keyword:"x-lightnvr-max-bytes",params:{},message:"must fit the UTF-8 byte limit"}],!1;if(e!==""){let y,a=!0;try{y=JSON.parse(e)}catch{a=!1}if(a){let c=r;h(y,{instancePath:s,parentData:e,parentDataProperty:v,rootData:p,dynamicAnchors:f})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var d=c===r;a=d}if(!a)return z.errors=[{instancePath:s,schemaPath:"#/contentSchema",keyword:"contentSchema",params:{},message:"must contain valid JSON matching contentSchema (or be empty)"}],!1}}else return z.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return z.errors=t,r===0}z.evaluated={dynamicProps:!1,dynamicItems:!1};function _(e,{instancePath:s="",parentData:b,parentDataProperty:v,rootData:p=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=_.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),!(typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)))return _.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(r===0&&typeof e=="number"&&isFinite(e)){if(e>2147483647||isNaN(e))return _.errors=[{instancePath:s,schemaPath:"#/maximum",keyword:"maximum",params:{comparison:"<=",limit:2147483647},message:"must be <= 2147483647"}],!1;if(e<-2147483648||isNaN(e))return _.errors=[{instancePath:s,schemaPath:"#/minimum",keyword:"minimum",params:{comparison:">=",limit:-2147483648},message:"must be >= -2147483648"}],!1}return _.errors=t,r===0}_.evaluated={dynamicProps:!1,dynamicItems:!1};var W={type:"integer",enum:[0,1],$id:"urn:lightnvr:contract:StreamProtocol"};function $(e,{instancePath:s="",parentData:b,parentDataProperty:v,rootData:p=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=$.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)?e===0||e===1?($.errors=t,r===0):($.errors=[{instancePath:s,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:W.enum},message:"must be equal to one of the allowed values"}],!1):($.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1)}$.evaluated={dynamicProps:!1,dynamicItems:!1};function k(e,{instancePath:s="",parentData:b,parentDataProperty:v,rootData:p=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=k.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),!(typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)))return k.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(r===0&&typeof e=="number"&&isFinite(e)){if(e>365||isNaN(e))return k.errors=[{instancePath:s,schemaPath:"#/maximum",keyword:"maximum",params:{comparison:"<=",limit:365},message:"must be <= 365"}],!1;if(e<-1||isNaN(e))return k.errors=[{instancePath:s,schemaPath:"#/minimum",keyword:"minimum",params:{comparison:">=",limit:-1},message:"must be >= -1"}],!1}return k.errors=t,r===0}k.evaluated={dynamicProps:!1,dynamicItems:!1};function P(e,{instancePath:s="",parentData:b,parentDataProperty:v,rootData:p=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=P.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(Array.isArray(e)){if(e.length>168)return P.errors=[{instancePath:s,schemaPath:"#/maxItems",keyword:"maxItems",params:{limit:168},message:"must NOT have more than 168 items"}],!1;if(e.length<168)return P.errors=[{instancePath:s,schemaPath:"#/minItems",keyword:"minItems",params:{limit:168},message:"must NOT have fewer than 168 items"}],!1;{var d=!0;let y=e.length;for(let a=0;a511)return l.errors=[{instancePath:s+"/url",schemaPath:"#/properties/url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return l.errors=[{instancePath:s+"/url",schemaPath:"#/properties/url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=u===r}else var n=!0;if(n){if(e.enabled!==void 0){let i=r;if(typeof e.enabled!="boolean")return l.errors=[{instancePath:s+"/enabled",schemaPath:"#/properties/enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.streaming_enabled!==void 0){let i=r;if(typeof e.streaming_enabled!="boolean")return l.errors=[{instancePath:s+"/streaming_enabled",schemaPath:"#/properties/streaming_enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.playback_transport!==void 0){let i=r;L(e.playback_transport,{instancePath:s+"/playback_transport",parentData:e,parentDataProperty:"playback_transport",rootData:p,dynamicAnchors:f})||(t=t===null?L.errors:t.concat(L.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.eptz_config!==void 0){let i=r;z(e.eptz_config,{instancePath:s+"/eptz_config",parentData:e,parentDataProperty:"eptz_config",rootData:p,dynamicAnchors:f})||(t=t===null?z.errors:t.concat(z.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.width!==void 0){let i=r;_(e.width,{instancePath:s+"/width",parentData:e,parentDataProperty:"width",rootData:p,dynamicAnchors:f})||(t=t===null?_.errors:t.concat(_.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.height!==void 0){let i=r;_(e.height,{instancePath:s+"/height",parentData:e,parentDataProperty:"height",rootData:p,dynamicAnchors:f})||(t=t===null?_.errors:t.concat(_.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.fps!==void 0){let i=r;_(e.fps,{instancePath:s+"/fps",parentData:e,parentDataProperty:"fps",rootData:p,dynamicAnchors:f})||(t=t===null?_.errors:t.concat(_.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.codec!==void 0){let i=e.codec,u=r;if(r===u)if(typeof i=="string"){if(w(i)>15)return l.errors=[{instancePath:s+"/codec",schemaPath:"#/properties/codec/maxLength",keyword:"maxLength",params:{limit:15},message:"must NOT have more than 15 characters"}],!1}else return l.errors=[{instancePath:s+"/codec",schemaPath:"#/properties/codec/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=u===r}else var n=!0;if(n){if(e.priority!==void 0){let i=r;_(e.priority,{instancePath:s+"/priority",parentData:e,parentDataProperty:"priority",rootData:p,dynamicAnchors:f})||(t=t===null?_.errors:t.concat(_.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.record!==void 0){let i=r;if(typeof e.record!="boolean")return l.errors=[{instancePath:s+"/record",schemaPath:"#/properties/record/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.segment_duration!==void 0){let i=r;_(e.segment_duration,{instancePath:s+"/segment_duration",parentData:e,parentDataProperty:"segment_duration",rootData:p,dynamicAnchors:f})||(t=t===null?_.errors:t.concat(_.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.detection_based_recording!==void 0){let i=r;if(typeof e.detection_based_recording!="boolean")return l.errors=[{instancePath:s+"/detection_based_recording",schemaPath:"#/properties/detection_based_recording/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.detection_model!==void 0){let i=e.detection_model,u=r;if(r===u)if(typeof i=="string"){if(w(i)>511)return l.errors=[{instancePath:s+"/detection_model",schemaPath:"#/properties/detection_model/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return l.errors=[{instancePath:s+"/detection_model",schemaPath:"#/properties/detection_model/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=u===r}else var n=!0;if(n){if(e.detection_threshold!==void 0){let i=e.detection_threshold,u=r;if(!(typeof i=="number"&&!(i%1)&&!isNaN(i)&&isFinite(i)))return l.errors=[{instancePath:s+"/detection_threshold",schemaPath:"#/properties/detection_threshold/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;var n=u===r}else var n=!0;if(n){if(e.detection_interval!==void 0){let i=r;_(e.detection_interval,{instancePath:s+"/detection_interval",parentData:e,parentDataProperty:"detection_interval",rootData:p,dynamicAnchors:f})||(t=t===null?_.errors:t.concat(_.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.pre_detection_buffer!==void 0){let i=r;_(e.pre_detection_buffer,{instancePath:s+"/pre_detection_buffer",parentData:e,parentDataProperty:"pre_detection_buffer",rootData:p,dynamicAnchors:f})||(t=t===null?_.errors:t.concat(_.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.post_detection_buffer!==void 0){let i=r;_(e.post_detection_buffer,{instancePath:s+"/post_detection_buffer",parentData:e,parentDataProperty:"post_detection_buffer",rootData:p,dynamicAnchors:f})||(t=t===null?_.errors:t.concat(_.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.detection_object_filter!==void 0){let i=e.detection_object_filter,u=r;if(r===u)if(typeof i=="string"){if(w(i)>15)return l.errors=[{instancePath:s+"/detection_object_filter",schemaPath:"#/properties/detection_object_filter/maxLength",keyword:"maxLength",params:{limit:15},message:"must NOT have more than 15 characters"}],!1}else return l.errors=[{instancePath:s+"/detection_object_filter",schemaPath:"#/properties/detection_object_filter/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=u===r}else var n=!0;if(n){if(e.detection_object_filter_list!==void 0){let i=e.detection_object_filter_list,u=r;if(r===u)if(typeof i=="string"){if(w(i)>255)return l.errors=[{instancePath:s+"/detection_object_filter_list",schemaPath:"#/properties/detection_object_filter_list/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1}else return l.errors=[{instancePath:s+"/detection_object_filter_list",schemaPath:"#/properties/detection_object_filter_list/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=u===r}else var n=!0;if(n){if(e.protocol!==void 0){let i=r;$(e.protocol,{instancePath:s+"/protocol",parentData:e,parentDataProperty:"protocol",rootData:p,dynamicAnchors:f})||(t=t===null?$.errors:t.concat($.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.record_audio!==void 0){let i=r;if(typeof e.record_audio!="boolean")return l.errors=[{instancePath:s+"/record_audio",schemaPath:"#/properties/record_audio/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.audio_voice_enhancement!==void 0){let i=r;if(typeof e.audio_voice_enhancement!="boolean")return l.errors=[{instancePath:s+"/audio_voice_enhancement",schemaPath:"#/properties/audio_voice_enhancement/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.isOnvif!==void 0){let i=r;if(typeof e.isOnvif!="boolean")return l.errors=[{instancePath:s+"/isOnvif",schemaPath:"#/properties/isOnvif/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.backchannel_enabled!==void 0){let i=r;if(typeof e.backchannel_enabled!="boolean")return l.errors=[{instancePath:s+"/backchannel_enabled",schemaPath:"#/properties/backchannel_enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.retention_days!==void 0){let i=r;k(e.retention_days,{instancePath:s+"/retention_days",parentData:e,parentDataProperty:"retention_days",rootData:p,dynamicAnchors:f})||(t=t===null?k.errors:t.concat(k.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.detection_retention_days!==void 0){let i=r;k(e.detection_retention_days,{instancePath:s+"/detection_retention_days",parentData:e,parentDataProperty:"detection_retention_days",rootData:p,dynamicAnchors:f})||(t=t===null?k.errors:t.concat(k.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.max_storage_mb!==void 0){let i=r;_(e.max_storage_mb,{instancePath:s+"/max_storage_mb",parentData:e,parentDataProperty:"max_storage_mb",rootData:p,dynamicAnchors:f})||(t=t===null?_.errors:t.concat(_.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.tier_critical_multiplier!==void 0){let i=e.tier_critical_multiplier,u=r;if(!(typeof i=="number"&&isFinite(i)))return l.errors=[{instancePath:s+"/tier_critical_multiplier",schemaPath:"#/properties/tier_critical_multiplier/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var n=u===r}else var n=!0;if(n){if(e.tier_important_multiplier!==void 0){let i=e.tier_important_multiplier,u=r;if(!(typeof i=="number"&&isFinite(i)))return l.errors=[{instancePath:s+"/tier_important_multiplier",schemaPath:"#/properties/tier_important_multiplier/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var n=u===r}else var n=!0;if(n){if(e.tier_ephemeral_multiplier!==void 0){let i=e.tier_ephemeral_multiplier,u=r;if(!(typeof i=="number"&&isFinite(i)))return l.errors=[{instancePath:s+"/tier_ephemeral_multiplier",schemaPath:"#/properties/tier_ephemeral_multiplier/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var n=u===r}else var n=!0;if(n){if(e.storage_priority!==void 0){let i=r;_(e.storage_priority,{instancePath:s+"/storage_priority",parentData:e,parentDataProperty:"storage_priority",rootData:p,dynamicAnchors:f})||(t=t===null?_.errors:t.concat(_.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.ptz_enabled!==void 0){let i=r;if(typeof e.ptz_enabled!="boolean")return l.errors=[{instancePath:s+"/ptz_enabled",schemaPath:"#/properties/ptz_enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.ptz_max_x!==void 0){let i=r;_(e.ptz_max_x,{instancePath:s+"/ptz_max_x",parentData:e,parentDataProperty:"ptz_max_x",rootData:p,dynamicAnchors:f})||(t=t===null?_.errors:t.concat(_.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.ptz_max_y!==void 0){let i=r;_(e.ptz_max_y,{instancePath:s+"/ptz_max_y",parentData:e,parentDataProperty:"ptz_max_y",rootData:p,dynamicAnchors:f})||(t=t===null?_.errors:t.concat(_.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.ptz_max_z!==void 0){let i=r;_(e.ptz_max_z,{instancePath:s+"/ptz_max_z",parentData:e,parentDataProperty:"ptz_max_z",rootData:p,dynamicAnchors:f})||(t=t===null?_.errors:t.concat(_.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.ptz_has_home!==void 0){let i=r;if(typeof e.ptz_has_home!="boolean")return l.errors=[{instancePath:s+"/ptz_has_home",schemaPath:"#/properties/ptz_has_home/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.onvif_username!==void 0){let i=e.onvif_username,u=r;if(r===u)if(typeof i=="string"){if(w(i)>63)return l.errors=[{instancePath:s+"/onvif_username",schemaPath:"#/properties/onvif_username/maxLength",keyword:"maxLength",params:{limit:63},message:"must NOT have more than 63 characters"}],!1}else return l.errors=[{instancePath:s+"/onvif_username",schemaPath:"#/properties/onvif_username/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=u===r}else var n=!0;if(n){if(e.onvif_password!==void 0){let i=e.onvif_password,u=r;if(r===u)if(typeof i=="string"){if(w(i)>63)return l.errors=[{instancePath:s+"/onvif_password",schemaPath:"#/properties/onvif_password/maxLength",keyword:"maxLength",params:{limit:63},message:"must NOT have more than 63 characters"}],!1}else return l.errors=[{instancePath:s+"/onvif_password",schemaPath:"#/properties/onvif_password/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=u===r}else var n=!0;if(n){if(e.onvif_profile!==void 0){let i=e.onvif_profile,u=r;if(r===u)if(typeof i=="string"){if(w(i)>63)return l.errors=[{instancePath:s+"/onvif_profile",schemaPath:"#/properties/onvif_profile/maxLength",keyword:"maxLength",params:{limit:63},message:"must NOT have more than 63 characters"}],!1}else return l.errors=[{instancePath:s+"/onvif_profile",schemaPath:"#/properties/onvif_profile/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=u===r}else var n=!0;if(n){if(e.onvif_port!==void 0){let i=r;_(e.onvif_port,{instancePath:s+"/onvif_port",parentData:e,parentDataProperty:"onvif_port",rootData:p,dynamicAnchors:f})||(t=t===null?_.errors:t.concat(_.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.record_on_schedule!==void 0){let i=r;if(typeof e.record_on_schedule!="boolean")return l.errors=[{instancePath:s+"/record_on_schedule",schemaPath:"#/properties/record_on_schedule/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.recording_schedule!==void 0){let i=r;P(e.recording_schedule,{instancePath:s+"/recording_schedule",parentData:e,parentDataProperty:"recording_schedule",rootData:p,dynamicAnchors:f})||(t=t===null?P.errors:t.concat(P.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.detection_record_on_schedule!==void 0){let i=r;if(typeof e.detection_record_on_schedule!="boolean")return l.errors=[{instancePath:s+"/detection_record_on_schedule",schemaPath:"#/properties/detection_record_on_schedule/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.detection_recording_schedule!==void 0){let i=r;P(e.detection_recording_schedule,{instancePath:s+"/detection_recording_schedule",parentData:e,parentDataProperty:"detection_recording_schedule",rootData:p,dynamicAnchors:f})||(t=t===null?P.errors:t.concat(P.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.tags!==void 0){let i=e.tags,u=r;if(r===u)if(typeof i=="string"){if(w(i)>255)return l.errors=[{instancePath:s+"/tags",schemaPath:"#/properties/tags/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1}else return l.errors=[{instancePath:s+"/tags",schemaPath:"#/properties/tags/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=u===r}else var n=!0;if(n){if(e.admin_url!==void 0){let i=e.admin_url,u=r;if(r===u)if(typeof i=="string"){if(w(i)>511)return l.errors=[{instancePath:s+"/admin_url",schemaPath:"#/properties/admin_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return l.errors=[{instancePath:s+"/admin_url",schemaPath:"#/properties/admin_url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=u===r}else var n=!0;if(n){if(e.privacy_mode!==void 0){let i=r;if(typeof e.privacy_mode!="boolean")return l.errors=[{instancePath:s+"/privacy_mode",schemaPath:"#/properties/privacy_mode/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.can_control_privacy!==void 0){let i=r;if(typeof e.can_control_privacy!="boolean")return l.errors=[{instancePath:s+"/can_control_privacy",schemaPath:"#/properties/can_control_privacy/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.motion_trigger_source!==void 0){let i=e.motion_trigger_source,u=r;if(r===u)if(typeof i=="string"){if(w(i)>255)return l.errors=[{instancePath:s+"/motion_trigger_source",schemaPath:"#/properties/motion_trigger_source/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1}else return l.errors=[{instancePath:s+"/motion_trigger_source",schemaPath:"#/properties/motion_trigger_source/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=u===r}else var n=!0;if(n){if(e.go2rtc_source_override!==void 0){let i=e.go2rtc_source_override,u=r;if(r===u)if(typeof i=="string"){if(w(i)>8191)return l.errors=[{instancePath:s+"/go2rtc_source_override",schemaPath:"#/properties/go2rtc_source_override/maxLength",keyword:"maxLength",params:{limit:8191},message:"must NOT have more than 8191 characters"}],!1}else return l.errors=[{instancePath:s+"/go2rtc_source_override",schemaPath:"#/properties/go2rtc_source_override/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=u===r}else var n=!0;if(n){if(e.sub_stream_url!==void 0){let i=e.sub_stream_url,u=r;if(r===u)if(typeof i=="string"){if(w(i)>511)return l.errors=[{instancePath:s+"/sub_stream_url",schemaPath:"#/properties/sub_stream_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return l.errors=[{instancePath:s+"/sub_stream_url",schemaPath:"#/properties/sub_stream_url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=u===r}else var n=!0;if(n){if(e.has_sub_stream!==void 0){let i=r;if(typeof e.has_sub_stream!="boolean")return l.errors=[{instancePath:s+"/has_sub_stream",schemaPath:"#/properties/has_sub_stream/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.detection_url!==void 0){let i=e.detection_url,u=r;if(r===u)if(typeof i=="string"){if(w(i)>511)return l.errors=[{instancePath:s+"/detection_url",schemaPath:"#/properties/detection_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return l.errors=[{instancePath:s+"/detection_url",schemaPath:"#/properties/detection_url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=u===r}else var n=!0;if(n){if(e.publish_url!==void 0){let i=e.publish_url,u=r;if(r===u)if(typeof i=="string"){if(w(i)>511)return l.errors=[{instancePath:s+"/publish_url",schemaPath:"#/properties/publish_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return l.errors=[{instancePath:s+"/publish_url",schemaPath:"#/properties/publish_url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=u===r}else var n=!0;if(n){if(e.status!==void 0){let i=r;I(e.status,{instancePath:s+"/status",parentData:e,parentDataProperty:"status",rootData:p,dynamicAnchors:f})||(t=t===null?I.errors:t.concat(I.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.error_message!==void 0){let i=e.error_message,u=r;if(r===u)if(typeof i=="string"){if(w(i)>255)return l.errors=[{instancePath:s+"/error_message",schemaPath:"#/properties/error_message/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1;if(w(i)<1)return l.errors=[{instancePath:s+"/error_message",schemaPath:"#/properties/error_message/minLength",keyword:"minLength",params:{limit:1},message:"must NOT have fewer than 1 characters"}],!1}else return l.errors=[{instancePath:s+"/error_message",schemaPath:"#/properties/error_message/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=u===r}else var n=!0;if(n)if(e.go2rtc_hls_available!==void 0){let i=r;if(typeof e.go2rtc_hls_available!="boolean")return l.errors=[{instancePath:s+"/go2rtc_hls_available",schemaPath:"#/properties/go2rtc_hls_available/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}else return l.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return l.errors=t,r===0}l.evaluated={props:{camera_uuid:!0,location_uuid:!0,name:!0,url:!0,enabled:!0,streaming_enabled:!0,playback_transport:!0,eptz_config:!0,width:!0,height:!0,fps:!0,codec:!0,priority:!0,record:!0,segment_duration:!0,detection_based_recording:!0,detection_model:!0,detection_threshold:!0,detection_interval:!0,pre_detection_buffer:!0,post_detection_buffer:!0,detection_object_filter:!0,detection_object_filter_list:!0,protocol:!0,record_audio:!0,audio_voice_enhancement:!0,isOnvif:!0,backchannel_enabled:!0,retention_days:!0,detection_retention_days:!0,max_storage_mb:!0,tier_critical_multiplier:!0,tier_important_multiplier:!0,tier_ephemeral_multiplier:!0,storage_priority:!0,ptz_enabled:!0,ptz_max_x:!0,ptz_max_y:!0,ptz_max_z:!0,ptz_has_home:!0,onvif_username:!0,onvif_password:!0,onvif_profile:!0,onvif_port:!0,record_on_schedule:!0,recording_schedule:!0,detection_record_on_schedule:!0,detection_recording_schedule:!0,tags:!0,admin_url:!0,privacy_mode:!0,can_control_privacy:!0,motion_trigger_source:!0,go2rtc_source_override:!0,sub_stream_url:!0,has_sub_stream:!0,detection_url:!0,publish_url:!0,status:!0,error_message:!0,go2rtc_hls_available:!0},dynamicProps:!1,dynamicItems:!1};var K=new RegExp("^(?![A-Za-z][A-Za-z0-9+.-]*://[^/?#]*@)","u");function N(e,{instancePath:s="",parentData:b,parentDataProperty:v,rootData:p=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=N.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(typeof e=="string"){if(w(e)>511)return N.errors=[{instancePath:s,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1;if(!K.test(e))return N.errors=[{instancePath:s,schemaPath:"#/pattern",keyword:"pattern",params:{pattern:"^(?![A-Za-z][A-Za-z0-9+.-]*://[^/?#]*@)"},message:'must match pattern "^(?![A-Za-z][A-Za-z0-9+.-]*://[^/?#]*@)"'}],!1}else return N.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return N.errors=t,r===0}N.evaluated={dynamicProps:!1,dynamicItems:!1};var H=new RegExp("[?&;][^=&#]*([Pp][Aa][Ss][Ss]|[Pp][Ww][Dd]|[Tt][Oo][Kk][Ee][Nn]|[Ss][Ee][Cc][Rr][Ee][Tt]|[Aa][Pp][Ii]_?[Kk][Ee][Yy])[^=&#]*=[^&#]","u");function O(e,{instancePath:s="",parentData:b,parentDataProperty:v,rootData:p=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=O.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e!="string")return O.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;let d=r,y=r;if(typeof e=="string"&&!H.test(e)){let c={};t===null?t=[c]:t.push(c),r++}var a=y===r;return a?(O.errors=[{instancePath:s,schemaPath:"#/not",keyword:"not",params:{},message:"must NOT be valid"}],!1):(r=d,t!==null&&(d?t.length=d:t=null),O.errors=t,r===0)}O.evaluated={dynamicProps:!1,dynamicItems:!1};function T(e,{instancePath:s="",parentData:b,parentDataProperty:v,rootData:p=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=T.evaluated;o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0);let d=r;N(e,{instancePath:s,parentData:b,parentDataProperty:v,rootData:p,dynamicAnchors:f})||(t=t===null?N.errors:t.concat(N.errors),r=t.length);var y=d===r;if(y){let a=r;O(e,{instancePath:s,parentData:b,parentDataProperty:v,rootData:p,dynamicAnchors:f})||(t=t===null?O.errors:t.concat(O.errors),r=t.length);var y=a===r}return T.errors=t,r===0}T.evaluated={dynamicProps:!1,dynamicItems:!1};function g(e,{instancePath:s="",parentData:b,parentDataProperty:v,rootData:p=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=g.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e!="string"?(g.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1):e!==""?(g.errors=[{instancePath:s,schemaPath:"#/const",keyword:"const",params:{allowedValue:""},message:"must be equal to constant"}],!1):(g.errors=t,r===0)}g.evaluated={dynamicProps:!1,dynamicItems:!1};function F(e,{instancePath:s="",parentData:b,parentDataProperty:v,rootData:p=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=F.evaluated;o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0);let d=r;l(e,{instancePath:s,parentData:b,parentDataProperty:v,rootData:p,dynamicAnchors:f})||(t=t===null?l.errors:t.concat(l.errors),r=t.length);var y=d===r;if(y){let j=r,E=r,n=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let i;if(e.detection_api_url===void 0&&(i="detection_api_url")){let u={};t===null?t=[u]:t.push(u),r++}}var a=n===r;if(a)return F.errors=[{instancePath:s,schemaPath:"#/allOf/1/not",keyword:"not",params:{},message:"must NOT be valid"}],!1;if(r=E,t!==null&&(E?t.length=E:t=null),r===j)if(e&&typeof e=="object"&&!Array.isArray(e)){if(e.can_control_privacy!==void 0){let i=r;if(e.can_control_privacy!==!1)return F.errors=[{instancePath:s+"/can_control_privacy",schemaPath:"#/allOf/1/properties/can_control_privacy/const",keyword:"const",params:{allowedValue:!1},message:"must be equal to constant"}],!1;var c=i===r}else var c=!0;if(c){if(e.url!==void 0){let i=r;T(e.url,{instancePath:s+"/url",parentData:e,parentDataProperty:"url",rootData:p,dynamicAnchors:f})||(t=t===null?T.errors:t.concat(T.errors),r=t.length);var c=i===r}else var c=!0;if(c){if(e.onvif_username!==void 0){let i=r;g(e.onvif_username,{instancePath:s+"/onvif_username",parentData:e,parentDataProperty:"onvif_username",rootData:p,dynamicAnchors:f})||(t=t===null?g.errors:t.concat(g.errors),r=t.length);var c=i===r}else var c=!0;if(c){if(e.onvif_password!==void 0){let i=r;g(e.onvif_password,{instancePath:s+"/onvif_password",parentData:e,parentDataProperty:"onvif_password",rootData:p,dynamicAnchors:f})||(t=t===null?g.errors:t.concat(g.errors),r=t.length);var c=i===r}else var c=!0;if(c){if(e.admin_url!==void 0){let i=r;g(e.admin_url,{instancePath:s+"/admin_url",parentData:e,parentDataProperty:"admin_url",rootData:p,dynamicAnchors:f})||(t=t===null?g.errors:t.concat(g.errors),r=t.length);var c=i===r}else var c=!0;if(c){if(e.go2rtc_source_override!==void 0){let i=r;g(e.go2rtc_source_override,{instancePath:s+"/go2rtc_source_override",parentData:e,parentDataProperty:"go2rtc_source_override",rootData:p,dynamicAnchors:f})||(t=t===null?g.errors:t.concat(g.errors),r=t.length);var c=i===r}else var c=!0;if(c){if(e.sub_stream_url!==void 0){let i=r;g(e.sub_stream_url,{instancePath:s+"/sub_stream_url",parentData:e,parentDataProperty:"sub_stream_url",rootData:p,dynamicAnchors:f})||(t=t===null?g.errors:t.concat(g.errors),r=t.length);var c=i===r}else var c=!0;if(c){if(e.detection_url!==void 0){let i=r;g(e.detection_url,{instancePath:s+"/detection_url",parentData:e,parentDataProperty:"detection_url",rootData:p,dynamicAnchors:f})||(t=t===null?g.errors:t.concat(g.errors),r=t.length);var c=i===r}else var c=!0;if(c)if(e.publish_url!==void 0){let i=r;g(e.publish_url,{instancePath:s+"/publish_url",parentData:e,parentDataProperty:"publish_url",rootData:p,dynamicAnchors:f})||(t=t===null?g.errors:t.concat(g.errors),r=t.length);var c=i===r}else var c=!0}}}}}}}}else return F.errors=[{instancePath:s,schemaPath:"#/allOf/1/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;var y=j===r}return F.errors=t,r===0}F.evaluated={props:{can_control_privacy:!0,url:!0,onvif_username:!0,onvif_password:!0,admin_url:!0,go2rtc_source_override:!0,sub_stream_url:!0,detection_url:!0,publish_url:!0,camera_uuid:!0,location_uuid:!0,name:!0,enabled:!0,streaming_enabled:!0,playback_transport:!0,eptz_config:!0,width:!0,height:!0,fps:!0,codec:!0,priority:!0,record:!0,segment_duration:!0,detection_based_recording:!0,detection_model:!0,detection_threshold:!0,detection_interval:!0,pre_detection_buffer:!0,post_detection_buffer:!0,detection_object_filter:!0,detection_object_filter_list:!0,protocol:!0,record_audio:!0,audio_voice_enhancement:!0,isOnvif:!0,backchannel_enabled:!0,retention_days:!0,detection_retention_days:!0,max_storage_mb:!0,tier_critical_multiplier:!0,tier_important_multiplier:!0,tier_ephemeral_multiplier:!0,storage_priority:!0,ptz_enabled:!0,ptz_max_x:!0,ptz_max_y:!0,ptz_max_z:!0,ptz_has_home:!0,onvif_profile:!0,onvif_port:!0,record_on_schedule:!0,recording_schedule:!0,detection_record_on_schedule:!0,detection_recording_schedule:!0,tags:!0,privacy_mode:!0,motion_trigger_source:!0,has_sub_stream:!0,status:!0,error_message:!0,go2rtc_hls_available:!0},dynamicProps:!1,dynamicItems:!1};export{M as validateStreamDetailLiveOnly}; diff --git a/web/js/api/generated/validators/StreamFullResponse.d.mts b/web/js/api/generated/validators/StreamFullResponse.d.mts new file mode 100644 index 000000000..379209903 --- /dev/null +++ b/web/js/api/generated/validators/StreamFullResponse.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateStreamFullResponse } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/StreamFullResponse.mjs b/web/js/api/generated/validators/StreamFullResponse.mjs new file mode 100644 index 000000000..104d33396 --- /dev/null +++ b/web/js/api/generated/validators/StreamFullResponse.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var H=(e,n)=>()=>{try{return n||e((n={exports:{}}).exports,n),n.exports}catch(b){throw n=0,b}};var K=H(W=>{"use strict";Object.defineProperty(W,"__esModule",{value:!0});function Z(e){let n=e.length,b=0,g=0,c;for(;g=55296&&c<=56319&&g36)return N.errors=[{instancePath:n,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:36},message:"must NOT have more than 36 characters"}],!1;if(!J.test(e))return N.errors=[{instancePath:n,schemaPath:"#/pattern",keyword:"pattern",params:{pattern:"^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$"},message:'must match pattern "^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$"'}],!1}else return N.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return N.errors=t,r===0}N.evaluated={dynamicProps:!1,dynamicItems:!1};function I(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=I.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(typeof e=="string"){if(x(e)>255)return I.errors=[{instancePath:n,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1;if(x(e)<1)return I.errors=[{instancePath:n,schemaPath:"#/minLength",keyword:"minLength",params:{limit:1},message:"must NOT have fewer than 1 characters"}],!1;if(new TextEncoder().encode(e).byteLength>255)return I.errors=[{instancePath:n,schemaPath:"#/x-lightnvr-max-bytes",keyword:"x-lightnvr-max-bytes",params:{},message:"must fit the UTF-8 byte limit"}],!1}else return I.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return I.errors=t,r===0}I.evaluated={dynamicProps:!1,dynamicItems:!1};var M={type:"string",enum:["auto","webrtc_only","mse_only","hls_only","webrtc_then_mse","mse_then_hls"],$id:"urn:lightnvr:contract:PlaybackTransport"};function T(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=T.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e!="string"?(T.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1):e==="auto"||e==="webrtc_only"||e==="mse_only"||e==="hls_only"||e==="webrtc_then_mse"||e==="mse_then_hls"?(T.errors=t,r===0):(T.errors=[{instancePath:n,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:M.enum},message:"must be equal to one of the allowed values"}],!1)}T.evaluated={dynamicProps:!1,dynamicItems:!1};function v(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=v.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let y;if(e.version===void 0&&(y="version")||e.projection===void 0&&(y="projection")||e.mount===void 0&&(y="mount")||e.centerX===void 0&&(y="centerX")||e.centerY===void 0&&(y="centerY")||e.radius===void 0&&(y="radius")||e.fov===void 0&&(y="fov")||e.rotation===void 0&&(y="rotation")||e.defaultYaw===void 0&&(y="defaultYaw")||e.defaultTilt===void 0&&(y="defaultTilt")||e.defaultViewFov===void 0&&(y="defaultViewFov"))return v.errors=[{instancePath:n,schemaPath:"#/required",keyword:"required",params:{missingProperty:y},message:"must have required property '"+y+"'"}],!1;if(e.version!==void 0){let a=r;if(e.version!==1)return v.errors=[{instancePath:n+"/version",schemaPath:"#/properties/version/const",keyword:"const",params:{allowedValue:1},message:"must be equal to constant"}],!1;var p=a===r}else var p=!0;if(p){if(e.projection!==void 0){let a=r;if(e.projection!=="equidistant")return v.errors=[{instancePath:n+"/projection",schemaPath:"#/properties/projection/const",keyword:"const",params:{allowedValue:"equidistant"},message:"must be equal to constant"}],!1;var p=a===r}else var p=!0;if(p){if(e.mount!==void 0){let a=r;if(e.mount!=="ceiling")return v.errors=[{instancePath:n+"/mount",schemaPath:"#/properties/mount/const",keyword:"const",params:{allowedValue:"ceiling"},message:"must be equal to constant"}],!1;var p=a===r}else var p=!0;if(p){if(e.centerX!==void 0){let a=e.centerX,l=r;if(r===l)if(typeof a=="number"&&isFinite(a)){if(a>1||isNaN(a))return v.errors=[{instancePath:n+"/centerX",schemaPath:"#/properties/centerX/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(a<0||isNaN(a))return v.errors=[{instancePath:n+"/centerX",schemaPath:"#/properties/centerX/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1}else return v.errors=[{instancePath:n+"/centerX",schemaPath:"#/properties/centerX/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=l===r}else var p=!0;if(p){if(e.centerY!==void 0){let a=e.centerY,l=r;if(r===l)if(typeof a=="number"&&isFinite(a)){if(a>1||isNaN(a))return v.errors=[{instancePath:n+"/centerY",schemaPath:"#/properties/centerY/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(a<0||isNaN(a))return v.errors=[{instancePath:n+"/centerY",schemaPath:"#/properties/centerY/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1}else return v.errors=[{instancePath:n+"/centerY",schemaPath:"#/properties/centerY/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=l===r}else var p=!0;if(p){if(e.radius!==void 0){let a=e.radius,l=r;if(r===l)if(typeof a=="number"&&isFinite(a)){if(a>1||isNaN(a))return v.errors=[{instancePath:n+"/radius",schemaPath:"#/properties/radius/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(a<.05||isNaN(a))return v.errors=[{instancePath:n+"/radius",schemaPath:"#/properties/radius/minimum",keyword:"minimum",params:{comparison:">=",limit:.05},message:"must be >= 0.05"}],!1}else return v.errors=[{instancePath:n+"/radius",schemaPath:"#/properties/radius/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=l===r}else var p=!0;if(p){if(e.fov!==void 0){let a=e.fov,l=r;if(r===l)if(typeof a=="number"&&isFinite(a)){if(a>360||isNaN(a))return v.errors=[{instancePath:n+"/fov",schemaPath:"#/properties/fov/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(a<160||isNaN(a))return v.errors=[{instancePath:n+"/fov",schemaPath:"#/properties/fov/minimum",keyword:"minimum",params:{comparison:">=",limit:160},message:"must be >= 160"}],!1}else return v.errors=[{instancePath:n+"/fov",schemaPath:"#/properties/fov/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=l===r}else var p=!0;if(p){if(e.rotation!==void 0){let a=e.rotation,l=r;if(r===l)if(typeof a=="number"&&isFinite(a)){if(a>360||isNaN(a))return v.errors=[{instancePath:n+"/rotation",schemaPath:"#/properties/rotation/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(a<-360||isNaN(a))return v.errors=[{instancePath:n+"/rotation",schemaPath:"#/properties/rotation/minimum",keyword:"minimum",params:{comparison:">=",limit:-360},message:"must be >= -360"}],!1}else return v.errors=[{instancePath:n+"/rotation",schemaPath:"#/properties/rotation/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=l===r}else var p=!0;if(p){if(e.defaultYaw!==void 0){let a=e.defaultYaw,l=r;if(r===l)if(typeof a=="number"&&isFinite(a)){if(a>360||isNaN(a))return v.errors=[{instancePath:n+"/defaultYaw",schemaPath:"#/properties/defaultYaw/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(a<-360||isNaN(a))return v.errors=[{instancePath:n+"/defaultYaw",schemaPath:"#/properties/defaultYaw/minimum",keyword:"minimum",params:{comparison:">=",limit:-360},message:"must be >= -360"}],!1}else return v.errors=[{instancePath:n+"/defaultYaw",schemaPath:"#/properties/defaultYaw/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=l===r}else var p=!0;if(p){if(e.defaultTilt!==void 0){let a=e.defaultTilt,l=r;if(r===l)if(typeof a=="number"&&isFinite(a)){if(a>30||isNaN(a))return v.errors=[{instancePath:n+"/defaultTilt",schemaPath:"#/properties/defaultTilt/maximum",keyword:"maximum",params:{comparison:"<=",limit:30},message:"must be <= 30"}],!1;if(a<-90||isNaN(a))return v.errors=[{instancePath:n+"/defaultTilt",schemaPath:"#/properties/defaultTilt/minimum",keyword:"minimum",params:{comparison:">=",limit:-90},message:"must be >= -90"}],!1}else return v.errors=[{instancePath:n+"/defaultTilt",schemaPath:"#/properties/defaultTilt/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=l===r}else var p=!0;if(p)if(e.defaultViewFov!==void 0){let a=e.defaultViewFov,l=r;if(r===l)if(typeof a=="number"&&isFinite(a)){if(a>120||isNaN(a))return v.errors=[{instancePath:n+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/maximum",keyword:"maximum",params:{comparison:"<=",limit:120},message:"must be <= 120"}],!1;if(a<20||isNaN(a))return v.errors=[{instancePath:n+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/minimum",keyword:"minimum",params:{comparison:">=",limit:20},message:"must be >= 20"}],!1}else return v.errors=[{instancePath:n+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=l===r}else var p=!0}}}}}}}}}}else return v.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return v.errors=t,r===0}v.evaluated={props:{version:!0,projection:!0,mount:!0,centerX:!0,centerY:!0,radius:!0,fov:!0,rotation:!0,defaultYaw:!0,defaultTilt:!0,defaultViewFov:!0},dynamicProps:!1,dynamicItems:!1};function F(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=F.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(typeof e=="string"){if(x(e)>1023)return F.errors=[{instancePath:n,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:1023},message:"must NOT have more than 1023 characters"}],!1;if(new TextEncoder().encode(e).byteLength>1023)return F.errors=[{instancePath:n,schemaPath:"#/x-lightnvr-max-bytes",keyword:"x-lightnvr-max-bytes",params:{},message:"must fit the UTF-8 byte limit"}],!1;if(e!==""){let y,a=!0;try{y=JSON.parse(e)}catch{a=!1}if(a){let l=r;v(y,{instancePath:n,parentData:e,parentDataProperty:g,rootData:c,dynamicAnchors:d})||(t=t===null?v.errors:t.concat(v.errors),r=t.length);var p=l===r;a=p}if(!a)return F.errors=[{instancePath:n,schemaPath:"#/contentSchema",keyword:"contentSchema",params:{},message:"must contain valid JSON matching contentSchema (or be empty)"}],!1}}else return F.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return F.errors=t,r===0}F.evaluated={dynamicProps:!1,dynamicItems:!1};function h(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=h.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),!(typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)))return h.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(r===0&&typeof e=="number"&&isFinite(e)){if(e>2147483647||isNaN(e))return h.errors=[{instancePath:n,schemaPath:"#/maximum",keyword:"maximum",params:{comparison:"<=",limit:2147483647},message:"must be <= 2147483647"}],!1;if(e<-2147483648||isNaN(e))return h.errors=[{instancePath:n,schemaPath:"#/minimum",keyword:"minimum",params:{comparison:">=",limit:-2147483648},message:"must be >= -2147483648"}],!1}return h.errors=t,r===0}h.evaluated={dynamicProps:!1,dynamicItems:!1};var Q={type:"integer",enum:[0,1],$id:"urn:lightnvr:contract:StreamProtocol"};function E(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=E.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)?e===0||e===1?(E.errors=t,r===0):(E.errors=[{instancePath:n,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:Q.enum},message:"must be equal to one of the allowed values"}],!1):(E.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1)}E.evaluated={dynamicProps:!1,dynamicItems:!1};function O(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=O.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),!(typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)))return O.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(r===0&&typeof e=="number"&&isFinite(e)){if(e>365||isNaN(e))return O.errors=[{instancePath:n,schemaPath:"#/maximum",keyword:"maximum",params:{comparison:"<=",limit:365},message:"must be <= 365"}],!1;if(e<-1||isNaN(e))return O.errors=[{instancePath:n,schemaPath:"#/minimum",keyword:"minimum",params:{comparison:">=",limit:-1},message:"must be >= -1"}],!1}return O.errors=t,r===0}O.evaluated={dynamicProps:!1,dynamicItems:!1};function D(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=D.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(Array.isArray(e)){if(e.length>168)return D.errors=[{instancePath:n,schemaPath:"#/maxItems",keyword:"maxItems",params:{limit:168},message:"must NOT have more than 168 items"}],!1;if(e.length<168)return D.errors=[{instancePath:n,schemaPath:"#/minItems",keyword:"minItems",params:{limit:168},message:"must NOT have fewer than 168 items"}],!1;{var p=!0;let y=e.length;for(let a=0;a511)return _.errors=[{instancePath:n+"/url",schemaPath:"#/properties/url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return _.errors=[{instancePath:n+"/url",schemaPath:"#/properties/url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=f===r}else var i=!0;if(i){if(e.enabled!==void 0){let s=r;if(typeof e.enabled!="boolean")return _.errors=[{instancePath:n+"/enabled",schemaPath:"#/properties/enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.streaming_enabled!==void 0){let s=r;if(typeof e.streaming_enabled!="boolean")return _.errors=[{instancePath:n+"/streaming_enabled",schemaPath:"#/properties/streaming_enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.playback_transport!==void 0){let s=r;T(e.playback_transport,{instancePath:n+"/playback_transport",parentData:e,parentDataProperty:"playback_transport",rootData:c,dynamicAnchors:d})||(t=t===null?T.errors:t.concat(T.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.eptz_config!==void 0){let s=r;F(e.eptz_config,{instancePath:n+"/eptz_config",parentData:e,parentDataProperty:"eptz_config",rootData:c,dynamicAnchors:d})||(t=t===null?F.errors:t.concat(F.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.width!==void 0){let s=r;h(e.width,{instancePath:n+"/width",parentData:e,parentDataProperty:"width",rootData:c,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.height!==void 0){let s=r;h(e.height,{instancePath:n+"/height",parentData:e,parentDataProperty:"height",rootData:c,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.fps!==void 0){let s=r;h(e.fps,{instancePath:n+"/fps",parentData:e,parentDataProperty:"fps",rootData:c,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.codec!==void 0){let s=e.codec,f=r;if(r===f)if(typeof s=="string"){if(x(s)>15)return _.errors=[{instancePath:n+"/codec",schemaPath:"#/properties/codec/maxLength",keyword:"maxLength",params:{limit:15},message:"must NOT have more than 15 characters"}],!1}else return _.errors=[{instancePath:n+"/codec",schemaPath:"#/properties/codec/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=f===r}else var i=!0;if(i){if(e.priority!==void 0){let s=r;h(e.priority,{instancePath:n+"/priority",parentData:e,parentDataProperty:"priority",rootData:c,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.record!==void 0){let s=r;if(typeof e.record!="boolean")return _.errors=[{instancePath:n+"/record",schemaPath:"#/properties/record/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.segment_duration!==void 0){let s=r;h(e.segment_duration,{instancePath:n+"/segment_duration",parentData:e,parentDataProperty:"segment_duration",rootData:c,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.detection_based_recording!==void 0){let s=r;if(typeof e.detection_based_recording!="boolean")return _.errors=[{instancePath:n+"/detection_based_recording",schemaPath:"#/properties/detection_based_recording/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.detection_model!==void 0){let s=e.detection_model,f=r;if(r===f)if(typeof s=="string"){if(x(s)>511)return _.errors=[{instancePath:n+"/detection_model",schemaPath:"#/properties/detection_model/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return _.errors=[{instancePath:n+"/detection_model",schemaPath:"#/properties/detection_model/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=f===r}else var i=!0;if(i){if(e.detection_threshold!==void 0){let s=e.detection_threshold,f=r;if(!(typeof s=="number"&&!(s%1)&&!isNaN(s)&&isFinite(s)))return _.errors=[{instancePath:n+"/detection_threshold",schemaPath:"#/properties/detection_threshold/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;var i=f===r}else var i=!0;if(i){if(e.detection_interval!==void 0){let s=r;h(e.detection_interval,{instancePath:n+"/detection_interval",parentData:e,parentDataProperty:"detection_interval",rootData:c,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.pre_detection_buffer!==void 0){let s=r;h(e.pre_detection_buffer,{instancePath:n+"/pre_detection_buffer",parentData:e,parentDataProperty:"pre_detection_buffer",rootData:c,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.post_detection_buffer!==void 0){let s=r;h(e.post_detection_buffer,{instancePath:n+"/post_detection_buffer",parentData:e,parentDataProperty:"post_detection_buffer",rootData:c,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.detection_object_filter!==void 0){let s=e.detection_object_filter,f=r;if(r===f)if(typeof s=="string"){if(x(s)>15)return _.errors=[{instancePath:n+"/detection_object_filter",schemaPath:"#/properties/detection_object_filter/maxLength",keyword:"maxLength",params:{limit:15},message:"must NOT have more than 15 characters"}],!1}else return _.errors=[{instancePath:n+"/detection_object_filter",schemaPath:"#/properties/detection_object_filter/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=f===r}else var i=!0;if(i){if(e.detection_object_filter_list!==void 0){let s=e.detection_object_filter_list,f=r;if(r===f)if(typeof s=="string"){if(x(s)>255)return _.errors=[{instancePath:n+"/detection_object_filter_list",schemaPath:"#/properties/detection_object_filter_list/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1}else return _.errors=[{instancePath:n+"/detection_object_filter_list",schemaPath:"#/properties/detection_object_filter_list/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=f===r}else var i=!0;if(i){if(e.protocol!==void 0){let s=r;E(e.protocol,{instancePath:n+"/protocol",parentData:e,parentDataProperty:"protocol",rootData:c,dynamicAnchors:d})||(t=t===null?E.errors:t.concat(E.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.record_audio!==void 0){let s=r;if(typeof e.record_audio!="boolean")return _.errors=[{instancePath:n+"/record_audio",schemaPath:"#/properties/record_audio/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.audio_voice_enhancement!==void 0){let s=r;if(typeof e.audio_voice_enhancement!="boolean")return _.errors=[{instancePath:n+"/audio_voice_enhancement",schemaPath:"#/properties/audio_voice_enhancement/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.isOnvif!==void 0){let s=r;if(typeof e.isOnvif!="boolean")return _.errors=[{instancePath:n+"/isOnvif",schemaPath:"#/properties/isOnvif/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.backchannel_enabled!==void 0){let s=r;if(typeof e.backchannel_enabled!="boolean")return _.errors=[{instancePath:n+"/backchannel_enabled",schemaPath:"#/properties/backchannel_enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.retention_days!==void 0){let s=r;O(e.retention_days,{instancePath:n+"/retention_days",parentData:e,parentDataProperty:"retention_days",rootData:c,dynamicAnchors:d})||(t=t===null?O.errors:t.concat(O.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.detection_retention_days!==void 0){let s=r;O(e.detection_retention_days,{instancePath:n+"/detection_retention_days",parentData:e,parentDataProperty:"detection_retention_days",rootData:c,dynamicAnchors:d})||(t=t===null?O.errors:t.concat(O.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.max_storage_mb!==void 0){let s=r;h(e.max_storage_mb,{instancePath:n+"/max_storage_mb",parentData:e,parentDataProperty:"max_storage_mb",rootData:c,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.tier_critical_multiplier!==void 0){let s=e.tier_critical_multiplier,f=r;if(!(typeof s=="number"&&isFinite(s)))return _.errors=[{instancePath:n+"/tier_critical_multiplier",schemaPath:"#/properties/tier_critical_multiplier/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var i=f===r}else var i=!0;if(i){if(e.tier_important_multiplier!==void 0){let s=e.tier_important_multiplier,f=r;if(!(typeof s=="number"&&isFinite(s)))return _.errors=[{instancePath:n+"/tier_important_multiplier",schemaPath:"#/properties/tier_important_multiplier/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var i=f===r}else var i=!0;if(i){if(e.tier_ephemeral_multiplier!==void 0){let s=e.tier_ephemeral_multiplier,f=r;if(!(typeof s=="number"&&isFinite(s)))return _.errors=[{instancePath:n+"/tier_ephemeral_multiplier",schemaPath:"#/properties/tier_ephemeral_multiplier/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var i=f===r}else var i=!0;if(i){if(e.storage_priority!==void 0){let s=r;h(e.storage_priority,{instancePath:n+"/storage_priority",parentData:e,parentDataProperty:"storage_priority",rootData:c,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.ptz_enabled!==void 0){let s=r;if(typeof e.ptz_enabled!="boolean")return _.errors=[{instancePath:n+"/ptz_enabled",schemaPath:"#/properties/ptz_enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.ptz_max_x!==void 0){let s=r;h(e.ptz_max_x,{instancePath:n+"/ptz_max_x",parentData:e,parentDataProperty:"ptz_max_x",rootData:c,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.ptz_max_y!==void 0){let s=r;h(e.ptz_max_y,{instancePath:n+"/ptz_max_y",parentData:e,parentDataProperty:"ptz_max_y",rootData:c,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.ptz_max_z!==void 0){let s=r;h(e.ptz_max_z,{instancePath:n+"/ptz_max_z",parentData:e,parentDataProperty:"ptz_max_z",rootData:c,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.ptz_has_home!==void 0){let s=r;if(typeof e.ptz_has_home!="boolean")return _.errors=[{instancePath:n+"/ptz_has_home",schemaPath:"#/properties/ptz_has_home/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.onvif_username!==void 0){let s=e.onvif_username,f=r;if(r===f)if(typeof s=="string"){if(x(s)>63)return _.errors=[{instancePath:n+"/onvif_username",schemaPath:"#/properties/onvif_username/maxLength",keyword:"maxLength",params:{limit:63},message:"must NOT have more than 63 characters"}],!1}else return _.errors=[{instancePath:n+"/onvif_username",schemaPath:"#/properties/onvif_username/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=f===r}else var i=!0;if(i){if(e.onvif_password!==void 0){let s=e.onvif_password,f=r;if(r===f)if(typeof s=="string"){if(x(s)>63)return _.errors=[{instancePath:n+"/onvif_password",schemaPath:"#/properties/onvif_password/maxLength",keyword:"maxLength",params:{limit:63},message:"must NOT have more than 63 characters"}],!1}else return _.errors=[{instancePath:n+"/onvif_password",schemaPath:"#/properties/onvif_password/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=f===r}else var i=!0;if(i){if(e.onvif_profile!==void 0){let s=e.onvif_profile,f=r;if(r===f)if(typeof s=="string"){if(x(s)>63)return _.errors=[{instancePath:n+"/onvif_profile",schemaPath:"#/properties/onvif_profile/maxLength",keyword:"maxLength",params:{limit:63},message:"must NOT have more than 63 characters"}],!1}else return _.errors=[{instancePath:n+"/onvif_profile",schemaPath:"#/properties/onvif_profile/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=f===r}else var i=!0;if(i){if(e.onvif_port!==void 0){let s=r;h(e.onvif_port,{instancePath:n+"/onvif_port",parentData:e,parentDataProperty:"onvif_port",rootData:c,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.record_on_schedule!==void 0){let s=r;if(typeof e.record_on_schedule!="boolean")return _.errors=[{instancePath:n+"/record_on_schedule",schemaPath:"#/properties/record_on_schedule/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.recording_schedule!==void 0){let s=r;D(e.recording_schedule,{instancePath:n+"/recording_schedule",parentData:e,parentDataProperty:"recording_schedule",rootData:c,dynamicAnchors:d})||(t=t===null?D.errors:t.concat(D.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.detection_record_on_schedule!==void 0){let s=r;if(typeof e.detection_record_on_schedule!="boolean")return _.errors=[{instancePath:n+"/detection_record_on_schedule",schemaPath:"#/properties/detection_record_on_schedule/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.detection_recording_schedule!==void 0){let s=r;D(e.detection_recording_schedule,{instancePath:n+"/detection_recording_schedule",parentData:e,parentDataProperty:"detection_recording_schedule",rootData:c,dynamicAnchors:d})||(t=t===null?D.errors:t.concat(D.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.tags!==void 0){let s=e.tags,f=r;if(r===f)if(typeof s=="string"){if(x(s)>255)return _.errors=[{instancePath:n+"/tags",schemaPath:"#/properties/tags/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1}else return _.errors=[{instancePath:n+"/tags",schemaPath:"#/properties/tags/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=f===r}else var i=!0;if(i){if(e.admin_url!==void 0){let s=e.admin_url,f=r;if(r===f)if(typeof s=="string"){if(x(s)>511)return _.errors=[{instancePath:n+"/admin_url",schemaPath:"#/properties/admin_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return _.errors=[{instancePath:n+"/admin_url",schemaPath:"#/properties/admin_url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=f===r}else var i=!0;if(i){if(e.privacy_mode!==void 0){let s=r;if(typeof e.privacy_mode!="boolean")return _.errors=[{instancePath:n+"/privacy_mode",schemaPath:"#/properties/privacy_mode/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.can_control_privacy!==void 0){let s=r;if(typeof e.can_control_privacy!="boolean")return _.errors=[{instancePath:n+"/can_control_privacy",schemaPath:"#/properties/can_control_privacy/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.motion_trigger_source!==void 0){let s=e.motion_trigger_source,f=r;if(r===f)if(typeof s=="string"){if(x(s)>255)return _.errors=[{instancePath:n+"/motion_trigger_source",schemaPath:"#/properties/motion_trigger_source/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1}else return _.errors=[{instancePath:n+"/motion_trigger_source",schemaPath:"#/properties/motion_trigger_source/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=f===r}else var i=!0;if(i){if(e.go2rtc_source_override!==void 0){let s=e.go2rtc_source_override,f=r;if(r===f)if(typeof s=="string"){if(x(s)>8191)return _.errors=[{instancePath:n+"/go2rtc_source_override",schemaPath:"#/properties/go2rtc_source_override/maxLength",keyword:"maxLength",params:{limit:8191},message:"must NOT have more than 8191 characters"}],!1}else return _.errors=[{instancePath:n+"/go2rtc_source_override",schemaPath:"#/properties/go2rtc_source_override/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=f===r}else var i=!0;if(i){if(e.sub_stream_url!==void 0){let s=e.sub_stream_url,f=r;if(r===f)if(typeof s=="string"){if(x(s)>511)return _.errors=[{instancePath:n+"/sub_stream_url",schemaPath:"#/properties/sub_stream_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return _.errors=[{instancePath:n+"/sub_stream_url",schemaPath:"#/properties/sub_stream_url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=f===r}else var i=!0;if(i){if(e.has_sub_stream!==void 0){let s=r;if(typeof e.has_sub_stream!="boolean")return _.errors=[{instancePath:n+"/has_sub_stream",schemaPath:"#/properties/has_sub_stream/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.detection_url!==void 0){let s=e.detection_url,f=r;if(r===f)if(typeof s=="string"){if(x(s)>511)return _.errors=[{instancePath:n+"/detection_url",schemaPath:"#/properties/detection_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return _.errors=[{instancePath:n+"/detection_url",schemaPath:"#/properties/detection_url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=f===r}else var i=!0;if(i){if(e.publish_url!==void 0){let s=e.publish_url,f=r;if(r===f)if(typeof s=="string"){if(x(s)>511)return _.errors=[{instancePath:n+"/publish_url",schemaPath:"#/properties/publish_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return _.errors=[{instancePath:n+"/publish_url",schemaPath:"#/properties/publish_url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=f===r}else var i=!0;if(i){if(e.status!==void 0){let s=r;A(e.status,{instancePath:n+"/status",parentData:e,parentDataProperty:"status",rootData:c,dynamicAnchors:d})||(t=t===null?A.errors:t.concat(A.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.error_message!==void 0){let s=e.error_message,f=r;if(r===f)if(typeof s=="string"){if(x(s)>255)return _.errors=[{instancePath:n+"/error_message",schemaPath:"#/properties/error_message/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1;if(x(s)<1)return _.errors=[{instancePath:n+"/error_message",schemaPath:"#/properties/error_message/minLength",keyword:"minLength",params:{limit:1},message:"must NOT have fewer than 1 characters"}],!1}else return _.errors=[{instancePath:n+"/error_message",schemaPath:"#/properties/error_message/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=f===r}else var i=!0;if(i)if(e.go2rtc_hls_available!==void 0){let s=r;if(typeof e.go2rtc_hls_available!="boolean")return _.errors=[{instancePath:n+"/go2rtc_hls_available",schemaPath:"#/properties/go2rtc_hls_available/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}else return _.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return _.errors=t,r===0}_.evaluated={props:{camera_uuid:!0,location_uuid:!0,name:!0,url:!0,enabled:!0,streaming_enabled:!0,playback_transport:!0,eptz_config:!0,width:!0,height:!0,fps:!0,codec:!0,priority:!0,record:!0,segment_duration:!0,detection_based_recording:!0,detection_model:!0,detection_threshold:!0,detection_interval:!0,pre_detection_buffer:!0,post_detection_buffer:!0,detection_object_filter:!0,detection_object_filter_list:!0,protocol:!0,record_audio:!0,audio_voice_enhancement:!0,isOnvif:!0,backchannel_enabled:!0,retention_days:!0,detection_retention_days:!0,max_storage_mb:!0,tier_critical_multiplier:!0,tier_important_multiplier:!0,tier_ephemeral_multiplier:!0,storage_priority:!0,ptz_enabled:!0,ptz_max_x:!0,ptz_max_y:!0,ptz_max_z:!0,ptz_has_home:!0,onvif_username:!0,onvif_password:!0,onvif_profile:!0,onvif_port:!0,record_on_schedule:!0,recording_schedule:!0,detection_record_on_schedule:!0,detection_recording_schedule:!0,tags:!0,admin_url:!0,privacy_mode:!0,can_control_privacy:!0,motion_trigger_source:!0,go2rtc_source_override:!0,sub_stream_url:!0,has_sub_stream:!0,detection_url:!0,publish_url:!0,status:!0,error_message:!0,go2rtc_hls_available:!0},dynamicProps:!1,dynamicItems:!1};var ee=new RegExp("^(?![A-Za-z][A-Za-z0-9+.-]*://[^/?#]*@)","u");function L(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=L.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(typeof e=="string"){if(x(e)>511)return L.errors=[{instancePath:n,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1;if(!ee.test(e))return L.errors=[{instancePath:n,schemaPath:"#/pattern",keyword:"pattern",params:{pattern:"^(?![A-Za-z][A-Za-z0-9+.-]*://[^/?#]*@)"},message:'must match pattern "^(?![A-Za-z][A-Za-z0-9+.-]*://[^/?#]*@)"'}],!1}else return L.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return L.errors=t,r===0}L.evaluated={dynamicProps:!1,dynamicItems:!1};function j(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=j.evaluated;o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0);let p=r;_(e,{instancePath:n,parentData:b,parentDataProperty:g,rootData:c,dynamicAnchors:d})||(t=t===null?_.errors:t.concat(_.errors),r=t.length);var y=p===r;if(y){let $=r,i=r,m=!0,s=r,f=r,z=!1,X=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let P;if(e.isOnvif===void 0&&(P="isOnvif")){let k={};t===null?t=[k]:t.push(k),r++}else if(e.isOnvif!==void 0&&e.isOnvif!==!0){let k={};t===null?t=[k]:t.push(k),r++}}var l=X===r;if(z=z||l,l){var a={};a.isOnvif=!0}let C=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let P;if(e.onvif_username===void 0&&(P="onvif_username")){let k={};t===null?t=[k]:t.push(k),r++}else if(e.onvif_username!==void 0){let k=e.onvif_username;if(typeof k=="string"&&x(k)<1){let R={};t===null?t=[R]:t.push(R),r++}}}var l=C===r;z=z||l,l&&a!==!0&&(a=a||{},a.onvif_username=!0);let B=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let P;if(e.onvif_password===void 0&&(P="onvif_password")){let k={};t===null?t=[k]:t.push(k),r++}else if(e.onvif_password!==void 0){let k=e.onvif_password;if(typeof k=="string"&&x(k)<1){let R={};t===null?t=[R]:t.push(R),r++}}}var l=B===r;if(z=z||l,l&&a!==!0&&(a=a||{},a.onvif_password=!0),z)r=f,t!==null&&(f?t.length=f:t=null);else{let P={};t===null?t=[P]:t.push(P),r++}var u=s===r;if(r=i,t!==null&&(i?t.length=i:t=null),u){let P=r;e&&typeof e=="object"&&!Array.isArray(e)&&e.url!==void 0&&(L(e.url,{instancePath:n+"/url",parentData:e,parentDataProperty:"url",rootData:c,dynamicAnchors:d})||(t=t===null?L.errors:t.concat(L.errors),r=t.length));var u=P===r;m=u,m&&a!==!0&&(a=a||{},a.url=!0)}if(!m){let P={instancePath:n,schemaPath:"#/allOf/1/if",keyword:"if",params:{failingKeyword:"then"},message:'must match "then" schema'};return t===null?t=[P]:t.push(P),r++,j.errors=t,!1}if(r===$)if(e&&typeof e=="object"&&!Array.isArray(e)){let P;if(e.url===void 0&&(P="url")||e.onvif_username===void 0&&(P="onvif_username")||e.onvif_password===void 0&&(P="onvif_password")||e.admin_url===void 0&&(P="admin_url")||e.go2rtc_source_override===void 0&&(P="go2rtc_source_override")||e.sub_stream_url===void 0&&(P="sub_stream_url")||e.detection_url===void 0&&(P="detection_url")||e.publish_url===void 0&&(P="publish_url"))return j.errors=[{instancePath:n,schemaPath:"#/allOf/1/required",keyword:"required",params:{missingProperty:P},message:"must have required property '"+P+"'"}],!1;if(a!==!0&&(a=a||{},a.can_control_privacy=!0),e.can_control_privacy!==void 0&&e.can_control_privacy!==!0)return j.errors=[{instancePath:n+"/can_control_privacy",schemaPath:"#/allOf/1/properties/can_control_privacy/const",keyword:"const",params:{allowedValue:!0},message:"must be equal to constant"}],!1}else return j.errors=[{instancePath:n,schemaPath:"#/allOf/1/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;var y=$===r;y&&a!==!0&&(a=a||{},a.camera_uuid=!0,a.location_uuid=!0,a.name=!0,a.url=!0,a.enabled=!0,a.streaming_enabled=!0,a.playback_transport=!0,a.eptz_config=!0,a.width=!0,a.height=!0,a.fps=!0,a.codec=!0,a.priority=!0,a.record=!0,a.segment_duration=!0,a.detection_based_recording=!0,a.detection_model=!0,a.detection_threshold=!0,a.detection_interval=!0,a.pre_detection_buffer=!0,a.post_detection_buffer=!0,a.detection_object_filter=!0,a.detection_object_filter_list=!0,a.protocol=!0,a.record_audio=!0,a.audio_voice_enhancement=!0,a.isOnvif=!0,a.backchannel_enabled=!0,a.retention_days=!0,a.detection_retention_days=!0,a.max_storage_mb=!0,a.tier_critical_multiplier=!0,a.tier_important_multiplier=!0,a.tier_ephemeral_multiplier=!0,a.storage_priority=!0,a.ptz_enabled=!0,a.ptz_max_x=!0,a.ptz_max_y=!0,a.ptz_max_z=!0,a.ptz_has_home=!0,a.onvif_username=!0,a.onvif_password=!0,a.onvif_profile=!0,a.onvif_port=!0,a.record_on_schedule=!0,a.recording_schedule=!0,a.detection_record_on_schedule=!0,a.detection_recording_schedule=!0,a.tags=!0,a.admin_url=!0,a.privacy_mode=!0,a.can_control_privacy=!0,a.motion_trigger_source=!0,a.go2rtc_source_override=!0,a.sub_stream_url=!0,a.has_sub_stream=!0,a.detection_url=!0,a.publish_url=!0,a.status=!0,a.error_message=!0,a.go2rtc_hls_available=!0)}return j.errors=t,o.props=a,r===0}j.evaluated={dynamicProps:!0,dynamicItems:!1};var re=new RegExp("[?&;][^=&#]*([Pp][Aa][Ss][Ss]|[Pp][Ww][Dd]|[Tt][Oo][Kk][Ee][Nn]|[Ss][Ee][Cc][Rr][Ee][Tt]|[Aa][Pp][Ii]_?[Kk][Ee][Yy])[^=&#]*=[^&#]","u");function q(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=q.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e!="string")return q.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;let p=r,y=r;if(typeof e=="string"&&!re.test(e)){let l={};t===null?t=[l]:t.push(l),r++}var a=y===r;return a?(q.errors=[{instancePath:n,schemaPath:"#/not",keyword:"not",params:{},message:"must NOT be valid"}],!1):(r=p,t!==null&&(p?t.length=p:t=null),q.errors=t,r===0)}q.evaluated={dynamicProps:!1,dynamicItems:!1};function U(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=U.evaluated;o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0);let p=r;L(e,{instancePath:n,parentData:b,parentDataProperty:g,rootData:c,dynamicAnchors:d})||(t=t===null?L.errors:t.concat(L.errors),r=t.length);var y=p===r;if(y){let a=r;q(e,{instancePath:n,parentData:b,parentDataProperty:g,rootData:c,dynamicAnchors:d})||(t=t===null?q.errors:t.concat(q.errors),r=t.length);var y=a===r}return U.errors=t,r===0}U.evaluated={dynamicProps:!1,dynamicItems:!1};function w(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=w.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e!="string"?(w.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1):e!==""?(w.errors=[{instancePath:n,schemaPath:"#/const",keyword:"const",params:{allowedValue:""},message:"must be equal to constant"}],!1):(w.errors=t,r===0)}w.evaluated={dynamicProps:!1,dynamicItems:!1};function S(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=S.evaluated;o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0);let p=r;_(e,{instancePath:n,parentData:b,parentDataProperty:g,rootData:c,dynamicAnchors:d})||(t=t===null?_.errors:t.concat(_.errors),r=t.length);var y=p===r;if(y){let u=r,$=r,i=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let s;if(e.detection_api_url===void 0&&(s="detection_api_url")){let f={};t===null?t=[f]:t.push(f),r++}}var a=i===r;if(a)return S.errors=[{instancePath:n,schemaPath:"#/allOf/1/not",keyword:"not",params:{},message:"must NOT be valid"}],!1;if(r=$,t!==null&&($?t.length=$:t=null),r===u)if(e&&typeof e=="object"&&!Array.isArray(e)){if(e.can_control_privacy!==void 0){let s=r;if(e.can_control_privacy!==!1)return S.errors=[{instancePath:n+"/can_control_privacy",schemaPath:"#/allOf/1/properties/can_control_privacy/const",keyword:"const",params:{allowedValue:!1},message:"must be equal to constant"}],!1;var l=s===r}else var l=!0;if(l){if(e.url!==void 0){let s=r;U(e.url,{instancePath:n+"/url",parentData:e,parentDataProperty:"url",rootData:c,dynamicAnchors:d})||(t=t===null?U.errors:t.concat(U.errors),r=t.length);var l=s===r}else var l=!0;if(l){if(e.onvif_username!==void 0){let s=r;w(e.onvif_username,{instancePath:n+"/onvif_username",parentData:e,parentDataProperty:"onvif_username",rootData:c,dynamicAnchors:d})||(t=t===null?w.errors:t.concat(w.errors),r=t.length);var l=s===r}else var l=!0;if(l){if(e.onvif_password!==void 0){let s=r;w(e.onvif_password,{instancePath:n+"/onvif_password",parentData:e,parentDataProperty:"onvif_password",rootData:c,dynamicAnchors:d})||(t=t===null?w.errors:t.concat(w.errors),r=t.length);var l=s===r}else var l=!0;if(l){if(e.admin_url!==void 0){let s=r;w(e.admin_url,{instancePath:n+"/admin_url",parentData:e,parentDataProperty:"admin_url",rootData:c,dynamicAnchors:d})||(t=t===null?w.errors:t.concat(w.errors),r=t.length);var l=s===r}else var l=!0;if(l){if(e.go2rtc_source_override!==void 0){let s=r;w(e.go2rtc_source_override,{instancePath:n+"/go2rtc_source_override",parentData:e,parentDataProperty:"go2rtc_source_override",rootData:c,dynamicAnchors:d})||(t=t===null?w.errors:t.concat(w.errors),r=t.length);var l=s===r}else var l=!0;if(l){if(e.sub_stream_url!==void 0){let s=r;w(e.sub_stream_url,{instancePath:n+"/sub_stream_url",parentData:e,parentDataProperty:"sub_stream_url",rootData:c,dynamicAnchors:d})||(t=t===null?w.errors:t.concat(w.errors),r=t.length);var l=s===r}else var l=!0;if(l){if(e.detection_url!==void 0){let s=r;w(e.detection_url,{instancePath:n+"/detection_url",parentData:e,parentDataProperty:"detection_url",rootData:c,dynamicAnchors:d})||(t=t===null?w.errors:t.concat(w.errors),r=t.length);var l=s===r}else var l=!0;if(l)if(e.publish_url!==void 0){let s=r;w(e.publish_url,{instancePath:n+"/publish_url",parentData:e,parentDataProperty:"publish_url",rootData:c,dynamicAnchors:d})||(t=t===null?w.errors:t.concat(w.errors),r=t.length);var l=s===r}else var l=!0}}}}}}}}else return S.errors=[{instancePath:n,schemaPath:"#/allOf/1/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;var y=u===r}return S.errors=t,r===0}S.evaluated={props:{can_control_privacy:!0,url:!0,onvif_username:!0,onvif_password:!0,admin_url:!0,go2rtc_source_override:!0,sub_stream_url:!0,detection_url:!0,publish_url:!0,camera_uuid:!0,location_uuid:!0,name:!0,enabled:!0,streaming_enabled:!0,playback_transport:!0,eptz_config:!0,width:!0,height:!0,fps:!0,codec:!0,priority:!0,record:!0,segment_duration:!0,detection_based_recording:!0,detection_model:!0,detection_threshold:!0,detection_interval:!0,pre_detection_buffer:!0,post_detection_buffer:!0,detection_object_filter:!0,detection_object_filter_list:!0,protocol:!0,record_audio:!0,audio_voice_enhancement:!0,isOnvif:!0,backchannel_enabled:!0,retention_days:!0,detection_retention_days:!0,max_storage_mb:!0,tier_critical_multiplier:!0,tier_important_multiplier:!0,tier_ephemeral_multiplier:!0,storage_priority:!0,ptz_enabled:!0,ptz_max_x:!0,ptz_max_y:!0,ptz_max_z:!0,ptz_has_home:!0,onvif_profile:!0,onvif_port:!0,record_on_schedule:!0,recording_schedule:!0,detection_record_on_schedule:!0,detection_recording_schedule:!0,tags:!0,privacy_mode:!0,motion_trigger_source:!0,has_sub_stream:!0,status:!0,error_message:!0,go2rtc_hls_available:!0},dynamicProps:!1,dynamicItems:!1};function Y(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=Y.evaluated;o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0);let p=r,y=!1,a=null,l=r;if(!j(e,{instancePath:n,parentData:b,parentDataProperty:g,rootData:c,dynamicAnchors:d}))t=t===null?j.errors:t.concat(j.errors),r=t.length;else var u=j.evaluated.props;var i=l===r;i&&(y=!0,a=0);let $=r;S(e,{instancePath:n,parentData:b,parentDataProperty:g,rootData:c,dynamicAnchors:d})||(t=t===null?S.errors:t.concat(S.errors),r=t.length);var i=$===r;if(i&&y?(y=!1,a=[a,1]):i&&(y=!0,a=1,u!==!0&&(u=u||{},u.can_control_privacy=!0,u.url=!0,u.onvif_username=!0,u.onvif_password=!0,u.admin_url=!0,u.go2rtc_source_override=!0,u.sub_stream_url=!0,u.detection_url=!0,u.publish_url=!0,u.camera_uuid=!0,u.location_uuid=!0,u.name=!0,u.enabled=!0,u.streaming_enabled=!0,u.playback_transport=!0,u.eptz_config=!0,u.width=!0,u.height=!0,u.fps=!0,u.codec=!0,u.priority=!0,u.record=!0,u.segment_duration=!0,u.detection_based_recording=!0,u.detection_model=!0,u.detection_threshold=!0,u.detection_interval=!0,u.pre_detection_buffer=!0,u.post_detection_buffer=!0,u.detection_object_filter=!0,u.detection_object_filter_list=!0,u.protocol=!0,u.record_audio=!0,u.audio_voice_enhancement=!0,u.isOnvif=!0,u.backchannel_enabled=!0,u.retention_days=!0,u.detection_retention_days=!0,u.max_storage_mb=!0,u.tier_critical_multiplier=!0,u.tier_important_multiplier=!0,u.tier_ephemeral_multiplier=!0,u.storage_priority=!0,u.ptz_enabled=!0,u.ptz_max_x=!0,u.ptz_max_y=!0,u.ptz_max_z=!0,u.ptz_has_home=!0,u.onvif_profile=!0,u.onvif_port=!0,u.record_on_schedule=!0,u.recording_schedule=!0,u.detection_record_on_schedule=!0,u.detection_recording_schedule=!0,u.tags=!0,u.privacy_mode=!0,u.motion_trigger_source=!0,u.has_sub_stream=!0,u.status=!0,u.error_message=!0,u.go2rtc_hls_available=!0)),y)r=p,t!==null&&(p?t.length=p:t=null);else{let m={instancePath:n,schemaPath:"#/oneOf",keyword:"oneOf",params:{passingSchemas:a},message:"must match exactly one schema in oneOf"};return t===null?t=[m]:t.push(m),r++,Y.errors=t,!1}return Y.errors=t,o.props=u,r===0}Y.evaluated={dynamicProps:!0,dynamicItems:!1};function V(e,{instancePath:n="",parentData:b,parentDataProperty:g,rootData:c=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=V.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let p;if(e.stream===void 0&&(p="stream"))return V.errors=[{instancePath:n,schemaPath:"#/required",keyword:"required",params:{missingProperty:p},message:"must have required property '"+p+"'"}],!1;e.stream!==void 0&&(Y(e.stream,{instancePath:n+"/stream",parentData:e,parentDataProperty:"stream",rootData:c,dynamicAnchors:d})||(t=t===null?Y.errors:t.concat(Y.errors),r=t.length))}else return V.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return V.errors=t,r===0}V.evaluated={props:{stream:!0},dynamicProps:!1,dynamicItems:!1};export{ie as validateStreamFullResponse}; diff --git a/web/js/api/generated/validators/StreamFullResponseConfigurable.d.mts b/web/js/api/generated/validators/StreamFullResponseConfigurable.d.mts new file mode 100644 index 000000000..8af01433e --- /dev/null +++ b/web/js/api/generated/validators/StreamFullResponseConfigurable.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateStreamFullResponseConfigurable } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/StreamFullResponseConfigurable.mjs b/web/js/api/generated/validators/StreamFullResponseConfigurable.mjs new file mode 100644 index 000000000..f2c0b4d4e --- /dev/null +++ b/web/js/api/generated/validators/StreamFullResponseConfigurable.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var U=(e,s)=>()=>{try{return s||e((s={exports:{}}).exports,s),s.exports}catch(w){throw s=0,w}};var X=U(V=>{"use strict";Object.defineProperty(V,"__esModule",{value:!0});function C(e){let s=e.length,w=0,b=0,f;for(;b=55296&&f<=56319&&b36)return z.errors=[{instancePath:s,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:36},message:"must NOT have more than 36 characters"}],!1;if(!Z.test(e))return z.errors=[{instancePath:s,schemaPath:"#/pattern",keyword:"pattern",params:{pattern:"^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$"},message:'must match pattern "^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$"'}],!1}else return z.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return z.errors=t,r===0}z.evaluated={dynamicProps:!1,dynamicItems:!1};function D(e,{instancePath:s="",parentData:w,parentDataProperty:b,rootData:f=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=D.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(typeof e=="string"){if(v(e)>255)return D.errors=[{instancePath:s,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1;if(v(e)<1)return D.errors=[{instancePath:s,schemaPath:"#/minLength",keyword:"minLength",params:{limit:1},message:"must NOT have fewer than 1 characters"}],!1;if(new TextEncoder().encode(e).byteLength>255)return D.errors=[{instancePath:s,schemaPath:"#/x-lightnvr-max-bytes",keyword:"x-lightnvr-max-bytes",params:{},message:"must fit the UTF-8 byte limit"}],!1}else return D.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return D.errors=t,r===0}D.evaluated={dynamicProps:!1,dynamicItems:!1};var W={type:"string",enum:["auto","webrtc_only","mse_only","hls_only","webrtc_then_mse","mse_then_hls"],$id:"urn:lightnvr:contract:PlaybackTransport"};function F(e,{instancePath:s="",parentData:w,parentDataProperty:b,rootData:f=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=F.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e!="string"?(F.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1):e==="auto"||e==="webrtc_only"||e==="mse_only"||e==="hls_only"||e==="webrtc_then_mse"||e==="mse_then_hls"?(F.errors=t,r===0):(F.errors=[{instancePath:s,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:W.enum},message:"must be equal to one of the allowed values"}],!1)}F.evaluated={dynamicProps:!1,dynamicItems:!1};function h(e,{instancePath:s="",parentData:w,parentDataProperty:b,rootData:f=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=h.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let y;if(e.version===void 0&&(y="version")||e.projection===void 0&&(y="projection")||e.mount===void 0&&(y="mount")||e.centerX===void 0&&(y="centerX")||e.centerY===void 0&&(y="centerY")||e.radius===void 0&&(y="radius")||e.fov===void 0&&(y="fov")||e.rotation===void 0&&(y="rotation")||e.defaultYaw===void 0&&(y="defaultYaw")||e.defaultTilt===void 0&&(y="defaultTilt")||e.defaultViewFov===void 0&&(y="defaultViewFov"))return h.errors=[{instancePath:s,schemaPath:"#/required",keyword:"required",params:{missingProperty:y},message:"must have required property '"+y+"'"}],!1;if(e.version!==void 0){let a=r;if(e.version!==1)return h.errors=[{instancePath:s+"/version",schemaPath:"#/properties/version/const",keyword:"const",params:{allowedValue:1},message:"must be equal to constant"}],!1;var p=a===r}else var p=!0;if(p){if(e.projection!==void 0){let a=r;if(e.projection!=="equidistant")return h.errors=[{instancePath:s+"/projection",schemaPath:"#/properties/projection/const",keyword:"const",params:{allowedValue:"equidistant"},message:"must be equal to constant"}],!1;var p=a===r}else var p=!0;if(p){if(e.mount!==void 0){let a=r;if(e.mount!=="ceiling")return h.errors=[{instancePath:s+"/mount",schemaPath:"#/properties/mount/const",keyword:"const",params:{allowedValue:"ceiling"},message:"must be equal to constant"}],!1;var p=a===r}else var p=!0;if(p){if(e.centerX!==void 0){let a=e.centerX,_=r;if(r===_)if(typeof a=="number"&&isFinite(a)){if(a>1||isNaN(a))return h.errors=[{instancePath:s+"/centerX",schemaPath:"#/properties/centerX/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(a<0||isNaN(a))return h.errors=[{instancePath:s+"/centerX",schemaPath:"#/properties/centerX/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1}else return h.errors=[{instancePath:s+"/centerX",schemaPath:"#/properties/centerX/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=_===r}else var p=!0;if(p){if(e.centerY!==void 0){let a=e.centerY,_=r;if(r===_)if(typeof a=="number"&&isFinite(a)){if(a>1||isNaN(a))return h.errors=[{instancePath:s+"/centerY",schemaPath:"#/properties/centerY/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(a<0||isNaN(a))return h.errors=[{instancePath:s+"/centerY",schemaPath:"#/properties/centerY/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1}else return h.errors=[{instancePath:s+"/centerY",schemaPath:"#/properties/centerY/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=_===r}else var p=!0;if(p){if(e.radius!==void 0){let a=e.radius,_=r;if(r===_)if(typeof a=="number"&&isFinite(a)){if(a>1||isNaN(a))return h.errors=[{instancePath:s+"/radius",schemaPath:"#/properties/radius/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(a<.05||isNaN(a))return h.errors=[{instancePath:s+"/radius",schemaPath:"#/properties/radius/minimum",keyword:"minimum",params:{comparison:">=",limit:.05},message:"must be >= 0.05"}],!1}else return h.errors=[{instancePath:s+"/radius",schemaPath:"#/properties/radius/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=_===r}else var p=!0;if(p){if(e.fov!==void 0){let a=e.fov,_=r;if(r===_)if(typeof a=="number"&&isFinite(a)){if(a>360||isNaN(a))return h.errors=[{instancePath:s+"/fov",schemaPath:"#/properties/fov/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(a<160||isNaN(a))return h.errors=[{instancePath:s+"/fov",schemaPath:"#/properties/fov/minimum",keyword:"minimum",params:{comparison:">=",limit:160},message:"must be >= 160"}],!1}else return h.errors=[{instancePath:s+"/fov",schemaPath:"#/properties/fov/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=_===r}else var p=!0;if(p){if(e.rotation!==void 0){let a=e.rotation,_=r;if(r===_)if(typeof a=="number"&&isFinite(a)){if(a>360||isNaN(a))return h.errors=[{instancePath:s+"/rotation",schemaPath:"#/properties/rotation/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(a<-360||isNaN(a))return h.errors=[{instancePath:s+"/rotation",schemaPath:"#/properties/rotation/minimum",keyword:"minimum",params:{comparison:">=",limit:-360},message:"must be >= -360"}],!1}else return h.errors=[{instancePath:s+"/rotation",schemaPath:"#/properties/rotation/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=_===r}else var p=!0;if(p){if(e.defaultYaw!==void 0){let a=e.defaultYaw,_=r;if(r===_)if(typeof a=="number"&&isFinite(a)){if(a>360||isNaN(a))return h.errors=[{instancePath:s+"/defaultYaw",schemaPath:"#/properties/defaultYaw/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(a<-360||isNaN(a))return h.errors=[{instancePath:s+"/defaultYaw",schemaPath:"#/properties/defaultYaw/minimum",keyword:"minimum",params:{comparison:">=",limit:-360},message:"must be >= -360"}],!1}else return h.errors=[{instancePath:s+"/defaultYaw",schemaPath:"#/properties/defaultYaw/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=_===r}else var p=!0;if(p){if(e.defaultTilt!==void 0){let a=e.defaultTilt,_=r;if(r===_)if(typeof a=="number"&&isFinite(a)){if(a>30||isNaN(a))return h.errors=[{instancePath:s+"/defaultTilt",schemaPath:"#/properties/defaultTilt/maximum",keyword:"maximum",params:{comparison:"<=",limit:30},message:"must be <= 30"}],!1;if(a<-90||isNaN(a))return h.errors=[{instancePath:s+"/defaultTilt",schemaPath:"#/properties/defaultTilt/minimum",keyword:"minimum",params:{comparison:">=",limit:-90},message:"must be >= -90"}],!1}else return h.errors=[{instancePath:s+"/defaultTilt",schemaPath:"#/properties/defaultTilt/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=_===r}else var p=!0;if(p)if(e.defaultViewFov!==void 0){let a=e.defaultViewFov,_=r;if(r===_)if(typeof a=="number"&&isFinite(a)){if(a>120||isNaN(a))return h.errors=[{instancePath:s+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/maximum",keyword:"maximum",params:{comparison:"<=",limit:120},message:"must be <= 120"}],!1;if(a<20||isNaN(a))return h.errors=[{instancePath:s+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/minimum",keyword:"minimum",params:{comparison:">=",limit:20},message:"must be >= 20"}],!1}else return h.errors=[{instancePath:s+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var p=_===r}else var p=!0}}}}}}}}}}else return h.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return h.errors=t,r===0}h.evaluated={props:{version:!0,projection:!0,mount:!0,centerX:!0,centerY:!0,radius:!0,fov:!0,rotation:!0,defaultYaw:!0,defaultTilt:!0,defaultViewFov:!0},dynamicProps:!1,dynamicItems:!1};function L(e,{instancePath:s="",parentData:w,parentDataProperty:b,rootData:f=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=L.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(typeof e=="string"){if(v(e)>1023)return L.errors=[{instancePath:s,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:1023},message:"must NOT have more than 1023 characters"}],!1;if(new TextEncoder().encode(e).byteLength>1023)return L.errors=[{instancePath:s,schemaPath:"#/x-lightnvr-max-bytes",keyword:"x-lightnvr-max-bytes",params:{},message:"must fit the UTF-8 byte limit"}],!1;if(e!==""){let y,a=!0;try{y=JSON.parse(e)}catch{a=!1}if(a){let _=r;h(y,{instancePath:s,parentData:e,parentDataProperty:b,rootData:f,dynamicAnchors:d})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var p=_===r;a=p}if(!a)return L.errors=[{instancePath:s,schemaPath:"#/contentSchema",keyword:"contentSchema",params:{},message:"must contain valid JSON matching contentSchema (or be empty)"}],!1}}else return L.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return L.errors=t,r===0}L.evaluated={dynamicProps:!1,dynamicItems:!1};function c(e,{instancePath:s="",parentData:w,parentDataProperty:b,rootData:f=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=c.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),!(typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)))return c.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(r===0&&typeof e=="number"&&isFinite(e)){if(e>2147483647||isNaN(e))return c.errors=[{instancePath:s,schemaPath:"#/maximum",keyword:"maximum",params:{comparison:"<=",limit:2147483647},message:"must be <= 2147483647"}],!1;if(e<-2147483648||isNaN(e))return c.errors=[{instancePath:s,schemaPath:"#/minimum",keyword:"minimum",params:{comparison:">=",limit:-2147483648},message:"must be >= -2147483648"}],!1}return c.errors=t,r===0}c.evaluated={dynamicProps:!1,dynamicItems:!1};var H={type:"integer",enum:[0,1],$id:"urn:lightnvr:contract:StreamProtocol"};function I(e,{instancePath:s="",parentData:w,parentDataProperty:b,rootData:f=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=I.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)?e===0||e===1?(I.errors=t,r===0):(I.errors=[{instancePath:s,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:H.enum},message:"must be equal to one of the allowed values"}],!1):(I.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1)}I.evaluated={dynamicProps:!1,dynamicItems:!1};function N(e,{instancePath:s="",parentData:w,parentDataProperty:b,rootData:f=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=N.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),!(typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)))return N.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(r===0&&typeof e=="number"&&isFinite(e)){if(e>365||isNaN(e))return N.errors=[{instancePath:s,schemaPath:"#/maximum",keyword:"maximum",params:{comparison:"<=",limit:365},message:"must be <= 365"}],!1;if(e<-1||isNaN(e))return N.errors=[{instancePath:s,schemaPath:"#/minimum",keyword:"minimum",params:{comparison:">=",limit:-1},message:"must be >= -1"}],!1}return N.errors=t,r===0}N.evaluated={dynamicProps:!1,dynamicItems:!1};function k(e,{instancePath:s="",parentData:w,parentDataProperty:b,rootData:f=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=k.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(Array.isArray(e)){if(e.length>168)return k.errors=[{instancePath:s,schemaPath:"#/maxItems",keyword:"maxItems",params:{limit:168},message:"must NOT have more than 168 items"}],!1;if(e.length<168)return k.errors=[{instancePath:s,schemaPath:"#/minItems",keyword:"minItems",params:{limit:168},message:"must NOT have fewer than 168 items"}],!1;{var p=!0;let y=e.length;for(let a=0;a511)return m.errors=[{instancePath:s+"/url",schemaPath:"#/properties/url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return m.errors=[{instancePath:s+"/url",schemaPath:"#/properties/url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=l===r}else var i=!0;if(i){if(e.enabled!==void 0){let n=r;if(typeof e.enabled!="boolean")return m.errors=[{instancePath:s+"/enabled",schemaPath:"#/properties/enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=n===r}else var i=!0;if(i){if(e.streaming_enabled!==void 0){let n=r;if(typeof e.streaming_enabled!="boolean")return m.errors=[{instancePath:s+"/streaming_enabled",schemaPath:"#/properties/streaming_enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=n===r}else var i=!0;if(i){if(e.playback_transport!==void 0){let n=r;F(e.playback_transport,{instancePath:s+"/playback_transport",parentData:e,parentDataProperty:"playback_transport",rootData:f,dynamicAnchors:d})||(t=t===null?F.errors:t.concat(F.errors),r=t.length);var i=n===r}else var i=!0;if(i){if(e.eptz_config!==void 0){let n=r;L(e.eptz_config,{instancePath:s+"/eptz_config",parentData:e,parentDataProperty:"eptz_config",rootData:f,dynamicAnchors:d})||(t=t===null?L.errors:t.concat(L.errors),r=t.length);var i=n===r}else var i=!0;if(i){if(e.width!==void 0){let n=r;c(e.width,{instancePath:s+"/width",parentData:e,parentDataProperty:"width",rootData:f,dynamicAnchors:d})||(t=t===null?c.errors:t.concat(c.errors),r=t.length);var i=n===r}else var i=!0;if(i){if(e.height!==void 0){let n=r;c(e.height,{instancePath:s+"/height",parentData:e,parentDataProperty:"height",rootData:f,dynamicAnchors:d})||(t=t===null?c.errors:t.concat(c.errors),r=t.length);var i=n===r}else var i=!0;if(i){if(e.fps!==void 0){let n=r;c(e.fps,{instancePath:s+"/fps",parentData:e,parentDataProperty:"fps",rootData:f,dynamicAnchors:d})||(t=t===null?c.errors:t.concat(c.errors),r=t.length);var i=n===r}else var i=!0;if(i){if(e.codec!==void 0){let n=e.codec,l=r;if(r===l)if(typeof n=="string"){if(v(n)>15)return m.errors=[{instancePath:s+"/codec",schemaPath:"#/properties/codec/maxLength",keyword:"maxLength",params:{limit:15},message:"must NOT have more than 15 characters"}],!1}else return m.errors=[{instancePath:s+"/codec",schemaPath:"#/properties/codec/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=l===r}else var i=!0;if(i){if(e.priority!==void 0){let n=r;c(e.priority,{instancePath:s+"/priority",parentData:e,parentDataProperty:"priority",rootData:f,dynamicAnchors:d})||(t=t===null?c.errors:t.concat(c.errors),r=t.length);var i=n===r}else var i=!0;if(i){if(e.record!==void 0){let n=r;if(typeof e.record!="boolean")return m.errors=[{instancePath:s+"/record",schemaPath:"#/properties/record/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=n===r}else var i=!0;if(i){if(e.segment_duration!==void 0){let n=r;c(e.segment_duration,{instancePath:s+"/segment_duration",parentData:e,parentDataProperty:"segment_duration",rootData:f,dynamicAnchors:d})||(t=t===null?c.errors:t.concat(c.errors),r=t.length);var i=n===r}else var i=!0;if(i){if(e.detection_based_recording!==void 0){let n=r;if(typeof e.detection_based_recording!="boolean")return m.errors=[{instancePath:s+"/detection_based_recording",schemaPath:"#/properties/detection_based_recording/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=n===r}else var i=!0;if(i){if(e.detection_model!==void 0){let n=e.detection_model,l=r;if(r===l)if(typeof n=="string"){if(v(n)>511)return m.errors=[{instancePath:s+"/detection_model",schemaPath:"#/properties/detection_model/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return m.errors=[{instancePath:s+"/detection_model",schemaPath:"#/properties/detection_model/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=l===r}else var i=!0;if(i){if(e.detection_threshold!==void 0){let n=e.detection_threshold,l=r;if(!(typeof n=="number"&&!(n%1)&&!isNaN(n)&&isFinite(n)))return m.errors=[{instancePath:s+"/detection_threshold",schemaPath:"#/properties/detection_threshold/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;var i=l===r}else var i=!0;if(i){if(e.detection_interval!==void 0){let n=r;c(e.detection_interval,{instancePath:s+"/detection_interval",parentData:e,parentDataProperty:"detection_interval",rootData:f,dynamicAnchors:d})||(t=t===null?c.errors:t.concat(c.errors),r=t.length);var i=n===r}else var i=!0;if(i){if(e.pre_detection_buffer!==void 0){let n=r;c(e.pre_detection_buffer,{instancePath:s+"/pre_detection_buffer",parentData:e,parentDataProperty:"pre_detection_buffer",rootData:f,dynamicAnchors:d})||(t=t===null?c.errors:t.concat(c.errors),r=t.length);var i=n===r}else var i=!0;if(i){if(e.post_detection_buffer!==void 0){let n=r;c(e.post_detection_buffer,{instancePath:s+"/post_detection_buffer",parentData:e,parentDataProperty:"post_detection_buffer",rootData:f,dynamicAnchors:d})||(t=t===null?c.errors:t.concat(c.errors),r=t.length);var i=n===r}else var i=!0;if(i){if(e.detection_object_filter!==void 0){let n=e.detection_object_filter,l=r;if(r===l)if(typeof n=="string"){if(v(n)>15)return m.errors=[{instancePath:s+"/detection_object_filter",schemaPath:"#/properties/detection_object_filter/maxLength",keyword:"maxLength",params:{limit:15},message:"must NOT have more than 15 characters"}],!1}else return m.errors=[{instancePath:s+"/detection_object_filter",schemaPath:"#/properties/detection_object_filter/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=l===r}else var i=!0;if(i){if(e.detection_object_filter_list!==void 0){let n=e.detection_object_filter_list,l=r;if(r===l)if(typeof n=="string"){if(v(n)>255)return m.errors=[{instancePath:s+"/detection_object_filter_list",schemaPath:"#/properties/detection_object_filter_list/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1}else return m.errors=[{instancePath:s+"/detection_object_filter_list",schemaPath:"#/properties/detection_object_filter_list/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=l===r}else var i=!0;if(i){if(e.protocol!==void 0){let n=r;I(e.protocol,{instancePath:s+"/protocol",parentData:e,parentDataProperty:"protocol",rootData:f,dynamicAnchors:d})||(t=t===null?I.errors:t.concat(I.errors),r=t.length);var i=n===r}else var i=!0;if(i){if(e.record_audio!==void 0){let n=r;if(typeof e.record_audio!="boolean")return m.errors=[{instancePath:s+"/record_audio",schemaPath:"#/properties/record_audio/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=n===r}else var i=!0;if(i){if(e.audio_voice_enhancement!==void 0){let n=r;if(typeof e.audio_voice_enhancement!="boolean")return m.errors=[{instancePath:s+"/audio_voice_enhancement",schemaPath:"#/properties/audio_voice_enhancement/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=n===r}else var i=!0;if(i){if(e.isOnvif!==void 0){let n=r;if(typeof e.isOnvif!="boolean")return m.errors=[{instancePath:s+"/isOnvif",schemaPath:"#/properties/isOnvif/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=n===r}else var i=!0;if(i){if(e.backchannel_enabled!==void 0){let n=r;if(typeof e.backchannel_enabled!="boolean")return m.errors=[{instancePath:s+"/backchannel_enabled",schemaPath:"#/properties/backchannel_enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=n===r}else var i=!0;if(i){if(e.retention_days!==void 0){let n=r;N(e.retention_days,{instancePath:s+"/retention_days",parentData:e,parentDataProperty:"retention_days",rootData:f,dynamicAnchors:d})||(t=t===null?N.errors:t.concat(N.errors),r=t.length);var i=n===r}else var i=!0;if(i){if(e.detection_retention_days!==void 0){let n=r;N(e.detection_retention_days,{instancePath:s+"/detection_retention_days",parentData:e,parentDataProperty:"detection_retention_days",rootData:f,dynamicAnchors:d})||(t=t===null?N.errors:t.concat(N.errors),r=t.length);var i=n===r}else var i=!0;if(i){if(e.max_storage_mb!==void 0){let n=r;c(e.max_storage_mb,{instancePath:s+"/max_storage_mb",parentData:e,parentDataProperty:"max_storage_mb",rootData:f,dynamicAnchors:d})||(t=t===null?c.errors:t.concat(c.errors),r=t.length);var i=n===r}else var i=!0;if(i){if(e.tier_critical_multiplier!==void 0){let n=e.tier_critical_multiplier,l=r;if(!(typeof n=="number"&&isFinite(n)))return m.errors=[{instancePath:s+"/tier_critical_multiplier",schemaPath:"#/properties/tier_critical_multiplier/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var i=l===r}else var i=!0;if(i){if(e.tier_important_multiplier!==void 0){let n=e.tier_important_multiplier,l=r;if(!(typeof n=="number"&&isFinite(n)))return m.errors=[{instancePath:s+"/tier_important_multiplier",schemaPath:"#/properties/tier_important_multiplier/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var i=l===r}else var i=!0;if(i){if(e.tier_ephemeral_multiplier!==void 0){let n=e.tier_ephemeral_multiplier,l=r;if(!(typeof n=="number"&&isFinite(n)))return m.errors=[{instancePath:s+"/tier_ephemeral_multiplier",schemaPath:"#/properties/tier_ephemeral_multiplier/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var i=l===r}else var i=!0;if(i){if(e.storage_priority!==void 0){let n=r;c(e.storage_priority,{instancePath:s+"/storage_priority",parentData:e,parentDataProperty:"storage_priority",rootData:f,dynamicAnchors:d})||(t=t===null?c.errors:t.concat(c.errors),r=t.length);var i=n===r}else var i=!0;if(i){if(e.ptz_enabled!==void 0){let n=r;if(typeof e.ptz_enabled!="boolean")return m.errors=[{instancePath:s+"/ptz_enabled",schemaPath:"#/properties/ptz_enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=n===r}else var i=!0;if(i){if(e.ptz_max_x!==void 0){let n=r;c(e.ptz_max_x,{instancePath:s+"/ptz_max_x",parentData:e,parentDataProperty:"ptz_max_x",rootData:f,dynamicAnchors:d})||(t=t===null?c.errors:t.concat(c.errors),r=t.length);var i=n===r}else var i=!0;if(i){if(e.ptz_max_y!==void 0){let n=r;c(e.ptz_max_y,{instancePath:s+"/ptz_max_y",parentData:e,parentDataProperty:"ptz_max_y",rootData:f,dynamicAnchors:d})||(t=t===null?c.errors:t.concat(c.errors),r=t.length);var i=n===r}else var i=!0;if(i){if(e.ptz_max_z!==void 0){let n=r;c(e.ptz_max_z,{instancePath:s+"/ptz_max_z",parentData:e,parentDataProperty:"ptz_max_z",rootData:f,dynamicAnchors:d})||(t=t===null?c.errors:t.concat(c.errors),r=t.length);var i=n===r}else var i=!0;if(i){if(e.ptz_has_home!==void 0){let n=r;if(typeof e.ptz_has_home!="boolean")return m.errors=[{instancePath:s+"/ptz_has_home",schemaPath:"#/properties/ptz_has_home/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=n===r}else var i=!0;if(i){if(e.onvif_username!==void 0){let n=e.onvif_username,l=r;if(r===l)if(typeof n=="string"){if(v(n)>63)return m.errors=[{instancePath:s+"/onvif_username",schemaPath:"#/properties/onvif_username/maxLength",keyword:"maxLength",params:{limit:63},message:"must NOT have more than 63 characters"}],!1}else return m.errors=[{instancePath:s+"/onvif_username",schemaPath:"#/properties/onvif_username/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=l===r}else var i=!0;if(i){if(e.onvif_password!==void 0){let n=e.onvif_password,l=r;if(r===l)if(typeof n=="string"){if(v(n)>63)return m.errors=[{instancePath:s+"/onvif_password",schemaPath:"#/properties/onvif_password/maxLength",keyword:"maxLength",params:{limit:63},message:"must NOT have more than 63 characters"}],!1}else return m.errors=[{instancePath:s+"/onvif_password",schemaPath:"#/properties/onvif_password/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=l===r}else var i=!0;if(i){if(e.onvif_profile!==void 0){let n=e.onvif_profile,l=r;if(r===l)if(typeof n=="string"){if(v(n)>63)return m.errors=[{instancePath:s+"/onvif_profile",schemaPath:"#/properties/onvif_profile/maxLength",keyword:"maxLength",params:{limit:63},message:"must NOT have more than 63 characters"}],!1}else return m.errors=[{instancePath:s+"/onvif_profile",schemaPath:"#/properties/onvif_profile/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=l===r}else var i=!0;if(i){if(e.onvif_port!==void 0){let n=r;c(e.onvif_port,{instancePath:s+"/onvif_port",parentData:e,parentDataProperty:"onvif_port",rootData:f,dynamicAnchors:d})||(t=t===null?c.errors:t.concat(c.errors),r=t.length);var i=n===r}else var i=!0;if(i){if(e.record_on_schedule!==void 0){let n=r;if(typeof e.record_on_schedule!="boolean")return m.errors=[{instancePath:s+"/record_on_schedule",schemaPath:"#/properties/record_on_schedule/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=n===r}else var i=!0;if(i){if(e.recording_schedule!==void 0){let n=r;k(e.recording_schedule,{instancePath:s+"/recording_schedule",parentData:e,parentDataProperty:"recording_schedule",rootData:f,dynamicAnchors:d})||(t=t===null?k.errors:t.concat(k.errors),r=t.length);var i=n===r}else var i=!0;if(i){if(e.detection_record_on_schedule!==void 0){let n=r;if(typeof e.detection_record_on_schedule!="boolean")return m.errors=[{instancePath:s+"/detection_record_on_schedule",schemaPath:"#/properties/detection_record_on_schedule/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=n===r}else var i=!0;if(i){if(e.detection_recording_schedule!==void 0){let n=r;k(e.detection_recording_schedule,{instancePath:s+"/detection_recording_schedule",parentData:e,parentDataProperty:"detection_recording_schedule",rootData:f,dynamicAnchors:d})||(t=t===null?k.errors:t.concat(k.errors),r=t.length);var i=n===r}else var i=!0;if(i){if(e.tags!==void 0){let n=e.tags,l=r;if(r===l)if(typeof n=="string"){if(v(n)>255)return m.errors=[{instancePath:s+"/tags",schemaPath:"#/properties/tags/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1}else return m.errors=[{instancePath:s+"/tags",schemaPath:"#/properties/tags/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=l===r}else var i=!0;if(i){if(e.admin_url!==void 0){let n=e.admin_url,l=r;if(r===l)if(typeof n=="string"){if(v(n)>511)return m.errors=[{instancePath:s+"/admin_url",schemaPath:"#/properties/admin_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return m.errors=[{instancePath:s+"/admin_url",schemaPath:"#/properties/admin_url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=l===r}else var i=!0;if(i){if(e.privacy_mode!==void 0){let n=r;if(typeof e.privacy_mode!="boolean")return m.errors=[{instancePath:s+"/privacy_mode",schemaPath:"#/properties/privacy_mode/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=n===r}else var i=!0;if(i){if(e.can_control_privacy!==void 0){let n=r;if(typeof e.can_control_privacy!="boolean")return m.errors=[{instancePath:s+"/can_control_privacy",schemaPath:"#/properties/can_control_privacy/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=n===r}else var i=!0;if(i){if(e.motion_trigger_source!==void 0){let n=e.motion_trigger_source,l=r;if(r===l)if(typeof n=="string"){if(v(n)>255)return m.errors=[{instancePath:s+"/motion_trigger_source",schemaPath:"#/properties/motion_trigger_source/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1}else return m.errors=[{instancePath:s+"/motion_trigger_source",schemaPath:"#/properties/motion_trigger_source/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=l===r}else var i=!0;if(i){if(e.go2rtc_source_override!==void 0){let n=e.go2rtc_source_override,l=r;if(r===l)if(typeof n=="string"){if(v(n)>8191)return m.errors=[{instancePath:s+"/go2rtc_source_override",schemaPath:"#/properties/go2rtc_source_override/maxLength",keyword:"maxLength",params:{limit:8191},message:"must NOT have more than 8191 characters"}],!1}else return m.errors=[{instancePath:s+"/go2rtc_source_override",schemaPath:"#/properties/go2rtc_source_override/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=l===r}else var i=!0;if(i){if(e.sub_stream_url!==void 0){let n=e.sub_stream_url,l=r;if(r===l)if(typeof n=="string"){if(v(n)>511)return m.errors=[{instancePath:s+"/sub_stream_url",schemaPath:"#/properties/sub_stream_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return m.errors=[{instancePath:s+"/sub_stream_url",schemaPath:"#/properties/sub_stream_url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=l===r}else var i=!0;if(i){if(e.has_sub_stream!==void 0){let n=r;if(typeof e.has_sub_stream!="boolean")return m.errors=[{instancePath:s+"/has_sub_stream",schemaPath:"#/properties/has_sub_stream/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=n===r}else var i=!0;if(i){if(e.detection_url!==void 0){let n=e.detection_url,l=r;if(r===l)if(typeof n=="string"){if(v(n)>511)return m.errors=[{instancePath:s+"/detection_url",schemaPath:"#/properties/detection_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return m.errors=[{instancePath:s+"/detection_url",schemaPath:"#/properties/detection_url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=l===r}else var i=!0;if(i){if(e.publish_url!==void 0){let n=e.publish_url,l=r;if(r===l)if(typeof n=="string"){if(v(n)>511)return m.errors=[{instancePath:s+"/publish_url",schemaPath:"#/properties/publish_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return m.errors=[{instancePath:s+"/publish_url",schemaPath:"#/properties/publish_url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=l===r}else var i=!0;if(i){if(e.status!==void 0){let n=r;$(e.status,{instancePath:s+"/status",parentData:e,parentDataProperty:"status",rootData:f,dynamicAnchors:d})||(t=t===null?$.errors:t.concat($.errors),r=t.length);var i=n===r}else var i=!0;if(i){if(e.error_message!==void 0){let n=e.error_message,l=r;if(r===l)if(typeof n=="string"){if(v(n)>255)return m.errors=[{instancePath:s+"/error_message",schemaPath:"#/properties/error_message/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1;if(v(n)<1)return m.errors=[{instancePath:s+"/error_message",schemaPath:"#/properties/error_message/minLength",keyword:"minLength",params:{limit:1},message:"must NOT have fewer than 1 characters"}],!1}else return m.errors=[{instancePath:s+"/error_message",schemaPath:"#/properties/error_message/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=l===r}else var i=!0;if(i)if(e.go2rtc_hls_available!==void 0){let n=r;if(typeof e.go2rtc_hls_available!="boolean")return m.errors=[{instancePath:s+"/go2rtc_hls_available",schemaPath:"#/properties/go2rtc_hls_available/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=n===r}else var i=!0}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}else return m.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return m.errors=t,r===0}m.evaluated={props:{camera_uuid:!0,location_uuid:!0,name:!0,url:!0,enabled:!0,streaming_enabled:!0,playback_transport:!0,eptz_config:!0,width:!0,height:!0,fps:!0,codec:!0,priority:!0,record:!0,segment_duration:!0,detection_based_recording:!0,detection_model:!0,detection_threshold:!0,detection_interval:!0,pre_detection_buffer:!0,post_detection_buffer:!0,detection_object_filter:!0,detection_object_filter_list:!0,protocol:!0,record_audio:!0,audio_voice_enhancement:!0,isOnvif:!0,backchannel_enabled:!0,retention_days:!0,detection_retention_days:!0,max_storage_mb:!0,tier_critical_multiplier:!0,tier_important_multiplier:!0,tier_ephemeral_multiplier:!0,storage_priority:!0,ptz_enabled:!0,ptz_max_x:!0,ptz_max_y:!0,ptz_max_z:!0,ptz_has_home:!0,onvif_username:!0,onvif_password:!0,onvif_profile:!0,onvif_port:!0,record_on_schedule:!0,recording_schedule:!0,detection_record_on_schedule:!0,detection_recording_schedule:!0,tags:!0,admin_url:!0,privacy_mode:!0,can_control_privacy:!0,motion_trigger_source:!0,go2rtc_source_override:!0,sub_stream_url:!0,has_sub_stream:!0,detection_url:!0,publish_url:!0,status:!0,error_message:!0,go2rtc_hls_available:!0},dynamicProps:!1,dynamicItems:!1};var J=new RegExp("^(?![A-Za-z][A-Za-z0-9+.-]*://[^/?#]*@)","u");function O(e,{instancePath:s="",parentData:w,parentDataProperty:b,rootData:f=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=O.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(typeof e=="string"){if(v(e)>511)return O.errors=[{instancePath:s,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1;if(!J.test(e))return O.errors=[{instancePath:s,schemaPath:"#/pattern",keyword:"pattern",params:{pattern:"^(?![A-Za-z][A-Za-z0-9+.-]*://[^/?#]*@)"},message:'must match pattern "^(?![A-Za-z][A-Za-z0-9+.-]*://[^/?#]*@)"'}],!1}else return O.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return O.errors=t,r===0}O.evaluated={dynamicProps:!1,dynamicItems:!1};function j(e,{instancePath:s="",parentData:w,parentDataProperty:b,rootData:f=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=j.evaluated;o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0);let p=r;m(e,{instancePath:s,parentData:w,parentDataProperty:b,rootData:f,dynamicAnchors:d})||(t=t===null?m.errors:t.concat(m.errors),r=t.length);var y=p===r;if(y){let S=r,i=r,u=!0,n=r,l=r,x=!1,Y=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let g;if(e.isOnvif===void 0&&(g="isOnvif")){let P={};t===null?t=[P]:t.push(P),r++}else if(e.isOnvif!==void 0&&e.isOnvif!==!0){let P={};t===null?t=[P]:t.push(P),r++}}var _=Y===r;if(x=x||_,_){var a={};a.isOnvif=!0}let E=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let g;if(e.onvif_username===void 0&&(g="onvif_username")){let P={};t===null?t=[P]:t.push(P),r++}else if(e.onvif_username!==void 0){let P=e.onvif_username;if(typeof P=="string"&&v(P)<1){let q={};t===null?t=[q]:t.push(q),r++}}}var _=E===r;x=x||_,_&&a!==!0&&(a=a||{},a.onvif_username=!0);let R=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let g;if(e.onvif_password===void 0&&(g="onvif_password")){let P={};t===null?t=[P]:t.push(P),r++}else if(e.onvif_password!==void 0){let P=e.onvif_password;if(typeof P=="string"&&v(P)<1){let q={};t===null?t=[q]:t.push(q),r++}}}var _=R===r;if(x=x||_,_&&a!==!0&&(a=a||{},a.onvif_password=!0),x)r=l,t!==null&&(l?t.length=l:t=null);else{let g={};t===null?t=[g]:t.push(g),r++}var T=n===r;if(r=i,t!==null&&(i?t.length=i:t=null),T){let g=r;e&&typeof e=="object"&&!Array.isArray(e)&&e.url!==void 0&&(O(e.url,{instancePath:s+"/url",parentData:e,parentDataProperty:"url",rootData:f,dynamicAnchors:d})||(t=t===null?O.errors:t.concat(O.errors),r=t.length));var T=g===r;u=T,u&&a!==!0&&(a=a||{},a.url=!0)}if(!u){let g={instancePath:s,schemaPath:"#/allOf/1/if",keyword:"if",params:{failingKeyword:"then"},message:'must match "then" schema'};return t===null?t=[g]:t.push(g),r++,j.errors=t,!1}if(r===S)if(e&&typeof e=="object"&&!Array.isArray(e)){let g;if(e.url===void 0&&(g="url")||e.onvif_username===void 0&&(g="onvif_username")||e.onvif_password===void 0&&(g="onvif_password")||e.admin_url===void 0&&(g="admin_url")||e.go2rtc_source_override===void 0&&(g="go2rtc_source_override")||e.sub_stream_url===void 0&&(g="sub_stream_url")||e.detection_url===void 0&&(g="detection_url")||e.publish_url===void 0&&(g="publish_url"))return j.errors=[{instancePath:s,schemaPath:"#/allOf/1/required",keyword:"required",params:{missingProperty:g},message:"must have required property '"+g+"'"}],!1;if(a!==!0&&(a=a||{},a.can_control_privacy=!0),e.can_control_privacy!==void 0&&e.can_control_privacy!==!0)return j.errors=[{instancePath:s+"/can_control_privacy",schemaPath:"#/allOf/1/properties/can_control_privacy/const",keyword:"const",params:{allowedValue:!0},message:"must be equal to constant"}],!1}else return j.errors=[{instancePath:s,schemaPath:"#/allOf/1/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;var y=S===r;y&&a!==!0&&(a=a||{},a.camera_uuid=!0,a.location_uuid=!0,a.name=!0,a.url=!0,a.enabled=!0,a.streaming_enabled=!0,a.playback_transport=!0,a.eptz_config=!0,a.width=!0,a.height=!0,a.fps=!0,a.codec=!0,a.priority=!0,a.record=!0,a.segment_duration=!0,a.detection_based_recording=!0,a.detection_model=!0,a.detection_threshold=!0,a.detection_interval=!0,a.pre_detection_buffer=!0,a.post_detection_buffer=!0,a.detection_object_filter=!0,a.detection_object_filter_list=!0,a.protocol=!0,a.record_audio=!0,a.audio_voice_enhancement=!0,a.isOnvif=!0,a.backchannel_enabled=!0,a.retention_days=!0,a.detection_retention_days=!0,a.max_storage_mb=!0,a.tier_critical_multiplier=!0,a.tier_important_multiplier=!0,a.tier_ephemeral_multiplier=!0,a.storage_priority=!0,a.ptz_enabled=!0,a.ptz_max_x=!0,a.ptz_max_y=!0,a.ptz_max_z=!0,a.ptz_has_home=!0,a.onvif_username=!0,a.onvif_password=!0,a.onvif_profile=!0,a.onvif_port=!0,a.record_on_schedule=!0,a.recording_schedule=!0,a.detection_record_on_schedule=!0,a.detection_recording_schedule=!0,a.tags=!0,a.admin_url=!0,a.privacy_mode=!0,a.can_control_privacy=!0,a.motion_trigger_source=!0,a.go2rtc_source_override=!0,a.sub_stream_url=!0,a.has_sub_stream=!0,a.detection_url=!0,a.publish_url=!0,a.status=!0,a.error_message=!0,a.go2rtc_hls_available=!0)}return j.errors=t,o.props=a,r===0}j.evaluated={dynamicProps:!0,dynamicItems:!1};function A(e,{instancePath:s="",parentData:w,parentDataProperty:b,rootData:f=e,dynamicAnchors:d={}}={}){let t=null,r=0,o=A.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let p;if(e.stream===void 0&&(p="stream"))return A.errors=[{instancePath:s,schemaPath:"#/required",keyword:"required",params:{missingProperty:p},message:"must have required property '"+p+"'"}],!1;e.stream!==void 0&&(j(e.stream,{instancePath:s+"/stream",parentData:e,parentDataProperty:"stream",rootData:f,dynamicAnchors:d})||(t=t===null?j.errors:t.concat(j.errors),r=t.length))}else return A.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return A.errors=t,r===0}A.evaluated={props:{stream:!0},dynamicProps:!1,dynamicItems:!1};export{G as validateStreamFullResponseConfigurable}; diff --git a/web/js/api/generated/validators/StreamFullResponseLiveOnly.d.mts b/web/js/api/generated/validators/StreamFullResponseLiveOnly.d.mts new file mode 100644 index 000000000..d821d1dba --- /dev/null +++ b/web/js/api/generated/validators/StreamFullResponseLiveOnly.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateStreamFullResponseLiveOnly } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/StreamFullResponseLiveOnly.mjs b/web/js/api/generated/validators/StreamFullResponseLiveOnly.mjs new file mode 100644 index 000000000..51d19b6b3 --- /dev/null +++ b/web/js/api/generated/validators/StreamFullResponseLiveOnly.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var X=(e,s)=>()=>{try{return s||e((s={exports:{}}).exports,s),s.exports}catch(b){throw s=0,b}};var U=X(q=>{"use strict";Object.defineProperty(q,"__esModule",{value:!0});function V(e){let s=e.length,b=0,v=0,p;for(;v=55296&&p<=56319&&v36)return x.errors=[{instancePath:s,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:36},message:"must NOT have more than 36 characters"}],!1;if(!C.test(e))return x.errors=[{instancePath:s,schemaPath:"#/pattern",keyword:"pattern",params:{pattern:"^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$"},message:'must match pattern "^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$"'}],!1}else return x.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return x.errors=t,r===0}x.evaluated={dynamicProps:!1,dynamicItems:!1};function D(e,{instancePath:s="",parentData:b,parentDataProperty:v,rootData:p=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=D.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(typeof e=="string"){if(w(e)>255)return D.errors=[{instancePath:s,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1;if(w(e)<1)return D.errors=[{instancePath:s,schemaPath:"#/minLength",keyword:"minLength",params:{limit:1},message:"must NOT have fewer than 1 characters"}],!1;if(new TextEncoder().encode(e).byteLength>255)return D.errors=[{instancePath:s,schemaPath:"#/x-lightnvr-max-bytes",keyword:"x-lightnvr-max-bytes",params:{},message:"must fit the UTF-8 byte limit"}],!1}else return D.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return D.errors=t,r===0}D.evaluated={dynamicProps:!1,dynamicItems:!1};var W={type:"string",enum:["auto","webrtc_only","mse_only","hls_only","webrtc_then_mse","mse_then_hls"],$id:"urn:lightnvr:contract:PlaybackTransport"};function $(e,{instancePath:s="",parentData:b,parentDataProperty:v,rootData:p=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=$.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e!="string"?($.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1):e==="auto"||e==="webrtc_only"||e==="mse_only"||e==="hls_only"||e==="webrtc_then_mse"||e==="mse_then_hls"?($.errors=t,r===0):($.errors=[{instancePath:s,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:W.enum},message:"must be equal to one of the allowed values"}],!1)}$.evaluated={dynamicProps:!1,dynamicItems:!1};function h(e,{instancePath:s="",parentData:b,parentDataProperty:v,rootData:p=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=h.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let y;if(e.version===void 0&&(y="version")||e.projection===void 0&&(y="projection")||e.mount===void 0&&(y="mount")||e.centerX===void 0&&(y="centerX")||e.centerY===void 0&&(y="centerY")||e.radius===void 0&&(y="radius")||e.fov===void 0&&(y="fov")||e.rotation===void 0&&(y="rotation")||e.defaultYaw===void 0&&(y="defaultYaw")||e.defaultTilt===void 0&&(y="defaultTilt")||e.defaultViewFov===void 0&&(y="defaultViewFov"))return h.errors=[{instancePath:s,schemaPath:"#/required",keyword:"required",params:{missingProperty:y},message:"must have required property '"+y+"'"}],!1;if(e.version!==void 0){let a=r;if(e.version!==1)return h.errors=[{instancePath:s+"/version",schemaPath:"#/properties/version/const",keyword:"const",params:{allowedValue:1},message:"must be equal to constant"}],!1;var d=a===r}else var d=!0;if(d){if(e.projection!==void 0){let a=r;if(e.projection!=="equidistant")return h.errors=[{instancePath:s+"/projection",schemaPath:"#/properties/projection/const",keyword:"const",params:{allowedValue:"equidistant"},message:"must be equal to constant"}],!1;var d=a===r}else var d=!0;if(d){if(e.mount!==void 0){let a=r;if(e.mount!=="ceiling")return h.errors=[{instancePath:s+"/mount",schemaPath:"#/properties/mount/const",keyword:"const",params:{allowedValue:"ceiling"},message:"must be equal to constant"}],!1;var d=a===r}else var d=!0;if(d){if(e.centerX!==void 0){let a=e.centerX,c=r;if(r===c)if(typeof a=="number"&&isFinite(a)){if(a>1||isNaN(a))return h.errors=[{instancePath:s+"/centerX",schemaPath:"#/properties/centerX/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(a<0||isNaN(a))return h.errors=[{instancePath:s+"/centerX",schemaPath:"#/properties/centerX/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1}else return h.errors=[{instancePath:s+"/centerX",schemaPath:"#/properties/centerX/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var d=c===r}else var d=!0;if(d){if(e.centerY!==void 0){let a=e.centerY,c=r;if(r===c)if(typeof a=="number"&&isFinite(a)){if(a>1||isNaN(a))return h.errors=[{instancePath:s+"/centerY",schemaPath:"#/properties/centerY/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(a<0||isNaN(a))return h.errors=[{instancePath:s+"/centerY",schemaPath:"#/properties/centerY/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1}else return h.errors=[{instancePath:s+"/centerY",schemaPath:"#/properties/centerY/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var d=c===r}else var d=!0;if(d){if(e.radius!==void 0){let a=e.radius,c=r;if(r===c)if(typeof a=="number"&&isFinite(a)){if(a>1||isNaN(a))return h.errors=[{instancePath:s+"/radius",schemaPath:"#/properties/radius/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(a<.05||isNaN(a))return h.errors=[{instancePath:s+"/radius",schemaPath:"#/properties/radius/minimum",keyword:"minimum",params:{comparison:">=",limit:.05},message:"must be >= 0.05"}],!1}else return h.errors=[{instancePath:s+"/radius",schemaPath:"#/properties/radius/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var d=c===r}else var d=!0;if(d){if(e.fov!==void 0){let a=e.fov,c=r;if(r===c)if(typeof a=="number"&&isFinite(a)){if(a>360||isNaN(a))return h.errors=[{instancePath:s+"/fov",schemaPath:"#/properties/fov/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(a<160||isNaN(a))return h.errors=[{instancePath:s+"/fov",schemaPath:"#/properties/fov/minimum",keyword:"minimum",params:{comparison:">=",limit:160},message:"must be >= 160"}],!1}else return h.errors=[{instancePath:s+"/fov",schemaPath:"#/properties/fov/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var d=c===r}else var d=!0;if(d){if(e.rotation!==void 0){let a=e.rotation,c=r;if(r===c)if(typeof a=="number"&&isFinite(a)){if(a>360||isNaN(a))return h.errors=[{instancePath:s+"/rotation",schemaPath:"#/properties/rotation/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(a<-360||isNaN(a))return h.errors=[{instancePath:s+"/rotation",schemaPath:"#/properties/rotation/minimum",keyword:"minimum",params:{comparison:">=",limit:-360},message:"must be >= -360"}],!1}else return h.errors=[{instancePath:s+"/rotation",schemaPath:"#/properties/rotation/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var d=c===r}else var d=!0;if(d){if(e.defaultYaw!==void 0){let a=e.defaultYaw,c=r;if(r===c)if(typeof a=="number"&&isFinite(a)){if(a>360||isNaN(a))return h.errors=[{instancePath:s+"/defaultYaw",schemaPath:"#/properties/defaultYaw/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(a<-360||isNaN(a))return h.errors=[{instancePath:s+"/defaultYaw",schemaPath:"#/properties/defaultYaw/minimum",keyword:"minimum",params:{comparison:">=",limit:-360},message:"must be >= -360"}],!1}else return h.errors=[{instancePath:s+"/defaultYaw",schemaPath:"#/properties/defaultYaw/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var d=c===r}else var d=!0;if(d){if(e.defaultTilt!==void 0){let a=e.defaultTilt,c=r;if(r===c)if(typeof a=="number"&&isFinite(a)){if(a>30||isNaN(a))return h.errors=[{instancePath:s+"/defaultTilt",schemaPath:"#/properties/defaultTilt/maximum",keyword:"maximum",params:{comparison:"<=",limit:30},message:"must be <= 30"}],!1;if(a<-90||isNaN(a))return h.errors=[{instancePath:s+"/defaultTilt",schemaPath:"#/properties/defaultTilt/minimum",keyword:"minimum",params:{comparison:">=",limit:-90},message:"must be >= -90"}],!1}else return h.errors=[{instancePath:s+"/defaultTilt",schemaPath:"#/properties/defaultTilt/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var d=c===r}else var d=!0;if(d)if(e.defaultViewFov!==void 0){let a=e.defaultViewFov,c=r;if(r===c)if(typeof a=="number"&&isFinite(a)){if(a>120||isNaN(a))return h.errors=[{instancePath:s+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/maximum",keyword:"maximum",params:{comparison:"<=",limit:120},message:"must be <= 120"}],!1;if(a<20||isNaN(a))return h.errors=[{instancePath:s+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/minimum",keyword:"minimum",params:{comparison:">=",limit:20},message:"must be >= 20"}],!1}else return h.errors=[{instancePath:s+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var d=c===r}else var d=!0}}}}}}}}}}else return h.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return h.errors=t,r===0}h.evaluated={props:{version:!0,projection:!0,mount:!0,centerX:!0,centerY:!0,radius:!0,fov:!0,rotation:!0,defaultYaw:!0,defaultTilt:!0,defaultViewFov:!0},dynamicProps:!1,dynamicItems:!1};function z(e,{instancePath:s="",parentData:b,parentDataProperty:v,rootData:p=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=z.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(typeof e=="string"){if(w(e)>1023)return z.errors=[{instancePath:s,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:1023},message:"must NOT have more than 1023 characters"}],!1;if(new TextEncoder().encode(e).byteLength>1023)return z.errors=[{instancePath:s,schemaPath:"#/x-lightnvr-max-bytes",keyword:"x-lightnvr-max-bytes",params:{},message:"must fit the UTF-8 byte limit"}],!1;if(e!==""){let y,a=!0;try{y=JSON.parse(e)}catch{a=!1}if(a){let c=r;h(y,{instancePath:s,parentData:e,parentDataProperty:v,rootData:p,dynamicAnchors:f})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var d=c===r;a=d}if(!a)return z.errors=[{instancePath:s,schemaPath:"#/contentSchema",keyword:"contentSchema",params:{},message:"must contain valid JSON matching contentSchema (or be empty)"}],!1}}else return z.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return z.errors=t,r===0}z.evaluated={dynamicProps:!1,dynamicItems:!1};function _(e,{instancePath:s="",parentData:b,parentDataProperty:v,rootData:p=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=_.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),!(typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)))return _.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(r===0&&typeof e=="number"&&isFinite(e)){if(e>2147483647||isNaN(e))return _.errors=[{instancePath:s,schemaPath:"#/maximum",keyword:"maximum",params:{comparison:"<=",limit:2147483647},message:"must be <= 2147483647"}],!1;if(e<-2147483648||isNaN(e))return _.errors=[{instancePath:s,schemaPath:"#/minimum",keyword:"minimum",params:{comparison:">=",limit:-2147483648},message:"must be >= -2147483648"}],!1}return _.errors=t,r===0}_.evaluated={dynamicProps:!1,dynamicItems:!1};var Z={type:"integer",enum:[0,1],$id:"urn:lightnvr:contract:StreamProtocol"};function I(e,{instancePath:s="",parentData:b,parentDataProperty:v,rootData:p=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=I.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)?e===0||e===1?(I.errors=t,r===0):(I.errors=[{instancePath:s,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:Z.enum},message:"must be equal to one of the allowed values"}],!1):(I.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1)}I.evaluated={dynamicProps:!1,dynamicItems:!1};function k(e,{instancePath:s="",parentData:b,parentDataProperty:v,rootData:p=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=k.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),!(typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)))return k.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(r===0&&typeof e=="number"&&isFinite(e)){if(e>365||isNaN(e))return k.errors=[{instancePath:s,schemaPath:"#/maximum",keyword:"maximum",params:{comparison:"<=",limit:365},message:"must be <= 365"}],!1;if(e<-1||isNaN(e))return k.errors=[{instancePath:s,schemaPath:"#/minimum",keyword:"minimum",params:{comparison:">=",limit:-1},message:"must be >= -1"}],!1}return k.errors=t,r===0}k.evaluated={dynamicProps:!1,dynamicItems:!1};function P(e,{instancePath:s="",parentData:b,parentDataProperty:v,rootData:p=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=P.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(Array.isArray(e)){if(e.length>168)return P.errors=[{instancePath:s,schemaPath:"#/maxItems",keyword:"maxItems",params:{limit:168},message:"must NOT have more than 168 items"}],!1;if(e.length<168)return P.errors=[{instancePath:s,schemaPath:"#/minItems",keyword:"minItems",params:{limit:168},message:"must NOT have fewer than 168 items"}],!1;{var d=!0;let y=e.length;for(let a=0;a511)return l.errors=[{instancePath:s+"/url",schemaPath:"#/properties/url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return l.errors=[{instancePath:s+"/url",schemaPath:"#/properties/url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=u===r}else var n=!0;if(n){if(e.enabled!==void 0){let i=r;if(typeof e.enabled!="boolean")return l.errors=[{instancePath:s+"/enabled",schemaPath:"#/properties/enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.streaming_enabled!==void 0){let i=r;if(typeof e.streaming_enabled!="boolean")return l.errors=[{instancePath:s+"/streaming_enabled",schemaPath:"#/properties/streaming_enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.playback_transport!==void 0){let i=r;$(e.playback_transport,{instancePath:s+"/playback_transport",parentData:e,parentDataProperty:"playback_transport",rootData:p,dynamicAnchors:f})||(t=t===null?$.errors:t.concat($.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.eptz_config!==void 0){let i=r;z(e.eptz_config,{instancePath:s+"/eptz_config",parentData:e,parentDataProperty:"eptz_config",rootData:p,dynamicAnchors:f})||(t=t===null?z.errors:t.concat(z.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.width!==void 0){let i=r;_(e.width,{instancePath:s+"/width",parentData:e,parentDataProperty:"width",rootData:p,dynamicAnchors:f})||(t=t===null?_.errors:t.concat(_.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.height!==void 0){let i=r;_(e.height,{instancePath:s+"/height",parentData:e,parentDataProperty:"height",rootData:p,dynamicAnchors:f})||(t=t===null?_.errors:t.concat(_.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.fps!==void 0){let i=r;_(e.fps,{instancePath:s+"/fps",parentData:e,parentDataProperty:"fps",rootData:p,dynamicAnchors:f})||(t=t===null?_.errors:t.concat(_.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.codec!==void 0){let i=e.codec,u=r;if(r===u)if(typeof i=="string"){if(w(i)>15)return l.errors=[{instancePath:s+"/codec",schemaPath:"#/properties/codec/maxLength",keyword:"maxLength",params:{limit:15},message:"must NOT have more than 15 characters"}],!1}else return l.errors=[{instancePath:s+"/codec",schemaPath:"#/properties/codec/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=u===r}else var n=!0;if(n){if(e.priority!==void 0){let i=r;_(e.priority,{instancePath:s+"/priority",parentData:e,parentDataProperty:"priority",rootData:p,dynamicAnchors:f})||(t=t===null?_.errors:t.concat(_.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.record!==void 0){let i=r;if(typeof e.record!="boolean")return l.errors=[{instancePath:s+"/record",schemaPath:"#/properties/record/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.segment_duration!==void 0){let i=r;_(e.segment_duration,{instancePath:s+"/segment_duration",parentData:e,parentDataProperty:"segment_duration",rootData:p,dynamicAnchors:f})||(t=t===null?_.errors:t.concat(_.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.detection_based_recording!==void 0){let i=r;if(typeof e.detection_based_recording!="boolean")return l.errors=[{instancePath:s+"/detection_based_recording",schemaPath:"#/properties/detection_based_recording/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.detection_model!==void 0){let i=e.detection_model,u=r;if(r===u)if(typeof i=="string"){if(w(i)>511)return l.errors=[{instancePath:s+"/detection_model",schemaPath:"#/properties/detection_model/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return l.errors=[{instancePath:s+"/detection_model",schemaPath:"#/properties/detection_model/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=u===r}else var n=!0;if(n){if(e.detection_threshold!==void 0){let i=e.detection_threshold,u=r;if(!(typeof i=="number"&&!(i%1)&&!isNaN(i)&&isFinite(i)))return l.errors=[{instancePath:s+"/detection_threshold",schemaPath:"#/properties/detection_threshold/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;var n=u===r}else var n=!0;if(n){if(e.detection_interval!==void 0){let i=r;_(e.detection_interval,{instancePath:s+"/detection_interval",parentData:e,parentDataProperty:"detection_interval",rootData:p,dynamicAnchors:f})||(t=t===null?_.errors:t.concat(_.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.pre_detection_buffer!==void 0){let i=r;_(e.pre_detection_buffer,{instancePath:s+"/pre_detection_buffer",parentData:e,parentDataProperty:"pre_detection_buffer",rootData:p,dynamicAnchors:f})||(t=t===null?_.errors:t.concat(_.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.post_detection_buffer!==void 0){let i=r;_(e.post_detection_buffer,{instancePath:s+"/post_detection_buffer",parentData:e,parentDataProperty:"post_detection_buffer",rootData:p,dynamicAnchors:f})||(t=t===null?_.errors:t.concat(_.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.detection_object_filter!==void 0){let i=e.detection_object_filter,u=r;if(r===u)if(typeof i=="string"){if(w(i)>15)return l.errors=[{instancePath:s+"/detection_object_filter",schemaPath:"#/properties/detection_object_filter/maxLength",keyword:"maxLength",params:{limit:15},message:"must NOT have more than 15 characters"}],!1}else return l.errors=[{instancePath:s+"/detection_object_filter",schemaPath:"#/properties/detection_object_filter/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=u===r}else var n=!0;if(n){if(e.detection_object_filter_list!==void 0){let i=e.detection_object_filter_list,u=r;if(r===u)if(typeof i=="string"){if(w(i)>255)return l.errors=[{instancePath:s+"/detection_object_filter_list",schemaPath:"#/properties/detection_object_filter_list/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1}else return l.errors=[{instancePath:s+"/detection_object_filter_list",schemaPath:"#/properties/detection_object_filter_list/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=u===r}else var n=!0;if(n){if(e.protocol!==void 0){let i=r;I(e.protocol,{instancePath:s+"/protocol",parentData:e,parentDataProperty:"protocol",rootData:p,dynamicAnchors:f})||(t=t===null?I.errors:t.concat(I.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.record_audio!==void 0){let i=r;if(typeof e.record_audio!="boolean")return l.errors=[{instancePath:s+"/record_audio",schemaPath:"#/properties/record_audio/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.audio_voice_enhancement!==void 0){let i=r;if(typeof e.audio_voice_enhancement!="boolean")return l.errors=[{instancePath:s+"/audio_voice_enhancement",schemaPath:"#/properties/audio_voice_enhancement/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.isOnvif!==void 0){let i=r;if(typeof e.isOnvif!="boolean")return l.errors=[{instancePath:s+"/isOnvif",schemaPath:"#/properties/isOnvif/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.backchannel_enabled!==void 0){let i=r;if(typeof e.backchannel_enabled!="boolean")return l.errors=[{instancePath:s+"/backchannel_enabled",schemaPath:"#/properties/backchannel_enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.retention_days!==void 0){let i=r;k(e.retention_days,{instancePath:s+"/retention_days",parentData:e,parentDataProperty:"retention_days",rootData:p,dynamicAnchors:f})||(t=t===null?k.errors:t.concat(k.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.detection_retention_days!==void 0){let i=r;k(e.detection_retention_days,{instancePath:s+"/detection_retention_days",parentData:e,parentDataProperty:"detection_retention_days",rootData:p,dynamicAnchors:f})||(t=t===null?k.errors:t.concat(k.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.max_storage_mb!==void 0){let i=r;_(e.max_storage_mb,{instancePath:s+"/max_storage_mb",parentData:e,parentDataProperty:"max_storage_mb",rootData:p,dynamicAnchors:f})||(t=t===null?_.errors:t.concat(_.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.tier_critical_multiplier!==void 0){let i=e.tier_critical_multiplier,u=r;if(!(typeof i=="number"&&isFinite(i)))return l.errors=[{instancePath:s+"/tier_critical_multiplier",schemaPath:"#/properties/tier_critical_multiplier/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var n=u===r}else var n=!0;if(n){if(e.tier_important_multiplier!==void 0){let i=e.tier_important_multiplier,u=r;if(!(typeof i=="number"&&isFinite(i)))return l.errors=[{instancePath:s+"/tier_important_multiplier",schemaPath:"#/properties/tier_important_multiplier/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var n=u===r}else var n=!0;if(n){if(e.tier_ephemeral_multiplier!==void 0){let i=e.tier_ephemeral_multiplier,u=r;if(!(typeof i=="number"&&isFinite(i)))return l.errors=[{instancePath:s+"/tier_ephemeral_multiplier",schemaPath:"#/properties/tier_ephemeral_multiplier/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var n=u===r}else var n=!0;if(n){if(e.storage_priority!==void 0){let i=r;_(e.storage_priority,{instancePath:s+"/storage_priority",parentData:e,parentDataProperty:"storage_priority",rootData:p,dynamicAnchors:f})||(t=t===null?_.errors:t.concat(_.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.ptz_enabled!==void 0){let i=r;if(typeof e.ptz_enabled!="boolean")return l.errors=[{instancePath:s+"/ptz_enabled",schemaPath:"#/properties/ptz_enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.ptz_max_x!==void 0){let i=r;_(e.ptz_max_x,{instancePath:s+"/ptz_max_x",parentData:e,parentDataProperty:"ptz_max_x",rootData:p,dynamicAnchors:f})||(t=t===null?_.errors:t.concat(_.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.ptz_max_y!==void 0){let i=r;_(e.ptz_max_y,{instancePath:s+"/ptz_max_y",parentData:e,parentDataProperty:"ptz_max_y",rootData:p,dynamicAnchors:f})||(t=t===null?_.errors:t.concat(_.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.ptz_max_z!==void 0){let i=r;_(e.ptz_max_z,{instancePath:s+"/ptz_max_z",parentData:e,parentDataProperty:"ptz_max_z",rootData:p,dynamicAnchors:f})||(t=t===null?_.errors:t.concat(_.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.ptz_has_home!==void 0){let i=r;if(typeof e.ptz_has_home!="boolean")return l.errors=[{instancePath:s+"/ptz_has_home",schemaPath:"#/properties/ptz_has_home/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.onvif_username!==void 0){let i=e.onvif_username,u=r;if(r===u)if(typeof i=="string"){if(w(i)>63)return l.errors=[{instancePath:s+"/onvif_username",schemaPath:"#/properties/onvif_username/maxLength",keyword:"maxLength",params:{limit:63},message:"must NOT have more than 63 characters"}],!1}else return l.errors=[{instancePath:s+"/onvif_username",schemaPath:"#/properties/onvif_username/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=u===r}else var n=!0;if(n){if(e.onvif_password!==void 0){let i=e.onvif_password,u=r;if(r===u)if(typeof i=="string"){if(w(i)>63)return l.errors=[{instancePath:s+"/onvif_password",schemaPath:"#/properties/onvif_password/maxLength",keyword:"maxLength",params:{limit:63},message:"must NOT have more than 63 characters"}],!1}else return l.errors=[{instancePath:s+"/onvif_password",schemaPath:"#/properties/onvif_password/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=u===r}else var n=!0;if(n){if(e.onvif_profile!==void 0){let i=e.onvif_profile,u=r;if(r===u)if(typeof i=="string"){if(w(i)>63)return l.errors=[{instancePath:s+"/onvif_profile",schemaPath:"#/properties/onvif_profile/maxLength",keyword:"maxLength",params:{limit:63},message:"must NOT have more than 63 characters"}],!1}else return l.errors=[{instancePath:s+"/onvif_profile",schemaPath:"#/properties/onvif_profile/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=u===r}else var n=!0;if(n){if(e.onvif_port!==void 0){let i=r;_(e.onvif_port,{instancePath:s+"/onvif_port",parentData:e,parentDataProperty:"onvif_port",rootData:p,dynamicAnchors:f})||(t=t===null?_.errors:t.concat(_.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.record_on_schedule!==void 0){let i=r;if(typeof e.record_on_schedule!="boolean")return l.errors=[{instancePath:s+"/record_on_schedule",schemaPath:"#/properties/record_on_schedule/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.recording_schedule!==void 0){let i=r;P(e.recording_schedule,{instancePath:s+"/recording_schedule",parentData:e,parentDataProperty:"recording_schedule",rootData:p,dynamicAnchors:f})||(t=t===null?P.errors:t.concat(P.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.detection_record_on_schedule!==void 0){let i=r;if(typeof e.detection_record_on_schedule!="boolean")return l.errors=[{instancePath:s+"/detection_record_on_schedule",schemaPath:"#/properties/detection_record_on_schedule/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.detection_recording_schedule!==void 0){let i=r;P(e.detection_recording_schedule,{instancePath:s+"/detection_recording_schedule",parentData:e,parentDataProperty:"detection_recording_schedule",rootData:p,dynamicAnchors:f})||(t=t===null?P.errors:t.concat(P.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.tags!==void 0){let i=e.tags,u=r;if(r===u)if(typeof i=="string"){if(w(i)>255)return l.errors=[{instancePath:s+"/tags",schemaPath:"#/properties/tags/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1}else return l.errors=[{instancePath:s+"/tags",schemaPath:"#/properties/tags/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=u===r}else var n=!0;if(n){if(e.admin_url!==void 0){let i=e.admin_url,u=r;if(r===u)if(typeof i=="string"){if(w(i)>511)return l.errors=[{instancePath:s+"/admin_url",schemaPath:"#/properties/admin_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return l.errors=[{instancePath:s+"/admin_url",schemaPath:"#/properties/admin_url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=u===r}else var n=!0;if(n){if(e.privacy_mode!==void 0){let i=r;if(typeof e.privacy_mode!="boolean")return l.errors=[{instancePath:s+"/privacy_mode",schemaPath:"#/properties/privacy_mode/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.can_control_privacy!==void 0){let i=r;if(typeof e.can_control_privacy!="boolean")return l.errors=[{instancePath:s+"/can_control_privacy",schemaPath:"#/properties/can_control_privacy/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.motion_trigger_source!==void 0){let i=e.motion_trigger_source,u=r;if(r===u)if(typeof i=="string"){if(w(i)>255)return l.errors=[{instancePath:s+"/motion_trigger_source",schemaPath:"#/properties/motion_trigger_source/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1}else return l.errors=[{instancePath:s+"/motion_trigger_source",schemaPath:"#/properties/motion_trigger_source/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=u===r}else var n=!0;if(n){if(e.go2rtc_source_override!==void 0){let i=e.go2rtc_source_override,u=r;if(r===u)if(typeof i=="string"){if(w(i)>8191)return l.errors=[{instancePath:s+"/go2rtc_source_override",schemaPath:"#/properties/go2rtc_source_override/maxLength",keyword:"maxLength",params:{limit:8191},message:"must NOT have more than 8191 characters"}],!1}else return l.errors=[{instancePath:s+"/go2rtc_source_override",schemaPath:"#/properties/go2rtc_source_override/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=u===r}else var n=!0;if(n){if(e.sub_stream_url!==void 0){let i=e.sub_stream_url,u=r;if(r===u)if(typeof i=="string"){if(w(i)>511)return l.errors=[{instancePath:s+"/sub_stream_url",schemaPath:"#/properties/sub_stream_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return l.errors=[{instancePath:s+"/sub_stream_url",schemaPath:"#/properties/sub_stream_url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=u===r}else var n=!0;if(n){if(e.has_sub_stream!==void 0){let i=r;if(typeof e.has_sub_stream!="boolean")return l.errors=[{instancePath:s+"/has_sub_stream",schemaPath:"#/properties/has_sub_stream/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.detection_url!==void 0){let i=e.detection_url,u=r;if(r===u)if(typeof i=="string"){if(w(i)>511)return l.errors=[{instancePath:s+"/detection_url",schemaPath:"#/properties/detection_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return l.errors=[{instancePath:s+"/detection_url",schemaPath:"#/properties/detection_url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=u===r}else var n=!0;if(n){if(e.publish_url!==void 0){let i=e.publish_url,u=r;if(r===u)if(typeof i=="string"){if(w(i)>511)return l.errors=[{instancePath:s+"/publish_url",schemaPath:"#/properties/publish_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return l.errors=[{instancePath:s+"/publish_url",schemaPath:"#/properties/publish_url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=u===r}else var n=!0;if(n){if(e.status!==void 0){let i=r;O(e.status,{instancePath:s+"/status",parentData:e,parentDataProperty:"status",rootData:p,dynamicAnchors:f})||(t=t===null?O.errors:t.concat(O.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.error_message!==void 0){let i=e.error_message,u=r;if(r===u)if(typeof i=="string"){if(w(i)>255)return l.errors=[{instancePath:s+"/error_message",schemaPath:"#/properties/error_message/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1;if(w(i)<1)return l.errors=[{instancePath:s+"/error_message",schemaPath:"#/properties/error_message/minLength",keyword:"minLength",params:{limit:1},message:"must NOT have fewer than 1 characters"}],!1}else return l.errors=[{instancePath:s+"/error_message",schemaPath:"#/properties/error_message/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=u===r}else var n=!0;if(n)if(e.go2rtc_hls_available!==void 0){let i=r;if(typeof e.go2rtc_hls_available!="boolean")return l.errors=[{instancePath:s+"/go2rtc_hls_available",schemaPath:"#/properties/go2rtc_hls_available/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}else return l.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return l.errors=t,r===0}l.evaluated={props:{camera_uuid:!0,location_uuid:!0,name:!0,url:!0,enabled:!0,streaming_enabled:!0,playback_transport:!0,eptz_config:!0,width:!0,height:!0,fps:!0,codec:!0,priority:!0,record:!0,segment_duration:!0,detection_based_recording:!0,detection_model:!0,detection_threshold:!0,detection_interval:!0,pre_detection_buffer:!0,post_detection_buffer:!0,detection_object_filter:!0,detection_object_filter_list:!0,protocol:!0,record_audio:!0,audio_voice_enhancement:!0,isOnvif:!0,backchannel_enabled:!0,retention_days:!0,detection_retention_days:!0,max_storage_mb:!0,tier_critical_multiplier:!0,tier_important_multiplier:!0,tier_ephemeral_multiplier:!0,storage_priority:!0,ptz_enabled:!0,ptz_max_x:!0,ptz_max_y:!0,ptz_max_z:!0,ptz_has_home:!0,onvif_username:!0,onvif_password:!0,onvif_profile:!0,onvif_port:!0,record_on_schedule:!0,recording_schedule:!0,detection_record_on_schedule:!0,detection_recording_schedule:!0,tags:!0,admin_url:!0,privacy_mode:!0,can_control_privacy:!0,motion_trigger_source:!0,go2rtc_source_override:!0,sub_stream_url:!0,has_sub_stream:!0,detection_url:!0,publish_url:!0,status:!0,error_message:!0,go2rtc_hls_available:!0},dynamicProps:!1,dynamicItems:!1};var H=new RegExp("^(?![A-Za-z][A-Za-z0-9+.-]*://[^/?#]*@)","u");function N(e,{instancePath:s="",parentData:b,parentDataProperty:v,rootData:p=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=N.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(typeof e=="string"){if(w(e)>511)return N.errors=[{instancePath:s,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1;if(!H.test(e))return N.errors=[{instancePath:s,schemaPath:"#/pattern",keyword:"pattern",params:{pattern:"^(?![A-Za-z][A-Za-z0-9+.-]*://[^/?#]*@)"},message:'must match pattern "^(?![A-Za-z][A-Za-z0-9+.-]*://[^/?#]*@)"'}],!1}else return N.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return N.errors=t,r===0}N.evaluated={dynamicProps:!1,dynamicItems:!1};var B=new RegExp("[?&;][^=&#]*([Pp][Aa][Ss][Ss]|[Pp][Ww][Dd]|[Tt][Oo][Kk][Ee][Nn]|[Ss][Ee][Cc][Rr][Ee][Tt]|[Aa][Pp][Ii]_?[Kk][Ee][Yy])[^=&#]*=[^&#]","u");function j(e,{instancePath:s="",parentData:b,parentDataProperty:v,rootData:p=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=j.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e!="string")return j.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;let d=r,y=r;if(typeof e=="string"&&!B.test(e)){let c={};t===null?t=[c]:t.push(c),r++}var a=y===r;return a?(j.errors=[{instancePath:s,schemaPath:"#/not",keyword:"not",params:{},message:"must NOT be valid"}],!1):(r=d,t!==null&&(d?t.length=d:t=null),j.errors=t,r===0)}j.evaluated={dynamicProps:!1,dynamicItems:!1};function S(e,{instancePath:s="",parentData:b,parentDataProperty:v,rootData:p=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=S.evaluated;o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0);let d=r;N(e,{instancePath:s,parentData:b,parentDataProperty:v,rootData:p,dynamicAnchors:f})||(t=t===null?N.errors:t.concat(N.errors),r=t.length);var y=d===r;if(y){let a=r;j(e,{instancePath:s,parentData:b,parentDataProperty:v,rootData:p,dynamicAnchors:f})||(t=t===null?j.errors:t.concat(j.errors),r=t.length);var y=a===r}return S.errors=t,r===0}S.evaluated={dynamicProps:!1,dynamicItems:!1};function g(e,{instancePath:s="",parentData:b,parentDataProperty:v,rootData:p=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=g.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e!="string"?(g.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1):e!==""?(g.errors=[{instancePath:s,schemaPath:"#/const",keyword:"const",params:{allowedValue:""},message:"must be equal to constant"}],!1):(g.errors=t,r===0)}g.evaluated={dynamicProps:!1,dynamicItems:!1};function L(e,{instancePath:s="",parentData:b,parentDataProperty:v,rootData:p=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=L.evaluated;o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0);let d=r;l(e,{instancePath:s,parentData:b,parentDataProperty:v,rootData:p,dynamicAnchors:f})||(t=t===null?l.errors:t.concat(l.errors),r=t.length);var y=d===r;if(y){let F=r,E=r,n=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let i;if(e.detection_api_url===void 0&&(i="detection_api_url")){let u={};t===null?t=[u]:t.push(u),r++}}var a=n===r;if(a)return L.errors=[{instancePath:s,schemaPath:"#/allOf/1/not",keyword:"not",params:{},message:"must NOT be valid"}],!1;if(r=E,t!==null&&(E?t.length=E:t=null),r===F)if(e&&typeof e=="object"&&!Array.isArray(e)){if(e.can_control_privacy!==void 0){let i=r;if(e.can_control_privacy!==!1)return L.errors=[{instancePath:s+"/can_control_privacy",schemaPath:"#/allOf/1/properties/can_control_privacy/const",keyword:"const",params:{allowedValue:!1},message:"must be equal to constant"}],!1;var c=i===r}else var c=!0;if(c){if(e.url!==void 0){let i=r;S(e.url,{instancePath:s+"/url",parentData:e,parentDataProperty:"url",rootData:p,dynamicAnchors:f})||(t=t===null?S.errors:t.concat(S.errors),r=t.length);var c=i===r}else var c=!0;if(c){if(e.onvif_username!==void 0){let i=r;g(e.onvif_username,{instancePath:s+"/onvif_username",parentData:e,parentDataProperty:"onvif_username",rootData:p,dynamicAnchors:f})||(t=t===null?g.errors:t.concat(g.errors),r=t.length);var c=i===r}else var c=!0;if(c){if(e.onvif_password!==void 0){let i=r;g(e.onvif_password,{instancePath:s+"/onvif_password",parentData:e,parentDataProperty:"onvif_password",rootData:p,dynamicAnchors:f})||(t=t===null?g.errors:t.concat(g.errors),r=t.length);var c=i===r}else var c=!0;if(c){if(e.admin_url!==void 0){let i=r;g(e.admin_url,{instancePath:s+"/admin_url",parentData:e,parentDataProperty:"admin_url",rootData:p,dynamicAnchors:f})||(t=t===null?g.errors:t.concat(g.errors),r=t.length);var c=i===r}else var c=!0;if(c){if(e.go2rtc_source_override!==void 0){let i=r;g(e.go2rtc_source_override,{instancePath:s+"/go2rtc_source_override",parentData:e,parentDataProperty:"go2rtc_source_override",rootData:p,dynamicAnchors:f})||(t=t===null?g.errors:t.concat(g.errors),r=t.length);var c=i===r}else var c=!0;if(c){if(e.sub_stream_url!==void 0){let i=r;g(e.sub_stream_url,{instancePath:s+"/sub_stream_url",parentData:e,parentDataProperty:"sub_stream_url",rootData:p,dynamicAnchors:f})||(t=t===null?g.errors:t.concat(g.errors),r=t.length);var c=i===r}else var c=!0;if(c){if(e.detection_url!==void 0){let i=r;g(e.detection_url,{instancePath:s+"/detection_url",parentData:e,parentDataProperty:"detection_url",rootData:p,dynamicAnchors:f})||(t=t===null?g.errors:t.concat(g.errors),r=t.length);var c=i===r}else var c=!0;if(c)if(e.publish_url!==void 0){let i=r;g(e.publish_url,{instancePath:s+"/publish_url",parentData:e,parentDataProperty:"publish_url",rootData:p,dynamicAnchors:f})||(t=t===null?g.errors:t.concat(g.errors),r=t.length);var c=i===r}else var c=!0}}}}}}}}else return L.errors=[{instancePath:s,schemaPath:"#/allOf/1/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;var y=F===r}return L.errors=t,r===0}L.evaluated={props:{can_control_privacy:!0,url:!0,onvif_username:!0,onvif_password:!0,admin_url:!0,go2rtc_source_override:!0,sub_stream_url:!0,detection_url:!0,publish_url:!0,camera_uuid:!0,location_uuid:!0,name:!0,enabled:!0,streaming_enabled:!0,playback_transport:!0,eptz_config:!0,width:!0,height:!0,fps:!0,codec:!0,priority:!0,record:!0,segment_duration:!0,detection_based_recording:!0,detection_model:!0,detection_threshold:!0,detection_interval:!0,pre_detection_buffer:!0,post_detection_buffer:!0,detection_object_filter:!0,detection_object_filter_list:!0,protocol:!0,record_audio:!0,audio_voice_enhancement:!0,isOnvif:!0,backchannel_enabled:!0,retention_days:!0,detection_retention_days:!0,max_storage_mb:!0,tier_critical_multiplier:!0,tier_important_multiplier:!0,tier_ephemeral_multiplier:!0,storage_priority:!0,ptz_enabled:!0,ptz_max_x:!0,ptz_max_y:!0,ptz_max_z:!0,ptz_has_home:!0,onvif_profile:!0,onvif_port:!0,record_on_schedule:!0,recording_schedule:!0,detection_record_on_schedule:!0,detection_recording_schedule:!0,tags:!0,privacy_mode:!0,motion_trigger_source:!0,has_sub_stream:!0,status:!0,error_message:!0,go2rtc_hls_available:!0},dynamicProps:!1,dynamicItems:!1};function T(e,{instancePath:s="",parentData:b,parentDataProperty:v,rootData:p=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=T.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let d;if(e.stream===void 0&&(d="stream"))return T.errors=[{instancePath:s,schemaPath:"#/required",keyword:"required",params:{missingProperty:d},message:"must have required property '"+d+"'"}],!1;e.stream!==void 0&&(L(e.stream,{instancePath:s+"/stream",parentData:e,parentDataProperty:"stream",rootData:p,dynamicAnchors:f})||(t=t===null?L.errors:t.concat(L.errors),r=t.length))}else return T.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return T.errors=t,r===0}T.evaluated={props:{stream:!0},dynamicProps:!1,dynamicItems:!1};export{Q as validateStreamFullResponseLiveOnly}; diff --git a/web/js/api/generated/validators/StreamName.d.mts b/web/js/api/generated/validators/StreamName.d.mts new file mode 100644 index 000000000..d0b377bf6 --- /dev/null +++ b/web/js/api/generated/validators/StreamName.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateStreamName } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/StreamName.mjs b/web/js/api/generated/validators/StreamName.mjs new file mode 100644 index 000000000..cd12748f2 --- /dev/null +++ b/web/js/api/generated/validators/StreamName.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var f=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(n){throw e=0,n}};var c=f(m=>{"use strict";Object.defineProperty(m,"__esModule",{value:!0});function o(t){let e=t.length,n=0,a=0,s;for(;a=55296&&s<=56319&&a255)return r.errors=[{instancePath:e,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1;if(u(t)<1)return r.errors=[{instancePath:e,schemaPath:"#/minLength",keyword:"minLength",params:{limit:1},message:"must NOT have fewer than 1 characters"}],!1;if(new TextEncoder().encode(t).byteLength>255)return r.errors=[{instancePath:e,schemaPath:"#/x-lightnvr-max-bytes",keyword:"x-lightnvr-max-bytes",params:{},message:"must fit the UTF-8 byte limit"}],!1}else return r.errors=[{instancePath:e,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return r.errors=h,l===0}r.evaluated={dynamicProps:!1,dynamicItems:!1};export{p as validateStreamName}; diff --git a/web/js/api/generated/validators/StreamPrivacyModeRequest.d.mts b/web/js/api/generated/validators/StreamPrivacyModeRequest.d.mts new file mode 100644 index 000000000..83e95f574 --- /dev/null +++ b/web/js/api/generated/validators/StreamPrivacyModeRequest.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateStreamPrivacyModeRequest } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/StreamPrivacyModeRequest.mjs b/web/js/api/generated/validators/StreamPrivacyModeRequest.mjs new file mode 100644 index 000000000..8ccc38456 --- /dev/null +++ b/web/js/api/generated/validators/StreamPrivacyModeRequest.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var l=r;function r(e,{instancePath:t="",parentData:n,parentDataProperty:m,rootData:y=e,dynamicAnchors:c={}}={}){let p=null,s=0,o=r.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),s===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let a;if(e.set_privacy_mode===void 0&&(a="set_privacy_mode"))return r.errors=[{instancePath:t,schemaPath:"#/required",keyword:"required",params:{missingProperty:a},message:"must have required property '"+a+"'"}],!1;{let d=s;for(let i in e)if(i!=="set_privacy_mode"){return r.errors=[{instancePath:t,schemaPath:"#/additionalProperties",keyword:"additionalProperties",params:{additionalProperty:i},message:"must NOT have additional properties"}],!1;break}if(d===s&&e.set_privacy_mode!==void 0&&typeof e.set_privacy_mode!="boolean")return r.errors=[{instancePath:t+"/set_privacy_mode",schemaPath:"#/properties/set_privacy_mode/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1}}else return r.errors=[{instancePath:t,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return r.errors=p,s===0}r.evaluated={props:!0,dynamicProps:!1,dynamicItems:!1};export{l as validateStreamPrivacyModeRequest}; diff --git a/web/js/api/generated/validators/StreamPrivacyModeResponse.d.mts b/web/js/api/generated/validators/StreamPrivacyModeResponse.d.mts new file mode 100644 index 000000000..ca6ec7287 --- /dev/null +++ b/web/js/api/generated/validators/StreamPrivacyModeResponse.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateStreamPrivacyModeResponse } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/StreamPrivacyModeResponse.mjs b/web/js/api/generated/validators/StreamPrivacyModeResponse.mjs new file mode 100644 index 000000000..b1f3ff794 --- /dev/null +++ b/web/js/api/generated/validators/StreamPrivacyModeResponse.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var y=r;function r(e,{instancePath:t="",parentData:p,parentDataProperty:u,rootData:m=e,dynamicAnchors:d={}}={}){let n=null,s=0,o=r.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),s===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let c;if(e.success===void 0&&(c="success")||e.privacy_mode===void 0&&(c="privacy_mode"))return r.errors=[{instancePath:t,schemaPath:"#/required",keyword:"required",params:{missingProperty:c},message:"must have required property '"+c+"'"}],!1;if(e.success!==void 0){let i=s;if(e.success!==!0)return r.errors=[{instancePath:t+"/success",schemaPath:"#/properties/success/const",keyword:"const",params:{allowedValue:!0},message:"must be equal to constant"}],!1;var a=i===s}else var a=!0;if(a)if(e.privacy_mode!==void 0){let i=s;if(typeof e.privacy_mode!="boolean")return r.errors=[{instancePath:t+"/privacy_mode",schemaPath:"#/properties/privacy_mode/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var a=i===s}else var a=!0}else return r.errors=[{instancePath:t,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return r.errors=n,s===0}r.evaluated={props:{success:!0,privacy_mode:!0},dynamicProps:!1,dynamicItems:!1};export{y as validateStreamPrivacyModeResponse}; diff --git a/web/js/api/generated/validators/StreamProtocol.d.mts b/web/js/api/generated/validators/StreamProtocol.d.mts new file mode 100644 index 000000000..f5385785a --- /dev/null +++ b/web/js/api/generated/validators/StreamProtocol.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateStreamProtocol } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/StreamProtocol.mjs b/web/js/api/generated/validators/StreamProtocol.mjs new file mode 100644 index 000000000..9508bacfe --- /dev/null +++ b/web/js/api/generated/validators/StreamProtocol.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var c=r,o={type:"integer",enum:[0,1],$id:"urn:lightnvr:contract:StreamProtocol"};function r(e,{instancePath:s="",parentData:i,parentDataProperty:m,rootData:l=e,dynamicAnchors:u={}}={}){let a=null,n=0,t=r.evaluated;return t.dynamicProps&&(t.props=void 0),t.dynamicItems&&(t.items=void 0),typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)?e===0||e===1?(r.errors=a,n===0):(r.errors=[{instancePath:s,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:o.enum},message:"must be equal to one of the allowed values"}],!1):(r.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1)}r.evaluated={dynamicProps:!1,dynamicItems:!1};export{c as validateStreamProtocol}; diff --git a/web/js/api/generated/validators/StreamSummaryAdmin.d.mts b/web/js/api/generated/validators/StreamSummaryAdmin.d.mts new file mode 100644 index 000000000..55b93e00d --- /dev/null +++ b/web/js/api/generated/validators/StreamSummaryAdmin.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateStreamSummaryAdmin } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/StreamSummaryAdmin.mjs b/web/js/api/generated/validators/StreamSummaryAdmin.mjs new file mode 100644 index 000000000..f27e40008 --- /dev/null +++ b/web/js/api/generated/validators/StreamSummaryAdmin.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var V=(e,n)=>()=>{try{return n||e((n={exports:{}}).exports,n),n.exports}catch(y){throw n=0,y}};var q=V(E=>{"use strict";Object.defineProperty(E,"__esModule",{value:!0});function j(e){let n=e.length,y=0,d=0,u;for(;d=55296&&u<=56319&&d36)return v.errors=[{instancePath:n,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:36},message:"must NOT have more than 36 characters"}],!1;if(!Z.test(e))return v.errors=[{instancePath:n,schemaPath:"#/pattern",keyword:"pattern",params:{pattern:"^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$"},message:'must match pattern "^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$"'}],!1}else return v.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return v.errors=t,r===0}v.evaluated={dynamicProps:!1,dynamicItems:!1};function P(e,{instancePath:n="",parentData:y,parentDataProperty:d,rootData:u=e,dynamicAnchors:c={}}={}){let t=null,r=0,o=P.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(typeof e=="string"){if(A(e)>255)return P.errors=[{instancePath:n,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1;if(A(e)<1)return P.errors=[{instancePath:n,schemaPath:"#/minLength",keyword:"minLength",params:{limit:1},message:"must NOT have fewer than 1 characters"}],!1;if(new TextEncoder().encode(e).byteLength>255)return P.errors=[{instancePath:n,schemaPath:"#/x-lightnvr-max-bytes",keyword:"x-lightnvr-max-bytes",params:{},message:"must fit the UTF-8 byte limit"}],!1}else return P.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return P.errors=t,r===0}P.evaluated={dynamicProps:!1,dynamicItems:!1};function h(e,{instancePath:n="",parentData:y,parentDataProperty:d,rootData:u=e,dynamicAnchors:c={}}={}){let t=null,r=0,o=h.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),!(typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)))return h.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(r===0&&typeof e=="number"&&isFinite(e)){if(e>2147483647||isNaN(e))return h.errors=[{instancePath:n,schemaPath:"#/maximum",keyword:"maximum",params:{comparison:"<=",limit:2147483647},message:"must be <= 2147483647"}],!1;if(e<-2147483648||isNaN(e))return h.errors=[{instancePath:n,schemaPath:"#/minimum",keyword:"minimum",params:{comparison:">=",limit:-2147483648},message:"must be >= -2147483648"}],!1}return h.errors=t,r===0}h.evaluated={dynamicProps:!1,dynamicItems:!1};var K={type:"integer",enum:[0,1],$id:"urn:lightnvr:contract:StreamProtocol"};function D(e,{instancePath:n="",parentData:y,parentDataProperty:d,rootData:u=e,dynamicAnchors:c={}}={}){let t=null,r=0,o=D.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)?e===0||e===1?(D.errors=t,r===0):(D.errors=[{instancePath:n,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:K.enum},message:"must be equal to one of the allowed values"}],!1):(D.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1)}D.evaluated={dynamicProps:!1,dynamicItems:!1};var R={type:"string",enum:["Running","Degraded","Error","Stopped","Unknown"],$id:"urn:lightnvr:contract:SummaryStatus"};function x(e,{instancePath:n="",parentData:y,parentDataProperty:d,rootData:u=e,dynamicAnchors:c={}}={}){let t=null,r=0,o=x.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e!="string"?(x.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1):e==="Running"||e==="Degraded"||e==="Error"||e==="Stopped"||e==="Unknown"?(x.errors=t,r===0):(x.errors=[{instancePath:n,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:R.enum},message:"must be equal to one of the allowed values"}],!1)}x.evaluated={dynamicProps:!1,dynamicItems:!1};var B={type:"string",enum:["live","offline","never_connected","disabled"],$id:"urn:lightnvr:contract:Availability"};function O(e,{instancePath:n="",parentData:y,parentDataProperty:d,rootData:u=e,dynamicAnchors:c={}}={}){let t=null,r=0,o=O.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e!="string"?(O.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1):e==="live"||e==="offline"||e==="never_connected"||e==="disabled"?(O.errors=t,r===0):(O.errors=[{instancePath:n,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:B.enum},message:"must be equal to one of the allowed values"}],!1)}O.evaluated={dynamicProps:!1,dynamicItems:!1};function g(e,{instancePath:n="",parentData:y,parentDataProperty:d,rootData:u=e,dynamicAnchors:c={}}={}){let t=null,r=0,o=g.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)?r===0&&typeof e=="number"&&isFinite(e)&&(e<0||isNaN(e))?(g.errors=[{instancePath:n,schemaPath:"#/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1):(g.errors=t,r===0):(g.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1)}g.evaluated={dynamicProps:!1,dynamicItems:!1};function f(e,{instancePath:n="",parentData:y,parentDataProperty:d,rootData:u=e,dynamicAnchors:c={}}={}){let t=null,r=0,o=f.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),F(e,{instancePath:n,parentData:y,parentDataProperty:d,rootData:u,dynamicAnchors:c})||(t=t===null?F.errors:t.concat(F.errors),r=t.length),r===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let l;if(e.camera_uuid===void 0&&(l="camera_uuid")||e.name===void 0&&(l="name")||e.location_uuid===void 0&&(l="location_uuid")||e.location_name===void 0&&(l="location_name")||e.location_path===void 0&&(l="location_path")||e.enabled===void 0&&(l="enabled")||e.width===void 0&&(l="width")||e.height===void 0&&(l="height")||e.fps===void 0&&(l="fps")||e.codec===void 0&&(l="codec")||e.protocol===void 0&&(l="protocol")||e.record===void 0&&(l="record")||e.record_on_schedule===void 0&&(l="record_on_schedule")||e.detection_based_recording===void 0&&(l="detection_based_recording")||e.isOnvif===void 0&&(l="isOnvif")||e.tags===void 0&&(l="tags")||e.status===void 0&&(l="status")||e.availability===void 0&&(l="availability")||e.first_video_at===void 0&&(l="first_video_at")||e.last_frame_ts===void 0&&(l="last_frame_ts")||e.current_fps===void 0&&(l="current_fps")||e.recording_active===void 0&&(l="recording_active")||e.last_recording_at===void 0&&(l="last_recording_at")||e.can_configure===void 0&&(l="can_configure"))return f.errors=[{instancePath:n,schemaPath:"#/required",keyword:"required",params:{missingProperty:l},message:"must have required property '"+l+"'"}],!1;if(e.camera_uuid!==void 0){let a=r;v(e.camera_uuid,{instancePath:n+"/camera_uuid",parentData:e,parentDataProperty:"camera_uuid",rootData:u,dynamicAnchors:c})||(t=t===null?v.errors:t.concat(v.errors),r=t.length);var s=a===r}else var s=!0;if(s){if(e.name!==void 0){let a=r;P(e.name,{instancePath:n+"/name",parentData:e,parentDataProperty:"name",rootData:u,dynamicAnchors:c})||(t=t===null?P.errors:t.concat(P.errors),r=t.length);var s=a===r}else var s=!0;if(s){if(e.location_uuid!==void 0){let a=r;v(e.location_uuid,{instancePath:n+"/location_uuid",parentData:e,parentDataProperty:"location_uuid",rootData:u,dynamicAnchors:c})||(t=t===null?v.errors:t.concat(v.errors),r=t.length);var s=a===r}else var s=!0;if(s){if(e.location_name!==void 0){let a=e.location_name,i=r;if(r===i)if(typeof a=="string"){if(A(a)>127)return f.errors=[{instancePath:n+"/location_name",schemaPath:"#/properties/location_name/maxLength",keyword:"maxLength",params:{limit:127},message:"must NOT have more than 127 characters"}],!1}else return f.errors=[{instancePath:n+"/location_name",schemaPath:"#/properties/location_name/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var s=i===r}else var s=!0;if(s){if(e.location_path!==void 0){let a=e.location_path,i=r;if(r===i)if(typeof a=="string"){if(A(a)>1023)return f.errors=[{instancePath:n+"/location_path",schemaPath:"#/properties/location_path/maxLength",keyword:"maxLength",params:{limit:1023},message:"must NOT have more than 1023 characters"}],!1}else return f.errors=[{instancePath:n+"/location_path",schemaPath:"#/properties/location_path/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var s=i===r}else var s=!0;if(s){if(e.enabled!==void 0){let a=r;if(typeof e.enabled!="boolean")return f.errors=[{instancePath:n+"/enabled",schemaPath:"#/properties/enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var s=a===r}else var s=!0;if(s){if(e.width!==void 0){let a=r;h(e.width,{instancePath:n+"/width",parentData:e,parentDataProperty:"width",rootData:u,dynamicAnchors:c})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var s=a===r}else var s=!0;if(s){if(e.height!==void 0){let a=r;h(e.height,{instancePath:n+"/height",parentData:e,parentDataProperty:"height",rootData:u,dynamicAnchors:c})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var s=a===r}else var s=!0;if(s){if(e.fps!==void 0){let a=r;h(e.fps,{instancePath:n+"/fps",parentData:e,parentDataProperty:"fps",rootData:u,dynamicAnchors:c})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var s=a===r}else var s=!0;if(s){if(e.codec!==void 0){let a=e.codec,i=r;if(r===i)if(typeof a=="string"){if(A(a)>15)return f.errors=[{instancePath:n+"/codec",schemaPath:"#/properties/codec/maxLength",keyword:"maxLength",params:{limit:15},message:"must NOT have more than 15 characters"}],!1}else return f.errors=[{instancePath:n+"/codec",schemaPath:"#/properties/codec/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var s=i===r}else var s=!0;if(s){if(e.protocol!==void 0){let a=r;D(e.protocol,{instancePath:n+"/protocol",parentData:e,parentDataProperty:"protocol",rootData:u,dynamicAnchors:c})||(t=t===null?D.errors:t.concat(D.errors),r=t.length);var s=a===r}else var s=!0;if(s){if(e.record!==void 0){let a=r;if(typeof e.record!="boolean")return f.errors=[{instancePath:n+"/record",schemaPath:"#/properties/record/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var s=a===r}else var s=!0;if(s){if(e.record_on_schedule!==void 0){let a=r;if(typeof e.record_on_schedule!="boolean")return f.errors=[{instancePath:n+"/record_on_schedule",schemaPath:"#/properties/record_on_schedule/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var s=a===r}else var s=!0;if(s){if(e.detection_based_recording!==void 0){let a=r;if(typeof e.detection_based_recording!="boolean")return f.errors=[{instancePath:n+"/detection_based_recording",schemaPath:"#/properties/detection_based_recording/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var s=a===r}else var s=!0;if(s){if(e.isOnvif!==void 0){let a=r;if(typeof e.isOnvif!="boolean")return f.errors=[{instancePath:n+"/isOnvif",schemaPath:"#/properties/isOnvif/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var s=a===r}else var s=!0;if(s){if(e.tags!==void 0){let a=e.tags,i=r;if(r===i)if(typeof a=="string"){if(A(a)>255)return f.errors=[{instancePath:n+"/tags",schemaPath:"#/properties/tags/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1}else return f.errors=[{instancePath:n+"/tags",schemaPath:"#/properties/tags/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var s=i===r}else var s=!0;if(s){if(e.status!==void 0){let a=r;x(e.status,{instancePath:n+"/status",parentData:e,parentDataProperty:"status",rootData:u,dynamicAnchors:c})||(t=t===null?x.errors:t.concat(x.errors),r=t.length);var s=a===r}else var s=!0;if(s){if(e.availability!==void 0){let a=r;O(e.availability,{instancePath:n+"/availability",parentData:e,parentDataProperty:"availability",rootData:u,dynamicAnchors:c})||(t=t===null?O.errors:t.concat(O.errors),r=t.length);var s=a===r}else var s=!0;if(s){if(e.first_video_at!==void 0){let a=r;g(e.first_video_at,{instancePath:n+"/first_video_at",parentData:e,parentDataProperty:"first_video_at",rootData:u,dynamicAnchors:c})||(t=t===null?g.errors:t.concat(g.errors),r=t.length);var s=a===r}else var s=!0;if(s){if(e.last_frame_ts!==void 0){let a=r;g(e.last_frame_ts,{instancePath:n+"/last_frame_ts",parentData:e,parentDataProperty:"last_frame_ts",rootData:u,dynamicAnchors:c})||(t=t===null?g.errors:t.concat(g.errors),r=t.length);var s=a===r}else var s=!0;if(s){if(e.current_fps!==void 0){let a=e.current_fps,i=r;if(r===i)if(typeof a=="number"&&isFinite(a)){if(a<0||isNaN(a))return f.errors=[{instancePath:n+"/current_fps",schemaPath:"#/properties/current_fps/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1}else return f.errors=[{instancePath:n+"/current_fps",schemaPath:"#/properties/current_fps/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var s=i===r}else var s=!0;if(s){if(e.recording_active!==void 0){let a=r;if(typeof e.recording_active!="boolean")return f.errors=[{instancePath:n+"/recording_active",schemaPath:"#/properties/recording_active/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var s=a===r}else var s=!0;if(s){if(e.last_recording_at!==void 0){let a=r;g(e.last_recording_at,{instancePath:n+"/last_recording_at",parentData:e,parentDataProperty:"last_recording_at",rootData:u,dynamicAnchors:c})||(t=t===null?g.errors:t.concat(g.errors),r=t.length);var s=a===r}else var s=!0;if(s)if(e.can_configure!==void 0){let a=r;if(typeof e.can_configure!="boolean")return f.errors=[{instancePath:n+"/can_configure",schemaPath:"#/properties/can_configure/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var s=a===r}else var s=!0}}}}}}}}}}}}}}}}}}}}}}}else return f.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return f.errors=t,r===0}f.evaluated={props:{camera_uuid:!0,name:!0,location_uuid:!0,location_name:!0,location_path:!0,enabled:!0,width:!0,height:!0,fps:!0,codec:!0,protocol:!0,record:!0,record_on_schedule:!0,detection_based_recording:!0,isOnvif:!0,tags:!0,status:!0,availability:!0,first_video_at:!0,last_frame_ts:!0,current_fps:!0,recording_active:!0,last_recording_at:!0,can_configure:!0},dynamicProps:!1,dynamicItems:!1};function $(e,{instancePath:n="",parentData:y,parentDataProperty:d,rootData:u=e,dynamicAnchors:c={}}={}){let t=null,r=0,o=$.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e!="string"?($.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1):e!==""?($.errors=[{instancePath:n,schemaPath:"#/const",keyword:"const",params:{allowedValue:""},message:"must be equal to constant"}],!1):($.errors=t,r===0)}$.evaluated={dynamicProps:!1,dynamicItems:!1};function k(e,{instancePath:n="",parentData:y,parentDataProperty:d,rootData:u=e,dynamicAnchors:c={}}={}){let t=null,r=0,o=k.evaluated;o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0);let s=r;f(e,{instancePath:n,parentData:y,parentDataProperty:d,rootData:u,dynamicAnchors:c})||(t=t===null?f.errors:t.concat(f.errors),r=t.length);var l=s===r;if(l){let L=r,S=r,I=!0,N=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let b;if(e.can_configure===void 0&&(b="can_configure")){let w={};t===null?t=[w]:t.push(w),r++}else if(e.can_configure!==void 0&&e.can_configure!==!1){let w={};t===null?t=[w]:t.push(w),r++}}var a=N===r;if(r=S,t!==null&&(S?t.length=S:t=null),a){let b=r;e&&typeof e=="object"&&!Array.isArray(e)&&e.admin_url!==void 0&&($(e.admin_url,{instancePath:n+"/admin_url",parentData:e,parentDataProperty:"admin_url",rootData:u,dynamicAnchors:c})||(t=t===null?$.errors:t.concat($.errors),r=t.length));var a=b===r;if(I=a,I){var i={};i.admin_url=!0,i.can_configure=!0}}if(!I){let b={instancePath:n,schemaPath:"#/allOf/1/if",keyword:"if",params:{failingKeyword:"then"},message:'must match "then" schema'};return t===null?t=[b]:t.push(b),r++,k.errors=t,!1}if(r===L)if(e&&typeof e=="object"&&!Array.isArray(e)){if(i!==!0&&(i=i||{},i.admin_url=!0),e.admin_url!==void 0){let b=e.admin_url;if(r===r)if(typeof b=="string"){if(A(b)>511)return k.errors=[{instancePath:n+"/admin_url",schemaPath:"#/allOf/1/properties/admin_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return k.errors=[{instancePath:n+"/admin_url",schemaPath:"#/allOf/1/properties/admin_url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1}}else return k.errors=[{instancePath:n,schemaPath:"#/allOf/1/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;var l=L===r;l&&i!==!0&&(i=i||{},i.camera_uuid=!0,i.name=!0,i.location_uuid=!0,i.location_name=!0,i.location_path=!0,i.enabled=!0,i.width=!0,i.height=!0,i.fps=!0,i.codec=!0,i.protocol=!0,i.record=!0,i.record_on_schedule=!0,i.detection_based_recording=!0,i.isOnvif=!0,i.tags=!0,i.status=!0,i.availability=!0,i.first_video_at=!0,i.last_frame_ts=!0,i.current_fps=!0,i.recording_active=!0,i.last_recording_at=!0,i.can_configure=!0)}return k.errors=t,o.props=i,r===0}k.evaluated={dynamicProps:!0,dynamicItems:!1};export{G as validateStreamSummaryAdmin}; diff --git a/web/js/api/generated/validators/StreamSummaryBase.d.mts b/web/js/api/generated/validators/StreamSummaryBase.d.mts new file mode 100644 index 000000000..e2b58ba0e --- /dev/null +++ b/web/js/api/generated/validators/StreamSummaryBase.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateStreamSummaryBase } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/StreamSummaryBase.mjs b/web/js/api/generated/validators/StreamSummaryBase.mjs new file mode 100644 index 000000000..bc15152b3 --- /dev/null +++ b/web/js/api/generated/validators/StreamSummaryBase.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var U=(e,s)=>()=>{try{return s||e((s={exports:{}}).exports,s),s.exports}catch(v){throw s=0,v}};var $=U(x=>{"use strict";Object.defineProperty(x,"__esModule",{value:!0});function F(e){let s=e.length,v=0,d=0,u;for(;d=55296&&u<=56319&&d36)return g.errors=[{instancePath:s,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:36},message:"must NOT have more than 36 characters"}],!1;if(!C.test(e))return g.errors=[{instancePath:s,schemaPath:"#/pattern",keyword:"pattern",params:{pattern:"^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$"},message:'must match pattern "^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$"'}],!1}else return g.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return g.errors=t,r===0}g.evaluated={dynamicProps:!1,dynamicItems:!1};function b(e,{instancePath:s="",parentData:v,parentDataProperty:d,rootData:u=e,dynamicAnchors:m={}}={}){let t=null,r=0,a=b.evaluated;if(a.dynamicProps&&(a.props=void 0),a.dynamicItems&&(a.items=void 0),r===0)if(typeof e=="string"){if(A(e)>255)return b.errors=[{instancePath:s,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1;if(A(e)<1)return b.errors=[{instancePath:s,schemaPath:"#/minLength",keyword:"minLength",params:{limit:1},message:"must NOT have fewer than 1 characters"}],!1;if(new TextEncoder().encode(e).byteLength>255)return b.errors=[{instancePath:s,schemaPath:"#/x-lightnvr-max-bytes",keyword:"x-lightnvr-max-bytes",params:{},message:"must fit the UTF-8 byte limit"}],!1}else return b.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return b.errors=t,r===0}b.evaluated={dynamicProps:!1,dynamicItems:!1};function _(e,{instancePath:s="",parentData:v,parentDataProperty:d,rootData:u=e,dynamicAnchors:m={}}={}){let t=null,r=0,a=_.evaluated;if(a.dynamicProps&&(a.props=void 0),a.dynamicItems&&(a.items=void 0),!(typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)))return _.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(r===0&&typeof e=="number"&&isFinite(e)){if(e>2147483647||isNaN(e))return _.errors=[{instancePath:s,schemaPath:"#/maximum",keyword:"maximum",params:{comparison:"<=",limit:2147483647},message:"must be <= 2147483647"}],!1;if(e<-2147483648||isNaN(e))return _.errors=[{instancePath:s,schemaPath:"#/minimum",keyword:"minimum",params:{comparison:">=",limit:-2147483648},message:"must be >= -2147483648"}],!1}return _.errors=t,r===0}_.evaluated={dynamicProps:!1,dynamicItems:!1};var Z={type:"integer",enum:[0,1],$id:"urn:lightnvr:contract:StreamProtocol"};function P(e,{instancePath:s="",parentData:v,parentDataProperty:d,rootData:u=e,dynamicAnchors:m={}}={}){let t=null,r=0,a=P.evaluated;return a.dynamicProps&&(a.props=void 0),a.dynamicItems&&(a.items=void 0),typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)?e===0||e===1?(P.errors=t,r===0):(P.errors=[{instancePath:s,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:Z.enum},message:"must be equal to one of the allowed values"}],!1):(P.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1)}P.evaluated={dynamicProps:!1,dynamicItems:!1};var R={type:"string",enum:["Running","Degraded","Error","Stopped","Unknown"],$id:"urn:lightnvr:contract:SummaryStatus"};function w(e,{instancePath:s="",parentData:v,parentDataProperty:d,rootData:u=e,dynamicAnchors:m={}}={}){let t=null,r=0,a=w.evaluated;return a.dynamicProps&&(a.props=void 0),a.dynamicItems&&(a.items=void 0),typeof e!="string"?(w.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1):e==="Running"||e==="Degraded"||e==="Error"||e==="Stopped"||e==="Unknown"?(w.errors=t,r===0):(w.errors=[{instancePath:s,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:R.enum},message:"must be equal to one of the allowed values"}],!1)}w.evaluated={dynamicProps:!1,dynamicItems:!1};var V={type:"string",enum:["live","offline","never_connected","disabled"],$id:"urn:lightnvr:contract:Availability"};function k(e,{instancePath:s="",parentData:v,parentDataProperty:d,rootData:u=e,dynamicAnchors:m={}}={}){let t=null,r=0,a=k.evaluated;return a.dynamicProps&&(a.props=void 0),a.dynamicItems&&(a.items=void 0),typeof e!="string"?(k.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1):e==="live"||e==="offline"||e==="never_connected"||e==="disabled"?(k.errors=t,r===0):(k.errors=[{instancePath:s,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:V.enum},message:"must be equal to one of the allowed values"}],!1)}k.evaluated={dynamicProps:!1,dynamicItems:!1};function h(e,{instancePath:s="",parentData:v,parentDataProperty:d,rootData:u=e,dynamicAnchors:m={}}={}){let t=null,r=0,a=h.evaluated;return a.dynamicProps&&(a.props=void 0),a.dynamicItems&&(a.items=void 0),typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)?r===0&&typeof e=="number"&&isFinite(e)&&(e<0||isNaN(e))?(h.errors=[{instancePath:s,schemaPath:"#/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1):(h.errors=t,r===0):(h.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1)}h.evaluated={dynamicProps:!1,dynamicItems:!1};function f(e,{instancePath:s="",parentData:v,parentDataProperty:d,rootData:u=e,dynamicAnchors:m={}}={}){let t=null,r=0,a=f.evaluated;if(a.dynamicProps&&(a.props=void 0),a.dynamicItems&&(a.items=void 0),D(e,{instancePath:s,parentData:v,parentDataProperty:d,rootData:u,dynamicAnchors:m})||(t=t===null?D.errors:t.concat(D.errors),r=t.length),r===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let l;if(e.camera_uuid===void 0&&(l="camera_uuid")||e.name===void 0&&(l="name")||e.location_uuid===void 0&&(l="location_uuid")||e.location_name===void 0&&(l="location_name")||e.location_path===void 0&&(l="location_path")||e.enabled===void 0&&(l="enabled")||e.width===void 0&&(l="width")||e.height===void 0&&(l="height")||e.fps===void 0&&(l="fps")||e.codec===void 0&&(l="codec")||e.protocol===void 0&&(l="protocol")||e.record===void 0&&(l="record")||e.record_on_schedule===void 0&&(l="record_on_schedule")||e.detection_based_recording===void 0&&(l="detection_based_recording")||e.isOnvif===void 0&&(l="isOnvif")||e.tags===void 0&&(l="tags")||e.status===void 0&&(l="status")||e.availability===void 0&&(l="availability")||e.first_video_at===void 0&&(l="first_video_at")||e.last_frame_ts===void 0&&(l="last_frame_ts")||e.current_fps===void 0&&(l="current_fps")||e.recording_active===void 0&&(l="recording_active")||e.last_recording_at===void 0&&(l="last_recording_at")||e.can_configure===void 0&&(l="can_configure"))return f.errors=[{instancePath:s,schemaPath:"#/required",keyword:"required",params:{missingProperty:l},message:"must have required property '"+l+"'"}],!1;if(e.camera_uuid!==void 0){let i=r;g(e.camera_uuid,{instancePath:s+"/camera_uuid",parentData:e,parentDataProperty:"camera_uuid",rootData:u,dynamicAnchors:m})||(t=t===null?g.errors:t.concat(g.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.name!==void 0){let i=r;b(e.name,{instancePath:s+"/name",parentData:e,parentDataProperty:"name",rootData:u,dynamicAnchors:m})||(t=t===null?b.errors:t.concat(b.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.location_uuid!==void 0){let i=r;g(e.location_uuid,{instancePath:s+"/location_uuid",parentData:e,parentDataProperty:"location_uuid",rootData:u,dynamicAnchors:m})||(t=t===null?g.errors:t.concat(g.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.location_name!==void 0){let i=e.location_name,o=r;if(r===o)if(typeof i=="string"){if(A(i)>127)return f.errors=[{instancePath:s+"/location_name",schemaPath:"#/properties/location_name/maxLength",keyword:"maxLength",params:{limit:127},message:"must NOT have more than 127 characters"}],!1}else return f.errors=[{instancePath:s+"/location_name",schemaPath:"#/properties/location_name/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=o===r}else var n=!0;if(n){if(e.location_path!==void 0){let i=e.location_path,o=r;if(r===o)if(typeof i=="string"){if(A(i)>1023)return f.errors=[{instancePath:s+"/location_path",schemaPath:"#/properties/location_path/maxLength",keyword:"maxLength",params:{limit:1023},message:"must NOT have more than 1023 characters"}],!1}else return f.errors=[{instancePath:s+"/location_path",schemaPath:"#/properties/location_path/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=o===r}else var n=!0;if(n){if(e.enabled!==void 0){let i=r;if(typeof e.enabled!="boolean")return f.errors=[{instancePath:s+"/enabled",schemaPath:"#/properties/enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.width!==void 0){let i=r;_(e.width,{instancePath:s+"/width",parentData:e,parentDataProperty:"width",rootData:u,dynamicAnchors:m})||(t=t===null?_.errors:t.concat(_.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.height!==void 0){let i=r;_(e.height,{instancePath:s+"/height",parentData:e,parentDataProperty:"height",rootData:u,dynamicAnchors:m})||(t=t===null?_.errors:t.concat(_.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.fps!==void 0){let i=r;_(e.fps,{instancePath:s+"/fps",parentData:e,parentDataProperty:"fps",rootData:u,dynamicAnchors:m})||(t=t===null?_.errors:t.concat(_.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.codec!==void 0){let i=e.codec,o=r;if(r===o)if(typeof i=="string"){if(A(i)>15)return f.errors=[{instancePath:s+"/codec",schemaPath:"#/properties/codec/maxLength",keyword:"maxLength",params:{limit:15},message:"must NOT have more than 15 characters"}],!1}else return f.errors=[{instancePath:s+"/codec",schemaPath:"#/properties/codec/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=o===r}else var n=!0;if(n){if(e.protocol!==void 0){let i=r;P(e.protocol,{instancePath:s+"/protocol",parentData:e,parentDataProperty:"protocol",rootData:u,dynamicAnchors:m})||(t=t===null?P.errors:t.concat(P.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.record!==void 0){let i=r;if(typeof e.record!="boolean")return f.errors=[{instancePath:s+"/record",schemaPath:"#/properties/record/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.record_on_schedule!==void 0){let i=r;if(typeof e.record_on_schedule!="boolean")return f.errors=[{instancePath:s+"/record_on_schedule",schemaPath:"#/properties/record_on_schedule/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.detection_based_recording!==void 0){let i=r;if(typeof e.detection_based_recording!="boolean")return f.errors=[{instancePath:s+"/detection_based_recording",schemaPath:"#/properties/detection_based_recording/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.isOnvif!==void 0){let i=r;if(typeof e.isOnvif!="boolean")return f.errors=[{instancePath:s+"/isOnvif",schemaPath:"#/properties/isOnvif/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.tags!==void 0){let i=e.tags,o=r;if(r===o)if(typeof i=="string"){if(A(i)>255)return f.errors=[{instancePath:s+"/tags",schemaPath:"#/properties/tags/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1}else return f.errors=[{instancePath:s+"/tags",schemaPath:"#/properties/tags/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=o===r}else var n=!0;if(n){if(e.status!==void 0){let i=r;w(e.status,{instancePath:s+"/status",parentData:e,parentDataProperty:"status",rootData:u,dynamicAnchors:m})||(t=t===null?w.errors:t.concat(w.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.availability!==void 0){let i=r;k(e.availability,{instancePath:s+"/availability",parentData:e,parentDataProperty:"availability",rootData:u,dynamicAnchors:m})||(t=t===null?k.errors:t.concat(k.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.first_video_at!==void 0){let i=r;h(e.first_video_at,{instancePath:s+"/first_video_at",parentData:e,parentDataProperty:"first_video_at",rootData:u,dynamicAnchors:m})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.last_frame_ts!==void 0){let i=r;h(e.last_frame_ts,{instancePath:s+"/last_frame_ts",parentData:e,parentDataProperty:"last_frame_ts",rootData:u,dynamicAnchors:m})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var n=i===r}else var n=!0;if(n){if(e.current_fps!==void 0){let i=e.current_fps,o=r;if(r===o)if(typeof i=="number"&&isFinite(i)){if(i<0||isNaN(i))return f.errors=[{instancePath:s+"/current_fps",schemaPath:"#/properties/current_fps/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1}else return f.errors=[{instancePath:s+"/current_fps",schemaPath:"#/properties/current_fps/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var n=o===r}else var n=!0;if(n){if(e.recording_active!==void 0){let i=r;if(typeof e.recording_active!="boolean")return f.errors=[{instancePath:s+"/recording_active",schemaPath:"#/properties/recording_active/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0;if(n){if(e.last_recording_at!==void 0){let i=r;h(e.last_recording_at,{instancePath:s+"/last_recording_at",parentData:e,parentDataProperty:"last_recording_at",rootData:u,dynamicAnchors:m})||(t=t===null?h.errors:t.concat(h.errors),r=t.length);var n=i===r}else var n=!0;if(n)if(e.can_configure!==void 0){let i=r;if(typeof e.can_configure!="boolean")return f.errors=[{instancePath:s+"/can_configure",schemaPath:"#/properties/can_configure/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=i===r}else var n=!0}}}}}}}}}}}}}}}}}}}}}}}else return f.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return f.errors=t,r===0}f.evaluated={props:{camera_uuid:!0,name:!0,location_uuid:!0,location_name:!0,location_path:!0,enabled:!0,width:!0,height:!0,fps:!0,codec:!0,protocol:!0,record:!0,record_on_schedule:!0,detection_based_recording:!0,isOnvif:!0,tags:!0,status:!0,availability:!0,first_video_at:!0,last_frame_ts:!0,current_fps:!0,recording_active:!0,last_recording_at:!0,can_configure:!0},dynamicProps:!1,dynamicItems:!1};export{M as validateStreamSummaryBase}; diff --git a/web/js/api/generated/validators/StreamSummaryLive.d.mts b/web/js/api/generated/validators/StreamSummaryLive.d.mts new file mode 100644 index 000000000..1f6da479a --- /dev/null +++ b/web/js/api/generated/validators/StreamSummaryLive.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateStreamSummaryLive } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/StreamSummaryLive.mjs b/web/js/api/generated/validators/StreamSummaryLive.mjs new file mode 100644 index 000000000..2c2dc2360 --- /dev/null +++ b/web/js/api/generated/validators/StreamSummaryLive.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var C=(e,n)=>()=>{try{return n||e((n={exports:{}}).exports,n),n.exports}catch(_){throw n=0,_}};var Y=C(I=>{"use strict";Object.defineProperty(I,"__esModule",{value:!0});function E(e){let n=e.length,_=0,y=0,u;for(;y=55296&&u<=56319&&y36)return k.errors=[{instancePath:n,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:36},message:"must NOT have more than 36 characters"}],!1;if(!U.test(e))return k.errors=[{instancePath:n,schemaPath:"#/pattern",keyword:"pattern",params:{pattern:"^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$"},message:'must match pattern "^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$"'}],!1}else return k.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return k.errors=t,r===0}k.evaluated={dynamicProps:!1,dynamicItems:!1};function x(e,{instancePath:n="",parentData:_,parentDataProperty:y,rootData:u=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=x.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(typeof e=="string"){if(F(e)>255)return x.errors=[{instancePath:n,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1;if(F(e)<1)return x.errors=[{instancePath:n,schemaPath:"#/minLength",keyword:"minLength",params:{limit:1},message:"must NOT have fewer than 1 characters"}],!1;if(new TextEncoder().encode(e).byteLength>255)return x.errors=[{instancePath:n,schemaPath:"#/x-lightnvr-max-bytes",keyword:"x-lightnvr-max-bytes",params:{},message:"must fit the UTF-8 byte limit"}],!1}else return x.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return x.errors=t,r===0}x.evaluated={dynamicProps:!1,dynamicItems:!1};function w(e,{instancePath:n="",parentData:_,parentDataProperty:y,rootData:u=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=w.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),!(typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)))return w.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(r===0&&typeof e=="number"&&isFinite(e)){if(e>2147483647||isNaN(e))return w.errors=[{instancePath:n,schemaPath:"#/maximum",keyword:"maximum",params:{comparison:"<=",limit:2147483647},message:"must be <= 2147483647"}],!1;if(e<-2147483648||isNaN(e))return w.errors=[{instancePath:n,schemaPath:"#/minimum",keyword:"minimum",params:{comparison:">=",limit:-2147483648},message:"must be >= -2147483648"}],!1}return w.errors=t,r===0}w.evaluated={dynamicProps:!1,dynamicItems:!1};var Z={type:"integer",enum:[0,1],$id:"urn:lightnvr:contract:StreamProtocol"};function D(e,{instancePath:n="",parentData:_,parentDataProperty:y,rootData:u=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=D.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)?e===0||e===1?(D.errors=t,r===0):(D.errors=[{instancePath:n,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:Z.enum},message:"must be equal to one of the allowed values"}],!1):(D.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1)}D.evaluated={dynamicProps:!1,dynamicItems:!1};var R={type:"string",enum:["Running","Degraded","Error","Stopped","Unknown"],$id:"urn:lightnvr:contract:SummaryStatus"};function A(e,{instancePath:n="",parentData:_,parentDataProperty:y,rootData:u=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=A.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e!="string"?(A.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1):e==="Running"||e==="Degraded"||e==="Error"||e==="Stopped"||e==="Unknown"?(A.errors=t,r===0):(A.errors=[{instancePath:n,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:R.enum},message:"must be equal to one of the allowed values"}],!1)}A.evaluated={dynamicProps:!1,dynamicItems:!1};var B={type:"string",enum:["live","offline","never_connected","disabled"],$id:"urn:lightnvr:contract:Availability"};function O(e,{instancePath:n="",parentData:_,parentDataProperty:y,rootData:u=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=O.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e!="string"?(O.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1):e==="live"||e==="offline"||e==="never_connected"||e==="disabled"?(O.errors=t,r===0):(O.errors=[{instancePath:n,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:B.enum},message:"must be equal to one of the allowed values"}],!1)}O.evaluated={dynamicProps:!1,dynamicItems:!1};function P(e,{instancePath:n="",parentData:_,parentDataProperty:y,rootData:u=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=P.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)?r===0&&typeof e=="number"&&isFinite(e)&&(e<0||isNaN(e))?(P.errors=[{instancePath:n,schemaPath:"#/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1):(P.errors=t,r===0):(P.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1)}P.evaluated={dynamicProps:!1,dynamicItems:!1};function p(e,{instancePath:n="",parentData:_,parentDataProperty:y,rootData:u=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=p.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),$(e,{instancePath:n,parentData:_,parentDataProperty:y,rootData:u,dynamicAnchors:f})||(t=t===null?$.errors:t.concat($.errors),r=t.length),r===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let l;if(e.camera_uuid===void 0&&(l="camera_uuid")||e.name===void 0&&(l="name")||e.location_uuid===void 0&&(l="location_uuid")||e.location_name===void 0&&(l="location_name")||e.location_path===void 0&&(l="location_path")||e.enabled===void 0&&(l="enabled")||e.width===void 0&&(l="width")||e.height===void 0&&(l="height")||e.fps===void 0&&(l="fps")||e.codec===void 0&&(l="codec")||e.protocol===void 0&&(l="protocol")||e.record===void 0&&(l="record")||e.record_on_schedule===void 0&&(l="record_on_schedule")||e.detection_based_recording===void 0&&(l="detection_based_recording")||e.isOnvif===void 0&&(l="isOnvif")||e.tags===void 0&&(l="tags")||e.status===void 0&&(l="status")||e.availability===void 0&&(l="availability")||e.first_video_at===void 0&&(l="first_video_at")||e.last_frame_ts===void 0&&(l="last_frame_ts")||e.current_fps===void 0&&(l="current_fps")||e.recording_active===void 0&&(l="recording_active")||e.last_recording_at===void 0&&(l="last_recording_at")||e.can_configure===void 0&&(l="can_configure"))return p.errors=[{instancePath:n,schemaPath:"#/required",keyword:"required",params:{missingProperty:l},message:"must have required property '"+l+"'"}],!1;if(e.camera_uuid!==void 0){let s=r;k(e.camera_uuid,{instancePath:n+"/camera_uuid",parentData:e,parentDataProperty:"camera_uuid",rootData:u,dynamicAnchors:f})||(t=t===null?k.errors:t.concat(k.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.name!==void 0){let s=r;x(e.name,{instancePath:n+"/name",parentData:e,parentDataProperty:"name",rootData:u,dynamicAnchors:f})||(t=t===null?x.errors:t.concat(x.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.location_uuid!==void 0){let s=r;k(e.location_uuid,{instancePath:n+"/location_uuid",parentData:e,parentDataProperty:"location_uuid",rootData:u,dynamicAnchors:f})||(t=t===null?k.errors:t.concat(k.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.location_name!==void 0){let s=e.location_name,a=r;if(r===a)if(typeof s=="string"){if(F(s)>127)return p.errors=[{instancePath:n+"/location_name",schemaPath:"#/properties/location_name/maxLength",keyword:"maxLength",params:{limit:127},message:"must NOT have more than 127 characters"}],!1}else return p.errors=[{instancePath:n+"/location_name",schemaPath:"#/properties/location_name/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=a===r}else var i=!0;if(i){if(e.location_path!==void 0){let s=e.location_path,a=r;if(r===a)if(typeof s=="string"){if(F(s)>1023)return p.errors=[{instancePath:n+"/location_path",schemaPath:"#/properties/location_path/maxLength",keyword:"maxLength",params:{limit:1023},message:"must NOT have more than 1023 characters"}],!1}else return p.errors=[{instancePath:n+"/location_path",schemaPath:"#/properties/location_path/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=a===r}else var i=!0;if(i){if(e.enabled!==void 0){let s=r;if(typeof e.enabled!="boolean")return p.errors=[{instancePath:n+"/enabled",schemaPath:"#/properties/enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.width!==void 0){let s=r;w(e.width,{instancePath:n+"/width",parentData:e,parentDataProperty:"width",rootData:u,dynamicAnchors:f})||(t=t===null?w.errors:t.concat(w.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.height!==void 0){let s=r;w(e.height,{instancePath:n+"/height",parentData:e,parentDataProperty:"height",rootData:u,dynamicAnchors:f})||(t=t===null?w.errors:t.concat(w.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.fps!==void 0){let s=r;w(e.fps,{instancePath:n+"/fps",parentData:e,parentDataProperty:"fps",rootData:u,dynamicAnchors:f})||(t=t===null?w.errors:t.concat(w.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.codec!==void 0){let s=e.codec,a=r;if(r===a)if(typeof s=="string"){if(F(s)>15)return p.errors=[{instancePath:n+"/codec",schemaPath:"#/properties/codec/maxLength",keyword:"maxLength",params:{limit:15},message:"must NOT have more than 15 characters"}],!1}else return p.errors=[{instancePath:n+"/codec",schemaPath:"#/properties/codec/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=a===r}else var i=!0;if(i){if(e.protocol!==void 0){let s=r;D(e.protocol,{instancePath:n+"/protocol",parentData:e,parentDataProperty:"protocol",rootData:u,dynamicAnchors:f})||(t=t===null?D.errors:t.concat(D.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.record!==void 0){let s=r;if(typeof e.record!="boolean")return p.errors=[{instancePath:n+"/record",schemaPath:"#/properties/record/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.record_on_schedule!==void 0){let s=r;if(typeof e.record_on_schedule!="boolean")return p.errors=[{instancePath:n+"/record_on_schedule",schemaPath:"#/properties/record_on_schedule/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.detection_based_recording!==void 0){let s=r;if(typeof e.detection_based_recording!="boolean")return p.errors=[{instancePath:n+"/detection_based_recording",schemaPath:"#/properties/detection_based_recording/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.isOnvif!==void 0){let s=r;if(typeof e.isOnvif!="boolean")return p.errors=[{instancePath:n+"/isOnvif",schemaPath:"#/properties/isOnvif/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.tags!==void 0){let s=e.tags,a=r;if(r===a)if(typeof s=="string"){if(F(s)>255)return p.errors=[{instancePath:n+"/tags",schemaPath:"#/properties/tags/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1}else return p.errors=[{instancePath:n+"/tags",schemaPath:"#/properties/tags/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var i=a===r}else var i=!0;if(i){if(e.status!==void 0){let s=r;A(e.status,{instancePath:n+"/status",parentData:e,parentDataProperty:"status",rootData:u,dynamicAnchors:f})||(t=t===null?A.errors:t.concat(A.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.availability!==void 0){let s=r;O(e.availability,{instancePath:n+"/availability",parentData:e,parentDataProperty:"availability",rootData:u,dynamicAnchors:f})||(t=t===null?O.errors:t.concat(O.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.first_video_at!==void 0){let s=r;P(e.first_video_at,{instancePath:n+"/first_video_at",parentData:e,parentDataProperty:"first_video_at",rootData:u,dynamicAnchors:f})||(t=t===null?P.errors:t.concat(P.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.last_frame_ts!==void 0){let s=r;P(e.last_frame_ts,{instancePath:n+"/last_frame_ts",parentData:e,parentDataProperty:"last_frame_ts",rootData:u,dynamicAnchors:f})||(t=t===null?P.errors:t.concat(P.errors),r=t.length);var i=s===r}else var i=!0;if(i){if(e.current_fps!==void 0){let s=e.current_fps,a=r;if(r===a)if(typeof s=="number"&&isFinite(s)){if(s<0||isNaN(s))return p.errors=[{instancePath:n+"/current_fps",schemaPath:"#/properties/current_fps/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1}else return p.errors=[{instancePath:n+"/current_fps",schemaPath:"#/properties/current_fps/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var i=a===r}else var i=!0;if(i){if(e.recording_active!==void 0){let s=r;if(typeof e.recording_active!="boolean")return p.errors=[{instancePath:n+"/recording_active",schemaPath:"#/properties/recording_active/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0;if(i){if(e.last_recording_at!==void 0){let s=r;P(e.last_recording_at,{instancePath:n+"/last_recording_at",parentData:e,parentDataProperty:"last_recording_at",rootData:u,dynamicAnchors:f})||(t=t===null?P.errors:t.concat(P.errors),r=t.length);var i=s===r}else var i=!0;if(i)if(e.can_configure!==void 0){let s=r;if(typeof e.can_configure!="boolean")return p.errors=[{instancePath:n+"/can_configure",schemaPath:"#/properties/can_configure/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var i=s===r}else var i=!0}}}}}}}}}}}}}}}}}}}}}}}else return p.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return p.errors=t,r===0}p.evaluated={props:{camera_uuid:!0,name:!0,location_uuid:!0,location_name:!0,location_path:!0,enabled:!0,width:!0,height:!0,fps:!0,codec:!0,protocol:!0,record:!0,record_on_schedule:!0,detection_based_recording:!0,isOnvif:!0,tags:!0,status:!0,availability:!0,first_video_at:!0,last_frame_ts:!0,current_fps:!0,recording_active:!0,last_recording_at:!0,can_configure:!0},dynamicProps:!1,dynamicItems:!1};var J={type:"string",enum:["auto","webrtc_only","mse_only","hls_only","webrtc_then_mse","mse_then_hls"],$id:"urn:lightnvr:contract:PlaybackTransport"};function S(e,{instancePath:n="",parentData:_,parentDataProperty:y,rootData:u=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=S.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e!="string"?(S.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1):e==="auto"||e==="webrtc_only"||e==="mse_only"||e==="hls_only"||e==="webrtc_then_mse"||e==="mse_then_hls"?(S.errors=t,r===0):(S.errors=[{instancePath:n,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:J.enum},message:"must be equal to one of the allowed values"}],!1)}S.evaluated={dynamicProps:!1,dynamicItems:!1};function m(e,{instancePath:n="",parentData:_,parentDataProperty:y,rootData:u=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=m.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let l;if(e.version===void 0&&(l="version")||e.projection===void 0&&(l="projection")||e.mount===void 0&&(l="mount")||e.centerX===void 0&&(l="centerX")||e.centerY===void 0&&(l="centerY")||e.radius===void 0&&(l="radius")||e.fov===void 0&&(l="fov")||e.rotation===void 0&&(l="rotation")||e.defaultYaw===void 0&&(l="defaultYaw")||e.defaultTilt===void 0&&(l="defaultTilt")||e.defaultViewFov===void 0&&(l="defaultViewFov"))return m.errors=[{instancePath:n,schemaPath:"#/required",keyword:"required",params:{missingProperty:l},message:"must have required property '"+l+"'"}],!1;if(e.version!==void 0){let s=r;if(e.version!==1)return m.errors=[{instancePath:n+"/version",schemaPath:"#/properties/version/const",keyword:"const",params:{allowedValue:1},message:"must be equal to constant"}],!1;var i=s===r}else var i=!0;if(i){if(e.projection!==void 0){let s=r;if(e.projection!=="equidistant")return m.errors=[{instancePath:n+"/projection",schemaPath:"#/properties/projection/const",keyword:"const",params:{allowedValue:"equidistant"},message:"must be equal to constant"}],!1;var i=s===r}else var i=!0;if(i){if(e.mount!==void 0){let s=r;if(e.mount!=="ceiling")return m.errors=[{instancePath:n+"/mount",schemaPath:"#/properties/mount/const",keyword:"const",params:{allowedValue:"ceiling"},message:"must be equal to constant"}],!1;var i=s===r}else var i=!0;if(i){if(e.centerX!==void 0){let s=e.centerX,a=r;if(r===a)if(typeof s=="number"&&isFinite(s)){if(s>1||isNaN(s))return m.errors=[{instancePath:n+"/centerX",schemaPath:"#/properties/centerX/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(s<0||isNaN(s))return m.errors=[{instancePath:n+"/centerX",schemaPath:"#/properties/centerX/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1}else return m.errors=[{instancePath:n+"/centerX",schemaPath:"#/properties/centerX/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var i=a===r}else var i=!0;if(i){if(e.centerY!==void 0){let s=e.centerY,a=r;if(r===a)if(typeof s=="number"&&isFinite(s)){if(s>1||isNaN(s))return m.errors=[{instancePath:n+"/centerY",schemaPath:"#/properties/centerY/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(s<0||isNaN(s))return m.errors=[{instancePath:n+"/centerY",schemaPath:"#/properties/centerY/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1}else return m.errors=[{instancePath:n+"/centerY",schemaPath:"#/properties/centerY/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var i=a===r}else var i=!0;if(i){if(e.radius!==void 0){let s=e.radius,a=r;if(r===a)if(typeof s=="number"&&isFinite(s)){if(s>1||isNaN(s))return m.errors=[{instancePath:n+"/radius",schemaPath:"#/properties/radius/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(s<.05||isNaN(s))return m.errors=[{instancePath:n+"/radius",schemaPath:"#/properties/radius/minimum",keyword:"minimum",params:{comparison:">=",limit:.05},message:"must be >= 0.05"}],!1}else return m.errors=[{instancePath:n+"/radius",schemaPath:"#/properties/radius/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var i=a===r}else var i=!0;if(i){if(e.fov!==void 0){let s=e.fov,a=r;if(r===a)if(typeof s=="number"&&isFinite(s)){if(s>360||isNaN(s))return m.errors=[{instancePath:n+"/fov",schemaPath:"#/properties/fov/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(s<160||isNaN(s))return m.errors=[{instancePath:n+"/fov",schemaPath:"#/properties/fov/minimum",keyword:"minimum",params:{comparison:">=",limit:160},message:"must be >= 160"}],!1}else return m.errors=[{instancePath:n+"/fov",schemaPath:"#/properties/fov/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var i=a===r}else var i=!0;if(i){if(e.rotation!==void 0){let s=e.rotation,a=r;if(r===a)if(typeof s=="number"&&isFinite(s)){if(s>360||isNaN(s))return m.errors=[{instancePath:n+"/rotation",schemaPath:"#/properties/rotation/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(s<-360||isNaN(s))return m.errors=[{instancePath:n+"/rotation",schemaPath:"#/properties/rotation/minimum",keyword:"minimum",params:{comparison:">=",limit:-360},message:"must be >= -360"}],!1}else return m.errors=[{instancePath:n+"/rotation",schemaPath:"#/properties/rotation/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var i=a===r}else var i=!0;if(i){if(e.defaultYaw!==void 0){let s=e.defaultYaw,a=r;if(r===a)if(typeof s=="number"&&isFinite(s)){if(s>360||isNaN(s))return m.errors=[{instancePath:n+"/defaultYaw",schemaPath:"#/properties/defaultYaw/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(s<-360||isNaN(s))return m.errors=[{instancePath:n+"/defaultYaw",schemaPath:"#/properties/defaultYaw/minimum",keyword:"minimum",params:{comparison:">=",limit:-360},message:"must be >= -360"}],!1}else return m.errors=[{instancePath:n+"/defaultYaw",schemaPath:"#/properties/defaultYaw/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var i=a===r}else var i=!0;if(i){if(e.defaultTilt!==void 0){let s=e.defaultTilt,a=r;if(r===a)if(typeof s=="number"&&isFinite(s)){if(s>30||isNaN(s))return m.errors=[{instancePath:n+"/defaultTilt",schemaPath:"#/properties/defaultTilt/maximum",keyword:"maximum",params:{comparison:"<=",limit:30},message:"must be <= 30"}],!1;if(s<-90||isNaN(s))return m.errors=[{instancePath:n+"/defaultTilt",schemaPath:"#/properties/defaultTilt/minimum",keyword:"minimum",params:{comparison:">=",limit:-90},message:"must be >= -90"}],!1}else return m.errors=[{instancePath:n+"/defaultTilt",schemaPath:"#/properties/defaultTilt/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var i=a===r}else var i=!0;if(i)if(e.defaultViewFov!==void 0){let s=e.defaultViewFov,a=r;if(r===a)if(typeof s=="number"&&isFinite(s)){if(s>120||isNaN(s))return m.errors=[{instancePath:n+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/maximum",keyword:"maximum",params:{comparison:"<=",limit:120},message:"must be <= 120"}],!1;if(s<20||isNaN(s))return m.errors=[{instancePath:n+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/minimum",keyword:"minimum",params:{comparison:">=",limit:20},message:"must be >= 20"}],!1}else return m.errors=[{instancePath:n+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var i=a===r}else var i=!0}}}}}}}}}}else return m.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return m.errors=t,r===0}m.evaluated={props:{version:!0,projection:!0,mount:!0,centerX:!0,centerY:!0,radius:!0,fov:!0,rotation:!0,defaultYaw:!0,defaultTilt:!0,defaultViewFov:!0},dynamicProps:!1,dynamicItems:!1};function N(e,{instancePath:n="",parentData:_,parentDataProperty:y,rootData:u=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=N.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(typeof e=="string"){if(F(e)>1023)return N.errors=[{instancePath:n,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:1023},message:"must NOT have more than 1023 characters"}],!1;if(new TextEncoder().encode(e).byteLength>1023)return N.errors=[{instancePath:n,schemaPath:"#/x-lightnvr-max-bytes",keyword:"x-lightnvr-max-bytes",params:{},message:"must fit the UTF-8 byte limit"}],!1;if(e!==""){let l,s=!0;try{l=JSON.parse(e)}catch{s=!1}if(s){let a=r;m(l,{instancePath:n,parentData:e,parentDataProperty:y,rootData:u,dynamicAnchors:f})||(t=t===null?m.errors:t.concat(m.errors),r=t.length);var i=a===r;s=i}if(!s)return N.errors=[{instancePath:n,schemaPath:"#/contentSchema",keyword:"contentSchema",params:{},message:"must contain valid JSON matching contentSchema (or be empty)"}],!1}}else return N.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return N.errors=t,r===0}N.evaluated={dynamicProps:!1,dynamicItems:!1};function g(e,{instancePath:n="",parentData:_,parentDataProperty:y,rootData:u=e,dynamicAnchors:f={}}={}){let t=null,r=0,o=g.evaluated;o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0);let i=r;p(e,{instancePath:n,parentData:_,parentDataProperty:y,rootData:u,dynamicAnchors:f})||(t=t===null?p.errors:t.concat(p.errors),r=t.length);var l=i===r;if(l){let q=r,j=r,T=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let h;if(e.admin_url===void 0&&(h="admin_url")){let c={};t===null?t=[c]:t.push(c),r++}}var s=T===r;if(s)return g.errors=[{instancePath:n,schemaPath:"#/allOf/1/not",keyword:"not",params:{},message:"must NOT be valid"}],!1;if(r=j,t!==null&&(j?t.length=j:t=null),r===q)if(e&&typeof e=="object"&&!Array.isArray(e)){let h;if(e.streaming_enabled===void 0&&(h="streaming_enabled")||e.playback_transport===void 0&&(h="playback_transport")||e.eptz_config===void 0&&(h="eptz_config")||e.detection_model===void 0&&(h="detection_model")||e.privacy_mode===void 0&&(h="privacy_mode")||e.can_control_privacy===void 0&&(h="can_control_privacy")||e.has_sub_stream===void 0&&(h="has_sub_stream")||e.ptz_enabled===void 0&&(h="ptz_enabled")||e.backchannel_enabled===void 0&&(h="backchannel_enabled")||e.go2rtc_hls_available===void 0&&(h="go2rtc_hls_available"))return g.errors=[{instancePath:n,schemaPath:"#/allOf/1/required",keyword:"required",params:{missingProperty:h},message:"must have required property '"+h+"'"}],!1;if(e.streaming_enabled!==void 0){let c=r;if(typeof e.streaming_enabled!="boolean")return g.errors=[{instancePath:n+"/streaming_enabled",schemaPath:"#/allOf/1/properties/streaming_enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var a=c===r}else var a=!0;if(a){if(e.playback_transport!==void 0){let c=r;S(e.playback_transport,{instancePath:n+"/playback_transport",parentData:e,parentDataProperty:"playback_transport",rootData:u,dynamicAnchors:f})||(t=t===null?S.errors:t.concat(S.errors),r=t.length);var a=c===r}else var a=!0;if(a){if(e.eptz_config!==void 0){let c=r;N(e.eptz_config,{instancePath:n+"/eptz_config",parentData:e,parentDataProperty:"eptz_config",rootData:u,dynamicAnchors:f})||(t=t===null?N.errors:t.concat(N.errors),r=t.length);var a=c===r}else var a=!0;if(a){if(e.detection_model!==void 0){let c=e.detection_model,L=r;if(r===L)if(typeof c=="string"){if(F(c)>511)return g.errors=[{instancePath:n+"/detection_model",schemaPath:"#/allOf/1/properties/detection_model/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return g.errors=[{instancePath:n+"/detection_model",schemaPath:"#/allOf/1/properties/detection_model/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var a=L===r}else var a=!0;if(a){if(e.privacy_mode!==void 0){let c=r;if(typeof e.privacy_mode!="boolean")return g.errors=[{instancePath:n+"/privacy_mode",schemaPath:"#/allOf/1/properties/privacy_mode/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var a=c===r}else var a=!0;if(a){if(e.can_control_privacy!==void 0){let c=r;if(typeof e.can_control_privacy!="boolean")return g.errors=[{instancePath:n+"/can_control_privacy",schemaPath:"#/allOf/1/properties/can_control_privacy/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var a=c===r}else var a=!0;if(a){if(e.has_sub_stream!==void 0){let c=r;if(typeof e.has_sub_stream!="boolean")return g.errors=[{instancePath:n+"/has_sub_stream",schemaPath:"#/allOf/1/properties/has_sub_stream/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var a=c===r}else var a=!0;if(a){if(e.ptz_enabled!==void 0){let c=r;if(typeof e.ptz_enabled!="boolean")return g.errors=[{instancePath:n+"/ptz_enabled",schemaPath:"#/allOf/1/properties/ptz_enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var a=c===r}else var a=!0;if(a){if(e.backchannel_enabled!==void 0){let c=r;if(typeof e.backchannel_enabled!="boolean")return g.errors=[{instancePath:n+"/backchannel_enabled",schemaPath:"#/allOf/1/properties/backchannel_enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var a=c===r}else var a=!0;if(a)if(e.go2rtc_hls_available!==void 0){let c=r;if(typeof e.go2rtc_hls_available!="boolean")return g.errors=[{instancePath:n+"/go2rtc_hls_available",schemaPath:"#/allOf/1/properties/go2rtc_hls_available/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var a=c===r}else var a=!0}}}}}}}}}else return g.errors=[{instancePath:n,schemaPath:"#/allOf/1/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;var l=q===r}return g.errors=t,r===0}g.evaluated={props:{streaming_enabled:!0,playback_transport:!0,eptz_config:!0,detection_model:!0,privacy_mode:!0,can_control_privacy:!0,has_sub_stream:!0,ptz_enabled:!0,backchannel_enabled:!0,go2rtc_hls_available:!0,camera_uuid:!0,name:!0,location_uuid:!0,location_name:!0,location_path:!0,enabled:!0,width:!0,height:!0,fps:!0,codec:!0,protocol:!0,record:!0,record_on_schedule:!0,detection_based_recording:!0,isOnvif:!0,tags:!0,status:!0,availability:!0,first_video_at:!0,last_frame_ts:!0,current_fps:!0,recording_active:!0,last_recording_at:!0,can_configure:!0},dynamicProps:!1,dynamicItems:!1};export{G as validateStreamSummaryLive}; diff --git a/web/js/api/generated/validators/StreamSummaryLpr.d.mts b/web/js/api/generated/validators/StreamSummaryLpr.d.mts new file mode 100644 index 000000000..2e2fc59a2 --- /dev/null +++ b/web/js/api/generated/validators/StreamSummaryLpr.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateStreamSummaryLpr } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/StreamSummaryLpr.mjs b/web/js/api/generated/validators/StreamSummaryLpr.mjs new file mode 100644 index 000000000..4ddb5657b --- /dev/null +++ b/web/js/api/generated/validators/StreamSummaryLpr.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var F=(e,r)=>()=>{try{return r||e((r={exports:{}}).exports,r),r.exports}catch(u){throw r=0,u}};var v=F(h=>{"use strict";Object.defineProperty(h,"__esModule",{value:!0});function g(e){let r=e.length,u=0,o=0,n;for(;o=55296&&n<=56319&&o36)return m.errors=[{instancePath:r,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:36},message:"must NOT have more than 36 characters"}],!1;if(!P.test(e))return m.errors=[{instancePath:r,schemaPath:"#/pattern",keyword:"pattern",params:{pattern:"^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$"},message:'must match pattern "^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$"'}],!1}else return m.errors=[{instancePath:r,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return m.errors=s,a===0}m.evaluated={dynamicProps:!1,dynamicItems:!1};function i(e,{instancePath:r="",parentData:u,parentDataProperty:o,rootData:n=e,dynamicAnchors:c={}}={}){let s=null,a=0,t=i.evaluated;if(t.dynamicProps&&(t.props=void 0),t.dynamicItems&&(t.items=void 0),a===0)if(typeof e=="string"){if(y(e)>255)return i.errors=[{instancePath:r,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1;if(y(e)<1)return i.errors=[{instancePath:r,schemaPath:"#/minLength",keyword:"minLength",params:{limit:1},message:"must NOT have fewer than 1 characters"}],!1;if(new TextEncoder().encode(e).byteLength>255)return i.errors=[{instancePath:r,schemaPath:"#/x-lightnvr-max-bytes",keyword:"x-lightnvr-max-bytes",params:{},message:"must fit the UTF-8 byte limit"}],!1}else return i.errors=[{instancePath:r,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return i.errors=s,a===0}i.evaluated={dynamicProps:!1,dynamicItems:!1};function l(e,{instancePath:r="",parentData:u,parentDataProperty:o,rootData:n=e,dynamicAnchors:c={}}={}){let s=null,a=0,t=l.evaluated;if(t.dynamicProps&&(t.props=void 0),t.dynamicItems&&(t.items=void 0),a===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let p;if(e.camera_uuid===void 0&&(p="camera_uuid")||e.name===void 0&&(p="name"))return l.errors=[{instancePath:r,schemaPath:"#/required",keyword:"required",params:{missingProperty:p},message:"must have required property '"+p+"'"}],!1;{let A=a;for(let f in e)if(!(f==="camera_uuid"||f==="name")){return l.errors=[{instancePath:r,schemaPath:"#/additionalProperties",keyword:"additionalProperties",params:{additionalProperty:f},message:"must NOT have additional properties"}],!1;break}if(A===a){if(e.camera_uuid!==void 0){let f=a;m(e.camera_uuid,{instancePath:r+"/camera_uuid",parentData:e,parentDataProperty:"camera_uuid",rootData:n,dynamicAnchors:c})||(s=s===null?m.errors:s.concat(m.errors),a=s.length);var d=f===a}else var d=!0;if(d)if(e.name!==void 0){let f=a;i(e.name,{instancePath:r+"/name",parentData:e,parentDataProperty:"name",rootData:n,dynamicAnchors:c})||(s=s===null?i.errors:s.concat(i.errors),a=s.length);var d=f===a}else var d=!0}}}else return l.errors=[{instancePath:r,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return l.errors=s,a===0}l.evaluated={props:!0,dynamicProps:!1,dynamicItems:!1};export{w as validateStreamSummaryLpr}; diff --git a/web/js/api/generated/validators/StreamSummaryPageAdmin.d.mts b/web/js/api/generated/validators/StreamSummaryPageAdmin.d.mts new file mode 100644 index 000000000..70ae3d53f --- /dev/null +++ b/web/js/api/generated/validators/StreamSummaryPageAdmin.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateStreamSummaryPageAdmin } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/StreamSummaryPageAdmin.mjs b/web/js/api/generated/validators/StreamSummaryPageAdmin.mjs new file mode 100644 index 000000000..3038df5c3 --- /dev/null +++ b/web/js/api/generated/validators/StreamSummaryPageAdmin.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var Z=(e,i)=>()=>{try{return i||e((i={exports:{}}).exports,i),i.exports}catch(d){throw i=0,d}};var U=Z(z=>{"use strict";Object.defineProperty(z,"__esModule",{value:!0});function T(e){let i=e.length,d=0,p=0,u;for(;p=55296&&u<=56319&&p=",limit:0},message:"must be >= 0"}],!1;var n=a===r}else var n=!0;if(n){if(e.page!==void 0){let s=e.page,a=r;if(!(typeof s=="number"&&!(s%1)&&!isNaN(s)&&isFinite(s)))return g.errors=[{instancePath:i+"/page",schemaPath:"#/properties/page/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(r===a&&typeof s=="number"&&isFinite(s)){if(s>1e6||isNaN(s))return g.errors=[{instancePath:i+"/page",schemaPath:"#/properties/page/maximum",keyword:"maximum",params:{comparison:"<=",limit:1e6},message:"must be <= 1000000"}],!1;if(s<1||isNaN(s))return g.errors=[{instancePath:i+"/page",schemaPath:"#/properties/page/minimum",keyword:"minimum",params:{comparison:">=",limit:1},message:"must be >= 1"}],!1}var n=a===r}else var n=!0;if(n){if(e.page_size!==void 0){let s=e.page_size,a=r;if(!(typeof s=="number"&&!(s%1)&&!isNaN(s)&&isFinite(s)))return g.errors=[{instancePath:i+"/page_size",schemaPath:"#/properties/page_size/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(r===a&&typeof s=="number"&&isFinite(s)){if(s>100||isNaN(s))return g.errors=[{instancePath:i+"/page_size",schemaPath:"#/properties/page_size/maximum",keyword:"maximum",params:{comparison:"<=",limit:100},message:"must be <= 100"}],!1;if(s<1||isNaN(s))return g.errors=[{instancePath:i+"/page_size",schemaPath:"#/properties/page_size/minimum",keyword:"minimum",params:{comparison:">=",limit:1},message:"must be >= 1"}],!1}var n=a===r}else var n=!0;if(n)if(e.total_pages!==void 0){let s=e.total_pages,a=r;if(!(typeof s=="number"&&!(s%1)&&!isNaN(s)&&isFinite(s)))return g.errors=[{instancePath:i+"/total_pages",schemaPath:"#/properties/total_pages/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(r===a&&typeof s=="number"&&isFinite(s)&&(s<0||isNaN(s)))return g.errors=[{instancePath:i+"/total_pages",schemaPath:"#/properties/total_pages/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1;var n=a===r}else var n=!0}}}else return g.errors=[{instancePath:i,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return g.errors=t,r===0}g.evaluated={props:{total:!0,page:!0,page_size:!0,total_pages:!0},dynamicProps:!1,dynamicItems:!1};function j(e,{instancePath:i="",parentData:d,parentDataProperty:p,rootData:u=e,dynamicAnchors:m={}}={}){let t=null,r=0,o=j.evaluated;o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0);let n=r,l=r,s=r,a=!1,q=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let y;if(e.url===void 0&&(y="url")){let c={};t===null?t=[c]:t.push(c),r++}}var h=q===r;a=a||h;let D=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let y;if(e.onvif_username===void 0&&(y="onvif_username")){let c={};t===null?t=[c]:t.push(c),r++}}var h=D===r;a=a||h;let w=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let y;if(e.onvif_password===void 0&&(y="onvif_password")){let c={};t===null?t=[c]:t.push(c),r++}}var h=w===r;a=a||h;let L=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let y;if(e.sub_stream_url===void 0&&(y="sub_stream_url")){let c={};t===null?t=[c]:t.push(c),r++}}var h=L===r;a=a||h;let E=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let y;if(e.detection_url===void 0&&(y="detection_url")){let c={};t===null?t=[c]:t.push(c),r++}}var h=E===r;a=a||h;let _=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let y;if(e.publish_url===void 0&&(y="publish_url")){let c={};t===null?t=[c]:t.push(c),r++}}var h=_===r;a=a||h;let k=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let y;if(e.go2rtc_source_override===void 0&&(y="go2rtc_source_override")){let c={};t===null?t=[c]:t.push(c),r++}}var h=k===r;a=a||h;let C=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let y;if(e.detection_api_url===void 0&&(y="detection_api_url")){let c={};t===null?t=[c]:t.push(c),r++}}var h=C===r;if(a=a||h,a)r=s,t!==null&&(s?t.length=s:t=null);else{let y={};t===null?t=[y]:t.push(y),r++}var V=l===r;return V?(j.errors=[{instancePath:i,schemaPath:"#/not",keyword:"not",params:{},message:"must NOT be valid"}],!1):(r=n,t!==null&&(n?t.length=n:t=null),j.errors=t,r===0)}j.evaluated={dynamicProps:!1,dynamicItems:!1};var F=U().default,K=new RegExp("^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$","u");function P(e,{instancePath:i="",parentData:d,parentDataProperty:p,rootData:u=e,dynamicAnchors:m={}}={}){let t=null,r=0,o=P.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(typeof e=="string"){if(F(e)>36)return P.errors=[{instancePath:i,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:36},message:"must NOT have more than 36 characters"}],!1;if(!K.test(e))return P.errors=[{instancePath:i,schemaPath:"#/pattern",keyword:"pattern",params:{pattern:"^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$"},message:'must match pattern "^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$"'}],!1}else return P.errors=[{instancePath:i,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return P.errors=t,r===0}P.evaluated={dynamicProps:!1,dynamicItems:!1};function A(e,{instancePath:i="",parentData:d,parentDataProperty:p,rootData:u=e,dynamicAnchors:m={}}={}){let t=null,r=0,o=A.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(typeof e=="string"){if(F(e)>255)return A.errors=[{instancePath:i,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1;if(F(e)<1)return A.errors=[{instancePath:i,schemaPath:"#/minLength",keyword:"minLength",params:{limit:1},message:"must NOT have fewer than 1 characters"}],!1;if(new TextEncoder().encode(e).byteLength>255)return A.errors=[{instancePath:i,schemaPath:"#/x-lightnvr-max-bytes",keyword:"x-lightnvr-max-bytes",params:{},message:"must fit the UTF-8 byte limit"}],!1}else return A.errors=[{instancePath:i,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return A.errors=t,r===0}A.evaluated={dynamicProps:!1,dynamicItems:!1};function v(e,{instancePath:i="",parentData:d,parentDataProperty:p,rootData:u=e,dynamicAnchors:m={}}={}){let t=null,r=0,o=v.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),!(typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)))return v.errors=[{instancePath:i,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(r===0&&typeof e=="number"&&isFinite(e)){if(e>2147483647||isNaN(e))return v.errors=[{instancePath:i,schemaPath:"#/maximum",keyword:"maximum",params:{comparison:"<=",limit:2147483647},message:"must be <= 2147483647"}],!1;if(e<-2147483648||isNaN(e))return v.errors=[{instancePath:i,schemaPath:"#/minimum",keyword:"minimum",params:{comparison:">=",limit:-2147483648},message:"must be >= -2147483648"}],!1}return v.errors=t,r===0}v.evaluated={dynamicProps:!1,dynamicItems:!1};var M={type:"integer",enum:[0,1],$id:"urn:lightnvr:contract:StreamProtocol"};function O(e,{instancePath:i="",parentData:d,parentDataProperty:p,rootData:u=e,dynamicAnchors:m={}}={}){let t=null,r=0,o=O.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)?e===0||e===1?(O.errors=t,r===0):(O.errors=[{instancePath:i,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:M.enum},message:"must be equal to one of the allowed values"}],!1):(O.errors=[{instancePath:i,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1)}O.evaluated={dynamicProps:!1,dynamicItems:!1};var R={type:"string",enum:["Running","Degraded","Error","Stopped","Unknown"],$id:"urn:lightnvr:contract:SummaryStatus"};function S(e,{instancePath:i="",parentData:d,parentDataProperty:p,rootData:u=e,dynamicAnchors:m={}}={}){let t=null,r=0,o=S.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e!="string"?(S.errors=[{instancePath:i,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1):e==="Running"||e==="Degraded"||e==="Error"||e==="Stopped"||e==="Unknown"?(S.errors=t,r===0):(S.errors=[{instancePath:i,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:R.enum},message:"must be equal to one of the allowed values"}],!1)}S.evaluated={dynamicProps:!1,dynamicItems:!1};var B={type:"string",enum:["live","offline","never_connected","disabled"],$id:"urn:lightnvr:contract:Availability"};function $(e,{instancePath:i="",parentData:d,parentDataProperty:p,rootData:u=e,dynamicAnchors:m={}}={}){let t=null,r=0,o=$.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e!="string"?($.errors=[{instancePath:i,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1):e==="live"||e==="offline"||e==="never_connected"||e==="disabled"?($.errors=t,r===0):($.errors=[{instancePath:i,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:B.enum},message:"must be equal to one of the allowed values"}],!1)}$.evaluated={dynamicProps:!1,dynamicItems:!1};function b(e,{instancePath:i="",parentData:d,parentDataProperty:p,rootData:u=e,dynamicAnchors:m={}}={}){let t=null,r=0,o=b.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)?r===0&&typeof e=="number"&&isFinite(e)&&(e<0||isNaN(e))?(b.errors=[{instancePath:i,schemaPath:"#/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1):(b.errors=t,r===0):(b.errors=[{instancePath:i,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1)}b.evaluated={dynamicProps:!1,dynamicItems:!1};function f(e,{instancePath:i="",parentData:d,parentDataProperty:p,rootData:u=e,dynamicAnchors:m={}}={}){let t=null,r=0,o=f.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),j(e,{instancePath:i,parentData:d,parentDataProperty:p,rootData:u,dynamicAnchors:m})||(t=t===null?j.errors:t.concat(j.errors),r=t.length),r===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let l;if(e.camera_uuid===void 0&&(l="camera_uuid")||e.name===void 0&&(l="name")||e.location_uuid===void 0&&(l="location_uuid")||e.location_name===void 0&&(l="location_name")||e.location_path===void 0&&(l="location_path")||e.enabled===void 0&&(l="enabled")||e.width===void 0&&(l="width")||e.height===void 0&&(l="height")||e.fps===void 0&&(l="fps")||e.codec===void 0&&(l="codec")||e.protocol===void 0&&(l="protocol")||e.record===void 0&&(l="record")||e.record_on_schedule===void 0&&(l="record_on_schedule")||e.detection_based_recording===void 0&&(l="detection_based_recording")||e.isOnvif===void 0&&(l="isOnvif")||e.tags===void 0&&(l="tags")||e.status===void 0&&(l="status")||e.availability===void 0&&(l="availability")||e.first_video_at===void 0&&(l="first_video_at")||e.last_frame_ts===void 0&&(l="last_frame_ts")||e.current_fps===void 0&&(l="current_fps")||e.recording_active===void 0&&(l="recording_active")||e.last_recording_at===void 0&&(l="last_recording_at")||e.can_configure===void 0&&(l="can_configure"))return f.errors=[{instancePath:i,schemaPath:"#/required",keyword:"required",params:{missingProperty:l},message:"must have required property '"+l+"'"}],!1;if(e.camera_uuid!==void 0){let s=r;P(e.camera_uuid,{instancePath:i+"/camera_uuid",parentData:e,parentDataProperty:"camera_uuid",rootData:u,dynamicAnchors:m})||(t=t===null?P.errors:t.concat(P.errors),r=t.length);var n=s===r}else var n=!0;if(n){if(e.name!==void 0){let s=r;A(e.name,{instancePath:i+"/name",parentData:e,parentDataProperty:"name",rootData:u,dynamicAnchors:m})||(t=t===null?A.errors:t.concat(A.errors),r=t.length);var n=s===r}else var n=!0;if(n){if(e.location_uuid!==void 0){let s=r;P(e.location_uuid,{instancePath:i+"/location_uuid",parentData:e,parentDataProperty:"location_uuid",rootData:u,dynamicAnchors:m})||(t=t===null?P.errors:t.concat(P.errors),r=t.length);var n=s===r}else var n=!0;if(n){if(e.location_name!==void 0){let s=e.location_name,a=r;if(r===a)if(typeof s=="string"){if(F(s)>127)return f.errors=[{instancePath:i+"/location_name",schemaPath:"#/properties/location_name/maxLength",keyword:"maxLength",params:{limit:127},message:"must NOT have more than 127 characters"}],!1}else return f.errors=[{instancePath:i+"/location_name",schemaPath:"#/properties/location_name/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=a===r}else var n=!0;if(n){if(e.location_path!==void 0){let s=e.location_path,a=r;if(r===a)if(typeof s=="string"){if(F(s)>1023)return f.errors=[{instancePath:i+"/location_path",schemaPath:"#/properties/location_path/maxLength",keyword:"maxLength",params:{limit:1023},message:"must NOT have more than 1023 characters"}],!1}else return f.errors=[{instancePath:i+"/location_path",schemaPath:"#/properties/location_path/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=a===r}else var n=!0;if(n){if(e.enabled!==void 0){let s=r;if(typeof e.enabled!="boolean")return f.errors=[{instancePath:i+"/enabled",schemaPath:"#/properties/enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=s===r}else var n=!0;if(n){if(e.width!==void 0){let s=r;v(e.width,{instancePath:i+"/width",parentData:e,parentDataProperty:"width",rootData:u,dynamicAnchors:m})||(t=t===null?v.errors:t.concat(v.errors),r=t.length);var n=s===r}else var n=!0;if(n){if(e.height!==void 0){let s=r;v(e.height,{instancePath:i+"/height",parentData:e,parentDataProperty:"height",rootData:u,dynamicAnchors:m})||(t=t===null?v.errors:t.concat(v.errors),r=t.length);var n=s===r}else var n=!0;if(n){if(e.fps!==void 0){let s=r;v(e.fps,{instancePath:i+"/fps",parentData:e,parentDataProperty:"fps",rootData:u,dynamicAnchors:m})||(t=t===null?v.errors:t.concat(v.errors),r=t.length);var n=s===r}else var n=!0;if(n){if(e.codec!==void 0){let s=e.codec,a=r;if(r===a)if(typeof s=="string"){if(F(s)>15)return f.errors=[{instancePath:i+"/codec",schemaPath:"#/properties/codec/maxLength",keyword:"maxLength",params:{limit:15},message:"must NOT have more than 15 characters"}],!1}else return f.errors=[{instancePath:i+"/codec",schemaPath:"#/properties/codec/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=a===r}else var n=!0;if(n){if(e.protocol!==void 0){let s=r;O(e.protocol,{instancePath:i+"/protocol",parentData:e,parentDataProperty:"protocol",rootData:u,dynamicAnchors:m})||(t=t===null?O.errors:t.concat(O.errors),r=t.length);var n=s===r}else var n=!0;if(n){if(e.record!==void 0){let s=r;if(typeof e.record!="boolean")return f.errors=[{instancePath:i+"/record",schemaPath:"#/properties/record/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=s===r}else var n=!0;if(n){if(e.record_on_schedule!==void 0){let s=r;if(typeof e.record_on_schedule!="boolean")return f.errors=[{instancePath:i+"/record_on_schedule",schemaPath:"#/properties/record_on_schedule/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=s===r}else var n=!0;if(n){if(e.detection_based_recording!==void 0){let s=r;if(typeof e.detection_based_recording!="boolean")return f.errors=[{instancePath:i+"/detection_based_recording",schemaPath:"#/properties/detection_based_recording/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=s===r}else var n=!0;if(n){if(e.isOnvif!==void 0){let s=r;if(typeof e.isOnvif!="boolean")return f.errors=[{instancePath:i+"/isOnvif",schemaPath:"#/properties/isOnvif/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=s===r}else var n=!0;if(n){if(e.tags!==void 0){let s=e.tags,a=r;if(r===a)if(typeof s=="string"){if(F(s)>255)return f.errors=[{instancePath:i+"/tags",schemaPath:"#/properties/tags/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1}else return f.errors=[{instancePath:i+"/tags",schemaPath:"#/properties/tags/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=a===r}else var n=!0;if(n){if(e.status!==void 0){let s=r;S(e.status,{instancePath:i+"/status",parentData:e,parentDataProperty:"status",rootData:u,dynamicAnchors:m})||(t=t===null?S.errors:t.concat(S.errors),r=t.length);var n=s===r}else var n=!0;if(n){if(e.availability!==void 0){let s=r;$(e.availability,{instancePath:i+"/availability",parentData:e,parentDataProperty:"availability",rootData:u,dynamicAnchors:m})||(t=t===null?$.errors:t.concat($.errors),r=t.length);var n=s===r}else var n=!0;if(n){if(e.first_video_at!==void 0){let s=r;b(e.first_video_at,{instancePath:i+"/first_video_at",parentData:e,parentDataProperty:"first_video_at",rootData:u,dynamicAnchors:m})||(t=t===null?b.errors:t.concat(b.errors),r=t.length);var n=s===r}else var n=!0;if(n){if(e.last_frame_ts!==void 0){let s=r;b(e.last_frame_ts,{instancePath:i+"/last_frame_ts",parentData:e,parentDataProperty:"last_frame_ts",rootData:u,dynamicAnchors:m})||(t=t===null?b.errors:t.concat(b.errors),r=t.length);var n=s===r}else var n=!0;if(n){if(e.current_fps!==void 0){let s=e.current_fps,a=r;if(r===a)if(typeof s=="number"&&isFinite(s)){if(s<0||isNaN(s))return f.errors=[{instancePath:i+"/current_fps",schemaPath:"#/properties/current_fps/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1}else return f.errors=[{instancePath:i+"/current_fps",schemaPath:"#/properties/current_fps/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var n=a===r}else var n=!0;if(n){if(e.recording_active!==void 0){let s=r;if(typeof e.recording_active!="boolean")return f.errors=[{instancePath:i+"/recording_active",schemaPath:"#/properties/recording_active/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=s===r}else var n=!0;if(n){if(e.last_recording_at!==void 0){let s=r;b(e.last_recording_at,{instancePath:i+"/last_recording_at",parentData:e,parentDataProperty:"last_recording_at",rootData:u,dynamicAnchors:m})||(t=t===null?b.errors:t.concat(b.errors),r=t.length);var n=s===r}else var n=!0;if(n)if(e.can_configure!==void 0){let s=r;if(typeof e.can_configure!="boolean")return f.errors=[{instancePath:i+"/can_configure",schemaPath:"#/properties/can_configure/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=s===r}else var n=!0}}}}}}}}}}}}}}}}}}}}}}}else return f.errors=[{instancePath:i,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return f.errors=t,r===0}f.evaluated={props:{camera_uuid:!0,name:!0,location_uuid:!0,location_name:!0,location_path:!0,enabled:!0,width:!0,height:!0,fps:!0,codec:!0,protocol:!0,record:!0,record_on_schedule:!0,detection_based_recording:!0,isOnvif:!0,tags:!0,status:!0,availability:!0,first_video_at:!0,last_frame_ts:!0,current_fps:!0,recording_active:!0,last_recording_at:!0,can_configure:!0},dynamicProps:!1,dynamicItems:!1};function I(e,{instancePath:i="",parentData:d,parentDataProperty:p,rootData:u=e,dynamicAnchors:m={}}={}){let t=null,r=0,o=I.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e!="string"?(I.errors=[{instancePath:i,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1):e!==""?(I.errors=[{instancePath:i,schemaPath:"#/const",keyword:"const",params:{allowedValue:""},message:"must be equal to constant"}],!1):(I.errors=t,r===0)}I.evaluated={dynamicProps:!1,dynamicItems:!1};function x(e,{instancePath:i="",parentData:d,parentDataProperty:p,rootData:u=e,dynamicAnchors:m={}}={}){let t=null,r=0,o=x.evaluated;o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0);let n=r;f(e,{instancePath:i,parentData:d,parentDataProperty:p,rootData:u,dynamicAnchors:m})||(t=t===null?f.errors:t.concat(f.errors),r=t.length);var l=n===r;if(l){let q=r,D=r,w=!0,L=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let _;if(e.can_configure===void 0&&(_="can_configure")){let k={};t===null?t=[k]:t.push(k),r++}else if(e.can_configure!==void 0&&e.can_configure!==!1){let k={};t===null?t=[k]:t.push(k),r++}}var s=L===r;if(r=D,t!==null&&(D?t.length=D:t=null),s){let _=r;e&&typeof e=="object"&&!Array.isArray(e)&&e.admin_url!==void 0&&(I(e.admin_url,{instancePath:i+"/admin_url",parentData:e,parentDataProperty:"admin_url",rootData:u,dynamicAnchors:m})||(t=t===null?I.errors:t.concat(I.errors),r=t.length));var s=_===r;if(w=s,w){var a={};a.admin_url=!0,a.can_configure=!0}}if(!w){let _={instancePath:i,schemaPath:"#/allOf/1/if",keyword:"if",params:{failingKeyword:"then"},message:'must match "then" schema'};return t===null?t=[_]:t.push(_),r++,x.errors=t,!1}if(r===q)if(e&&typeof e=="object"&&!Array.isArray(e)){if(a!==!0&&(a=a||{},a.admin_url=!0),e.admin_url!==void 0){let _=e.admin_url;if(r===r)if(typeof _=="string"){if(F(_)>511)return x.errors=[{instancePath:i+"/admin_url",schemaPath:"#/allOf/1/properties/admin_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return x.errors=[{instancePath:i+"/admin_url",schemaPath:"#/allOf/1/properties/admin_url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1}}else return x.errors=[{instancePath:i,schemaPath:"#/allOf/1/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;var l=q===r;l&&a!==!0&&(a=a||{},a.camera_uuid=!0,a.name=!0,a.location_uuid=!0,a.location_name=!0,a.location_path=!0,a.enabled=!0,a.width=!0,a.height=!0,a.fps=!0,a.codec=!0,a.protocol=!0,a.record=!0,a.record_on_schedule=!0,a.detection_based_recording=!0,a.isOnvif=!0,a.tags=!0,a.status=!0,a.availability=!0,a.first_video_at=!0,a.last_frame_ts=!0,a.current_fps=!0,a.recording_active=!0,a.last_recording_at=!0,a.can_configure=!0)}return x.errors=t,o.props=a,r===0}x.evaluated={dynamicProps:!0,dynamicItems:!1};function N(e,{instancePath:i="",parentData:d,parentDataProperty:p,rootData:u=e,dynamicAnchors:m={}}={}){let t=null,r=0,o=N.evaluated;o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0);let n=r;g(e,{instancePath:i,parentData:d,parentDataProperty:p,rootData:u,dynamicAnchors:m})||(t=t===null?g.errors:t.concat(g.errors),r=t.length);var l=n===r;if(l){let a=r;if(r===a)if(e&&typeof e=="object"&&!Array.isArray(e)){let D;if(e.streams===void 0&&(D="streams"))return N.errors=[{instancePath:i,schemaPath:"#/allOf/1/required",keyword:"required",params:{missingProperty:D},message:"must have required property '"+D+"'"}],!1;if(e.streams!==void 0){let w=e.streams;if(r===r)if(Array.isArray(w)){if(w.length>100)return N.errors=[{instancePath:i+"/streams",schemaPath:"#/allOf/1/properties/streams/maxItems",keyword:"maxItems",params:{limit:100},message:"must NOT have more than 100 items"}],!1;{var s=!0;let E=w.length;for(let _=0;_()=>{try{return i||e((i={exports:{}}).exports,i),i.exports}catch(_){throw i=0,_}};var X=M(E=>{"use strict";Object.defineProperty(E,"__esModule",{value:!0});function V(e){let i=e.length,_=0,d=0,m;for(;d=55296&&m<=56319&&d=",limit:0},message:"must be >= 0"}],!1;var a=n===r}else var a=!0;if(a){if(e.page!==void 0){let t=e.page,n=r;if(!(typeof t=="number"&&!(t%1)&&!isNaN(t)&&isFinite(t)))return g.errors=[{instancePath:i+"/page",schemaPath:"#/properties/page/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(r===n&&typeof t=="number"&&isFinite(t)){if(t>1e6||isNaN(t))return g.errors=[{instancePath:i+"/page",schemaPath:"#/properties/page/maximum",keyword:"maximum",params:{comparison:"<=",limit:1e6},message:"must be <= 1000000"}],!1;if(t<1||isNaN(t))return g.errors=[{instancePath:i+"/page",schemaPath:"#/properties/page/minimum",keyword:"minimum",params:{comparison:">=",limit:1},message:"must be >= 1"}],!1}var a=n===r}else var a=!0;if(a){if(e.page_size!==void 0){let t=e.page_size,n=r;if(!(typeof t=="number"&&!(t%1)&&!isNaN(t)&&isFinite(t)))return g.errors=[{instancePath:i+"/page_size",schemaPath:"#/properties/page_size/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(r===n&&typeof t=="number"&&isFinite(t)){if(t>100||isNaN(t))return g.errors=[{instancePath:i+"/page_size",schemaPath:"#/properties/page_size/maximum",keyword:"maximum",params:{comparison:"<=",limit:100},message:"must be <= 100"}],!1;if(t<1||isNaN(t))return g.errors=[{instancePath:i+"/page_size",schemaPath:"#/properties/page_size/minimum",keyword:"minimum",params:{comparison:">=",limit:1},message:"must be >= 1"}],!1}var a=n===r}else var a=!0;if(a)if(e.total_pages!==void 0){let t=e.total_pages,n=r;if(!(typeof t=="number"&&!(t%1)&&!isNaN(t)&&isFinite(t)))return g.errors=[{instancePath:i+"/total_pages",schemaPath:"#/properties/total_pages/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(r===n&&typeof t=="number"&&isFinite(t)&&(t<0||isNaN(t)))return g.errors=[{instancePath:i+"/total_pages",schemaPath:"#/properties/total_pages/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1;var a=n===r}else var a=!0}}}else return g.errors=[{instancePath:i,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return g.errors=s,r===0}g.evaluated={props:{total:!0,page:!0,page_size:!0,total_pages:!0},dynamicProps:!1,dynamicItems:!1};function z(e,{instancePath:i="",parentData:_,parentDataProperty:d,rootData:m=e,dynamicAnchors:f={}}={}){let s=null,r=0,o=z.evaluated;o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0);let a=r,l=r,t=r,n=!1,T=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let h;if(e.url===void 0&&(h="url")){let y={};s===null?s=[y]:s.push(y),r++}}var w=T===r;n=n||w;let D=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let h;if(e.onvif_username===void 0&&(h="onvif_username")){let y={};s===null?s=[y]:s.push(y),r++}}var w=D===r;n=n||w;let A=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let h;if(e.onvif_password===void 0&&(h="onvif_password")){let y={};s===null?s=[y]:s.push(y),r++}}var w=A===r;n=n||w;let Y=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let h;if(e.sub_stream_url===void 0&&(h="sub_stream_url")){let y={};s===null?s=[y]:s.push(y),r++}}var w=Y===r;n=n||w;let v=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let h;if(e.detection_url===void 0&&(h="detection_url")){let y={};s===null?s=[y]:s.push(y),r++}}var w=v===r;n=n||w;let p=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let h;if(e.publish_url===void 0&&(h="publish_url")){let y={};s===null?s=[y]:s.push(y),r++}}var w=p===r;n=n||w;let L=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let h;if(e.go2rtc_source_override===void 0&&(h="go2rtc_source_override")){let y={};s===null?s=[y]:s.push(y),r++}}var w=L===r;n=n||w;let C=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let h;if(e.detection_api_url===void 0&&(h="detection_api_url")){let y={};s===null?s=[y]:s.push(y),r++}}var w=C===r;if(n=n||w,n)r=t,s!==null&&(t?s.length=t:s=null);else{let h={};s===null?s=[h]:s.push(h),r++}var U=l===r;return U?(z.errors=[{instancePath:i,schemaPath:"#/not",keyword:"not",params:{},message:"must NOT be valid"}],!1):(r=a,s!==null&&(a?s.length=a:s=null),z.errors=s,r===0)}z.evaluated={dynamicProps:!1,dynamicItems:!1};var O=X().default,Z=new RegExp("^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$","u");function N(e,{instancePath:i="",parentData:_,parentDataProperty:d,rootData:m=e,dynamicAnchors:f={}}={}){let s=null,r=0,o=N.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(typeof e=="string"){if(O(e)>36)return N.errors=[{instancePath:i,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:36},message:"must NOT have more than 36 characters"}],!1;if(!Z.test(e))return N.errors=[{instancePath:i,schemaPath:"#/pattern",keyword:"pattern",params:{pattern:"^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$"},message:'must match pattern "^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$"'}],!1}else return N.errors=[{instancePath:i,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return N.errors=s,r===0}N.evaluated={dynamicProps:!1,dynamicItems:!1};function x(e,{instancePath:i="",parentData:_,parentDataProperty:d,rootData:m=e,dynamicAnchors:f={}}={}){let s=null,r=0,o=x.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(typeof e=="string"){if(O(e)>255)return x.errors=[{instancePath:i,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1;if(O(e)<1)return x.errors=[{instancePath:i,schemaPath:"#/minLength",keyword:"minLength",params:{limit:1},message:"must NOT have fewer than 1 characters"}],!1;if(new TextEncoder().encode(e).byteLength>255)return x.errors=[{instancePath:i,schemaPath:"#/x-lightnvr-max-bytes",keyword:"x-lightnvr-max-bytes",params:{},message:"must fit the UTF-8 byte limit"}],!1}else return x.errors=[{instancePath:i,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return x.errors=s,r===0}x.evaluated={dynamicProps:!1,dynamicItems:!1};function P(e,{instancePath:i="",parentData:_,parentDataProperty:d,rootData:m=e,dynamicAnchors:f={}}={}){let s=null,r=0,o=P.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),!(typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)))return P.errors=[{instancePath:i,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(r===0&&typeof e=="number"&&isFinite(e)){if(e>2147483647||isNaN(e))return P.errors=[{instancePath:i,schemaPath:"#/maximum",keyword:"maximum",params:{comparison:"<=",limit:2147483647},message:"must be <= 2147483647"}],!1;if(e<-2147483648||isNaN(e))return P.errors=[{instancePath:i,schemaPath:"#/minimum",keyword:"minimum",params:{comparison:">=",limit:-2147483648},message:"must be >= -2147483648"}],!1}return P.errors=s,r===0}P.evaluated={dynamicProps:!1,dynamicItems:!1};var R={type:"integer",enum:[0,1],$id:"urn:lightnvr:contract:StreamProtocol"};function q(e,{instancePath:i="",parentData:_,parentDataProperty:d,rootData:m=e,dynamicAnchors:f={}}={}){let s=null,r=0,o=q.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)?e===0||e===1?(q.errors=s,r===0):(q.errors=[{instancePath:i,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:R.enum},message:"must be equal to one of the allowed values"}],!1):(q.errors=[{instancePath:i,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1)}q.evaluated={dynamicProps:!1,dynamicItems:!1};var B={type:"string",enum:["Running","Degraded","Error","Stopped","Unknown"],$id:"urn:lightnvr:contract:SummaryStatus"};function S(e,{instancePath:i="",parentData:_,parentDataProperty:d,rootData:m=e,dynamicAnchors:f={}}={}){let s=null,r=0,o=S.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e!="string"?(S.errors=[{instancePath:i,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1):e==="Running"||e==="Degraded"||e==="Error"||e==="Stopped"||e==="Unknown"?(S.errors=s,r===0):(S.errors=[{instancePath:i,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:B.enum},message:"must be equal to one of the allowed values"}],!1)}S.evaluated={dynamicProps:!1,dynamicItems:!1};var J={type:"string",enum:["live","offline","never_connected","disabled"],$id:"urn:lightnvr:contract:Availability"};function $(e,{instancePath:i="",parentData:_,parentDataProperty:d,rootData:m=e,dynamicAnchors:f={}}={}){let s=null,r=0,o=$.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e!="string"?($.errors=[{instancePath:i,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1):e==="live"||e==="offline"||e==="never_connected"||e==="disabled"?($.errors=s,r===0):($.errors=[{instancePath:i,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:J.enum},message:"must be equal to one of the allowed values"}],!1)}$.evaluated={dynamicProps:!1,dynamicItems:!1};function k(e,{instancePath:i="",parentData:_,parentDataProperty:d,rootData:m=e,dynamicAnchors:f={}}={}){let s=null,r=0,o=k.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)?r===0&&typeof e=="number"&&isFinite(e)&&(e<0||isNaN(e))?(k.errors=[{instancePath:i,schemaPath:"#/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1):(k.errors=s,r===0):(k.errors=[{instancePath:i,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1)}k.evaluated={dynamicProps:!1,dynamicItems:!1};function c(e,{instancePath:i="",parentData:_,parentDataProperty:d,rootData:m=e,dynamicAnchors:f={}}={}){let s=null,r=0,o=c.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),z(e,{instancePath:i,parentData:_,parentDataProperty:d,rootData:m,dynamicAnchors:f})||(s=s===null?z.errors:s.concat(z.errors),r=s.length),r===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let l;if(e.camera_uuid===void 0&&(l="camera_uuid")||e.name===void 0&&(l="name")||e.location_uuid===void 0&&(l="location_uuid")||e.location_name===void 0&&(l="location_name")||e.location_path===void 0&&(l="location_path")||e.enabled===void 0&&(l="enabled")||e.width===void 0&&(l="width")||e.height===void 0&&(l="height")||e.fps===void 0&&(l="fps")||e.codec===void 0&&(l="codec")||e.protocol===void 0&&(l="protocol")||e.record===void 0&&(l="record")||e.record_on_schedule===void 0&&(l="record_on_schedule")||e.detection_based_recording===void 0&&(l="detection_based_recording")||e.isOnvif===void 0&&(l="isOnvif")||e.tags===void 0&&(l="tags")||e.status===void 0&&(l="status")||e.availability===void 0&&(l="availability")||e.first_video_at===void 0&&(l="first_video_at")||e.last_frame_ts===void 0&&(l="last_frame_ts")||e.current_fps===void 0&&(l="current_fps")||e.recording_active===void 0&&(l="recording_active")||e.last_recording_at===void 0&&(l="last_recording_at")||e.can_configure===void 0&&(l="can_configure"))return c.errors=[{instancePath:i,schemaPath:"#/required",keyword:"required",params:{missingProperty:l},message:"must have required property '"+l+"'"}],!1;if(e.camera_uuid!==void 0){let t=r;N(e.camera_uuid,{instancePath:i+"/camera_uuid",parentData:e,parentDataProperty:"camera_uuid",rootData:m,dynamicAnchors:f})||(s=s===null?N.errors:s.concat(N.errors),r=s.length);var a=t===r}else var a=!0;if(a){if(e.name!==void 0){let t=r;x(e.name,{instancePath:i+"/name",parentData:e,parentDataProperty:"name",rootData:m,dynamicAnchors:f})||(s=s===null?x.errors:s.concat(x.errors),r=s.length);var a=t===r}else var a=!0;if(a){if(e.location_uuid!==void 0){let t=r;N(e.location_uuid,{instancePath:i+"/location_uuid",parentData:e,parentDataProperty:"location_uuid",rootData:m,dynamicAnchors:f})||(s=s===null?N.errors:s.concat(N.errors),r=s.length);var a=t===r}else var a=!0;if(a){if(e.location_name!==void 0){let t=e.location_name,n=r;if(r===n)if(typeof t=="string"){if(O(t)>127)return c.errors=[{instancePath:i+"/location_name",schemaPath:"#/properties/location_name/maxLength",keyword:"maxLength",params:{limit:127},message:"must NOT have more than 127 characters"}],!1}else return c.errors=[{instancePath:i+"/location_name",schemaPath:"#/properties/location_name/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var a=n===r}else var a=!0;if(a){if(e.location_path!==void 0){let t=e.location_path,n=r;if(r===n)if(typeof t=="string"){if(O(t)>1023)return c.errors=[{instancePath:i+"/location_path",schemaPath:"#/properties/location_path/maxLength",keyword:"maxLength",params:{limit:1023},message:"must NOT have more than 1023 characters"}],!1}else return c.errors=[{instancePath:i+"/location_path",schemaPath:"#/properties/location_path/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var a=n===r}else var a=!0;if(a){if(e.enabled!==void 0){let t=r;if(typeof e.enabled!="boolean")return c.errors=[{instancePath:i+"/enabled",schemaPath:"#/properties/enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var a=t===r}else var a=!0;if(a){if(e.width!==void 0){let t=r;P(e.width,{instancePath:i+"/width",parentData:e,parentDataProperty:"width",rootData:m,dynamicAnchors:f})||(s=s===null?P.errors:s.concat(P.errors),r=s.length);var a=t===r}else var a=!0;if(a){if(e.height!==void 0){let t=r;P(e.height,{instancePath:i+"/height",parentData:e,parentDataProperty:"height",rootData:m,dynamicAnchors:f})||(s=s===null?P.errors:s.concat(P.errors),r=s.length);var a=t===r}else var a=!0;if(a){if(e.fps!==void 0){let t=r;P(e.fps,{instancePath:i+"/fps",parentData:e,parentDataProperty:"fps",rootData:m,dynamicAnchors:f})||(s=s===null?P.errors:s.concat(P.errors),r=s.length);var a=t===r}else var a=!0;if(a){if(e.codec!==void 0){let t=e.codec,n=r;if(r===n)if(typeof t=="string"){if(O(t)>15)return c.errors=[{instancePath:i+"/codec",schemaPath:"#/properties/codec/maxLength",keyword:"maxLength",params:{limit:15},message:"must NOT have more than 15 characters"}],!1}else return c.errors=[{instancePath:i+"/codec",schemaPath:"#/properties/codec/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var a=n===r}else var a=!0;if(a){if(e.protocol!==void 0){let t=r;q(e.protocol,{instancePath:i+"/protocol",parentData:e,parentDataProperty:"protocol",rootData:m,dynamicAnchors:f})||(s=s===null?q.errors:s.concat(q.errors),r=s.length);var a=t===r}else var a=!0;if(a){if(e.record!==void 0){let t=r;if(typeof e.record!="boolean")return c.errors=[{instancePath:i+"/record",schemaPath:"#/properties/record/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var a=t===r}else var a=!0;if(a){if(e.record_on_schedule!==void 0){let t=r;if(typeof e.record_on_schedule!="boolean")return c.errors=[{instancePath:i+"/record_on_schedule",schemaPath:"#/properties/record_on_schedule/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var a=t===r}else var a=!0;if(a){if(e.detection_based_recording!==void 0){let t=r;if(typeof e.detection_based_recording!="boolean")return c.errors=[{instancePath:i+"/detection_based_recording",schemaPath:"#/properties/detection_based_recording/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var a=t===r}else var a=!0;if(a){if(e.isOnvif!==void 0){let t=r;if(typeof e.isOnvif!="boolean")return c.errors=[{instancePath:i+"/isOnvif",schemaPath:"#/properties/isOnvif/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var a=t===r}else var a=!0;if(a){if(e.tags!==void 0){let t=e.tags,n=r;if(r===n)if(typeof t=="string"){if(O(t)>255)return c.errors=[{instancePath:i+"/tags",schemaPath:"#/properties/tags/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1}else return c.errors=[{instancePath:i+"/tags",schemaPath:"#/properties/tags/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var a=n===r}else var a=!0;if(a){if(e.status!==void 0){let t=r;S(e.status,{instancePath:i+"/status",parentData:e,parentDataProperty:"status",rootData:m,dynamicAnchors:f})||(s=s===null?S.errors:s.concat(S.errors),r=s.length);var a=t===r}else var a=!0;if(a){if(e.availability!==void 0){let t=r;$(e.availability,{instancePath:i+"/availability",parentData:e,parentDataProperty:"availability",rootData:m,dynamicAnchors:f})||(s=s===null?$.errors:s.concat($.errors),r=s.length);var a=t===r}else var a=!0;if(a){if(e.first_video_at!==void 0){let t=r;k(e.first_video_at,{instancePath:i+"/first_video_at",parentData:e,parentDataProperty:"first_video_at",rootData:m,dynamicAnchors:f})||(s=s===null?k.errors:s.concat(k.errors),r=s.length);var a=t===r}else var a=!0;if(a){if(e.last_frame_ts!==void 0){let t=r;k(e.last_frame_ts,{instancePath:i+"/last_frame_ts",parentData:e,parentDataProperty:"last_frame_ts",rootData:m,dynamicAnchors:f})||(s=s===null?k.errors:s.concat(k.errors),r=s.length);var a=t===r}else var a=!0;if(a){if(e.current_fps!==void 0){let t=e.current_fps,n=r;if(r===n)if(typeof t=="number"&&isFinite(t)){if(t<0||isNaN(t))return c.errors=[{instancePath:i+"/current_fps",schemaPath:"#/properties/current_fps/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1}else return c.errors=[{instancePath:i+"/current_fps",schemaPath:"#/properties/current_fps/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var a=n===r}else var a=!0;if(a){if(e.recording_active!==void 0){let t=r;if(typeof e.recording_active!="boolean")return c.errors=[{instancePath:i+"/recording_active",schemaPath:"#/properties/recording_active/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var a=t===r}else var a=!0;if(a){if(e.last_recording_at!==void 0){let t=r;k(e.last_recording_at,{instancePath:i+"/last_recording_at",parentData:e,parentDataProperty:"last_recording_at",rootData:m,dynamicAnchors:f})||(s=s===null?k.errors:s.concat(k.errors),r=s.length);var a=t===r}else var a=!0;if(a)if(e.can_configure!==void 0){let t=r;if(typeof e.can_configure!="boolean")return c.errors=[{instancePath:i+"/can_configure",schemaPath:"#/properties/can_configure/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var a=t===r}else var a=!0}}}}}}}}}}}}}}}}}}}}}}}else return c.errors=[{instancePath:i,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return c.errors=s,r===0}c.evaluated={props:{camera_uuid:!0,name:!0,location_uuid:!0,location_name:!0,location_path:!0,enabled:!0,width:!0,height:!0,fps:!0,codec:!0,protocol:!0,record:!0,record_on_schedule:!0,detection_based_recording:!0,isOnvif:!0,tags:!0,status:!0,availability:!0,first_video_at:!0,last_frame_ts:!0,current_fps:!0,recording_active:!0,last_recording_at:!0,can_configure:!0},dynamicProps:!1,dynamicItems:!1};var K={type:"string",enum:["auto","webrtc_only","mse_only","hls_only","webrtc_then_mse","mse_then_hls"],$id:"urn:lightnvr:contract:PlaybackTransport"};function I(e,{instancePath:i="",parentData:_,parentDataProperty:d,rootData:m=e,dynamicAnchors:f={}}={}){let s=null,r=0,o=I.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e!="string"?(I.errors=[{instancePath:i,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1):e==="auto"||e==="webrtc_only"||e==="mse_only"||e==="hls_only"||e==="webrtc_then_mse"||e==="mse_then_hls"?(I.errors=s,r===0):(I.errors=[{instancePath:i,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:K.enum},message:"must be equal to one of the allowed values"}],!1)}I.evaluated={dynamicProps:!1,dynamicItems:!1};function u(e,{instancePath:i="",parentData:_,parentDataProperty:d,rootData:m=e,dynamicAnchors:f={}}={}){let s=null,r=0,o=u.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let l;if(e.version===void 0&&(l="version")||e.projection===void 0&&(l="projection")||e.mount===void 0&&(l="mount")||e.centerX===void 0&&(l="centerX")||e.centerY===void 0&&(l="centerY")||e.radius===void 0&&(l="radius")||e.fov===void 0&&(l="fov")||e.rotation===void 0&&(l="rotation")||e.defaultYaw===void 0&&(l="defaultYaw")||e.defaultTilt===void 0&&(l="defaultTilt")||e.defaultViewFov===void 0&&(l="defaultViewFov"))return u.errors=[{instancePath:i,schemaPath:"#/required",keyword:"required",params:{missingProperty:l},message:"must have required property '"+l+"'"}],!1;if(e.version!==void 0){let t=r;if(e.version!==1)return u.errors=[{instancePath:i+"/version",schemaPath:"#/properties/version/const",keyword:"const",params:{allowedValue:1},message:"must be equal to constant"}],!1;var a=t===r}else var a=!0;if(a){if(e.projection!==void 0){let t=r;if(e.projection!=="equidistant")return u.errors=[{instancePath:i+"/projection",schemaPath:"#/properties/projection/const",keyword:"const",params:{allowedValue:"equidistant"},message:"must be equal to constant"}],!1;var a=t===r}else var a=!0;if(a){if(e.mount!==void 0){let t=r;if(e.mount!=="ceiling")return u.errors=[{instancePath:i+"/mount",schemaPath:"#/properties/mount/const",keyword:"const",params:{allowedValue:"ceiling"},message:"must be equal to constant"}],!1;var a=t===r}else var a=!0;if(a){if(e.centerX!==void 0){let t=e.centerX,n=r;if(r===n)if(typeof t=="number"&&isFinite(t)){if(t>1||isNaN(t))return u.errors=[{instancePath:i+"/centerX",schemaPath:"#/properties/centerX/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(t<0||isNaN(t))return u.errors=[{instancePath:i+"/centerX",schemaPath:"#/properties/centerX/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1}else return u.errors=[{instancePath:i+"/centerX",schemaPath:"#/properties/centerX/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var a=n===r}else var a=!0;if(a){if(e.centerY!==void 0){let t=e.centerY,n=r;if(r===n)if(typeof t=="number"&&isFinite(t)){if(t>1||isNaN(t))return u.errors=[{instancePath:i+"/centerY",schemaPath:"#/properties/centerY/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(t<0||isNaN(t))return u.errors=[{instancePath:i+"/centerY",schemaPath:"#/properties/centerY/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1}else return u.errors=[{instancePath:i+"/centerY",schemaPath:"#/properties/centerY/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var a=n===r}else var a=!0;if(a){if(e.radius!==void 0){let t=e.radius,n=r;if(r===n)if(typeof t=="number"&&isFinite(t)){if(t>1||isNaN(t))return u.errors=[{instancePath:i+"/radius",schemaPath:"#/properties/radius/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(t<.05||isNaN(t))return u.errors=[{instancePath:i+"/radius",schemaPath:"#/properties/radius/minimum",keyword:"minimum",params:{comparison:">=",limit:.05},message:"must be >= 0.05"}],!1}else return u.errors=[{instancePath:i+"/radius",schemaPath:"#/properties/radius/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var a=n===r}else var a=!0;if(a){if(e.fov!==void 0){let t=e.fov,n=r;if(r===n)if(typeof t=="number"&&isFinite(t)){if(t>360||isNaN(t))return u.errors=[{instancePath:i+"/fov",schemaPath:"#/properties/fov/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(t<160||isNaN(t))return u.errors=[{instancePath:i+"/fov",schemaPath:"#/properties/fov/minimum",keyword:"minimum",params:{comparison:">=",limit:160},message:"must be >= 160"}],!1}else return u.errors=[{instancePath:i+"/fov",schemaPath:"#/properties/fov/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var a=n===r}else var a=!0;if(a){if(e.rotation!==void 0){let t=e.rotation,n=r;if(r===n)if(typeof t=="number"&&isFinite(t)){if(t>360||isNaN(t))return u.errors=[{instancePath:i+"/rotation",schemaPath:"#/properties/rotation/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(t<-360||isNaN(t))return u.errors=[{instancePath:i+"/rotation",schemaPath:"#/properties/rotation/minimum",keyword:"minimum",params:{comparison:">=",limit:-360},message:"must be >= -360"}],!1}else return u.errors=[{instancePath:i+"/rotation",schemaPath:"#/properties/rotation/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var a=n===r}else var a=!0;if(a){if(e.defaultYaw!==void 0){let t=e.defaultYaw,n=r;if(r===n)if(typeof t=="number"&&isFinite(t)){if(t>360||isNaN(t))return u.errors=[{instancePath:i+"/defaultYaw",schemaPath:"#/properties/defaultYaw/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(t<-360||isNaN(t))return u.errors=[{instancePath:i+"/defaultYaw",schemaPath:"#/properties/defaultYaw/minimum",keyword:"minimum",params:{comparison:">=",limit:-360},message:"must be >= -360"}],!1}else return u.errors=[{instancePath:i+"/defaultYaw",schemaPath:"#/properties/defaultYaw/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var a=n===r}else var a=!0;if(a){if(e.defaultTilt!==void 0){let t=e.defaultTilt,n=r;if(r===n)if(typeof t=="number"&&isFinite(t)){if(t>30||isNaN(t))return u.errors=[{instancePath:i+"/defaultTilt",schemaPath:"#/properties/defaultTilt/maximum",keyword:"maximum",params:{comparison:"<=",limit:30},message:"must be <= 30"}],!1;if(t<-90||isNaN(t))return u.errors=[{instancePath:i+"/defaultTilt",schemaPath:"#/properties/defaultTilt/minimum",keyword:"minimum",params:{comparison:">=",limit:-90},message:"must be >= -90"}],!1}else return u.errors=[{instancePath:i+"/defaultTilt",schemaPath:"#/properties/defaultTilt/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var a=n===r}else var a=!0;if(a)if(e.defaultViewFov!==void 0){let t=e.defaultViewFov,n=r;if(r===n)if(typeof t=="number"&&isFinite(t)){if(t>120||isNaN(t))return u.errors=[{instancePath:i+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/maximum",keyword:"maximum",params:{comparison:"<=",limit:120},message:"must be <= 120"}],!1;if(t<20||isNaN(t))return u.errors=[{instancePath:i+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/minimum",keyword:"minimum",params:{comparison:">=",limit:20},message:"must be >= 20"}],!1}else return u.errors=[{instancePath:i+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var a=n===r}else var a=!0}}}}}}}}}}else return u.errors=[{instancePath:i,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return u.errors=s,r===0}u.evaluated={props:{version:!0,projection:!0,mount:!0,centerX:!0,centerY:!0,radius:!0,fov:!0,rotation:!0,defaultYaw:!0,defaultTilt:!0,defaultViewFov:!0},dynamicProps:!1,dynamicItems:!1};function F(e,{instancePath:i="",parentData:_,parentDataProperty:d,rootData:m=e,dynamicAnchors:f={}}={}){let s=null,r=0,o=F.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(typeof e=="string"){if(O(e)>1023)return F.errors=[{instancePath:i,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:1023},message:"must NOT have more than 1023 characters"}],!1;if(new TextEncoder().encode(e).byteLength>1023)return F.errors=[{instancePath:i,schemaPath:"#/x-lightnvr-max-bytes",keyword:"x-lightnvr-max-bytes",params:{},message:"must fit the UTF-8 byte limit"}],!1;if(e!==""){let l,t=!0;try{l=JSON.parse(e)}catch{t=!1}if(t){let n=r;u(l,{instancePath:i,parentData:e,parentDataProperty:d,rootData:m,dynamicAnchors:f})||(s=s===null?u.errors:s.concat(u.errors),r=s.length);var a=n===r;t=a}if(!t)return F.errors=[{instancePath:i,schemaPath:"#/contentSchema",keyword:"contentSchema",params:{},message:"must contain valid JSON matching contentSchema (or be empty)"}],!1}}else return F.errors=[{instancePath:i,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return F.errors=s,r===0}F.evaluated={dynamicProps:!1,dynamicItems:!1};function b(e,{instancePath:i="",parentData:_,parentDataProperty:d,rootData:m=e,dynamicAnchors:f={}}={}){let s=null,r=0,o=b.evaluated;o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0);let a=r;c(e,{instancePath:i,parentData:_,parentDataProperty:d,rootData:m,dynamicAnchors:f})||(s=s===null?c.errors:s.concat(c.errors),r=s.length);var l=a===r;if(l){let T=r,D=r,A=r;if(e&&typeof e=="object"&&!Array.isArray(e)){let v;if(e.admin_url===void 0&&(v="admin_url")){let p={};s===null?s=[p]:s.push(p),r++}}var t=A===r;if(t)return b.errors=[{instancePath:i,schemaPath:"#/allOf/1/not",keyword:"not",params:{},message:"must NOT be valid"}],!1;if(r=D,s!==null&&(D?s.length=D:s=null),r===T)if(e&&typeof e=="object"&&!Array.isArray(e)){let v;if(e.streaming_enabled===void 0&&(v="streaming_enabled")||e.playback_transport===void 0&&(v="playback_transport")||e.eptz_config===void 0&&(v="eptz_config")||e.detection_model===void 0&&(v="detection_model")||e.privacy_mode===void 0&&(v="privacy_mode")||e.can_control_privacy===void 0&&(v="can_control_privacy")||e.has_sub_stream===void 0&&(v="has_sub_stream")||e.ptz_enabled===void 0&&(v="ptz_enabled")||e.backchannel_enabled===void 0&&(v="backchannel_enabled")||e.go2rtc_hls_available===void 0&&(v="go2rtc_hls_available"))return b.errors=[{instancePath:i,schemaPath:"#/allOf/1/required",keyword:"required",params:{missingProperty:v},message:"must have required property '"+v+"'"}],!1;if(e.streaming_enabled!==void 0){let p=r;if(typeof e.streaming_enabled!="boolean")return b.errors=[{instancePath:i+"/streaming_enabled",schemaPath:"#/allOf/1/properties/streaming_enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=p===r}else var n=!0;if(n){if(e.playback_transport!==void 0){let p=r;I(e.playback_transport,{instancePath:i+"/playback_transport",parentData:e,parentDataProperty:"playback_transport",rootData:m,dynamicAnchors:f})||(s=s===null?I.errors:s.concat(I.errors),r=s.length);var n=p===r}else var n=!0;if(n){if(e.eptz_config!==void 0){let p=r;F(e.eptz_config,{instancePath:i+"/eptz_config",parentData:e,parentDataProperty:"eptz_config",rootData:m,dynamicAnchors:f})||(s=s===null?F.errors:s.concat(F.errors),r=s.length);var n=p===r}else var n=!0;if(n){if(e.detection_model!==void 0){let p=e.detection_model,L=r;if(r===L)if(typeof p=="string"){if(O(p)>511)return b.errors=[{instancePath:i+"/detection_model",schemaPath:"#/allOf/1/properties/detection_model/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return b.errors=[{instancePath:i+"/detection_model",schemaPath:"#/allOf/1/properties/detection_model/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var n=L===r}else var n=!0;if(n){if(e.privacy_mode!==void 0){let p=r;if(typeof e.privacy_mode!="boolean")return b.errors=[{instancePath:i+"/privacy_mode",schemaPath:"#/allOf/1/properties/privacy_mode/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=p===r}else var n=!0;if(n){if(e.can_control_privacy!==void 0){let p=r;if(typeof e.can_control_privacy!="boolean")return b.errors=[{instancePath:i+"/can_control_privacy",schemaPath:"#/allOf/1/properties/can_control_privacy/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=p===r}else var n=!0;if(n){if(e.has_sub_stream!==void 0){let p=r;if(typeof e.has_sub_stream!="boolean")return b.errors=[{instancePath:i+"/has_sub_stream",schemaPath:"#/allOf/1/properties/has_sub_stream/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=p===r}else var n=!0;if(n){if(e.ptz_enabled!==void 0){let p=r;if(typeof e.ptz_enabled!="boolean")return b.errors=[{instancePath:i+"/ptz_enabled",schemaPath:"#/allOf/1/properties/ptz_enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=p===r}else var n=!0;if(n){if(e.backchannel_enabled!==void 0){let p=r;if(typeof e.backchannel_enabled!="boolean")return b.errors=[{instancePath:i+"/backchannel_enabled",schemaPath:"#/allOf/1/properties/backchannel_enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=p===r}else var n=!0;if(n)if(e.go2rtc_hls_available!==void 0){let p=r;if(typeof e.go2rtc_hls_available!="boolean")return b.errors=[{instancePath:i+"/go2rtc_hls_available",schemaPath:"#/allOf/1/properties/go2rtc_hls_available/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var n=p===r}else var n=!0}}}}}}}}}else return b.errors=[{instancePath:i,schemaPath:"#/allOf/1/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;var l=T===r}return b.errors=s,r===0}b.evaluated={props:{streaming_enabled:!0,playback_transport:!0,eptz_config:!0,detection_model:!0,privacy_mode:!0,can_control_privacy:!0,has_sub_stream:!0,ptz_enabled:!0,backchannel_enabled:!0,go2rtc_hls_available:!0,camera_uuid:!0,name:!0,location_uuid:!0,location_name:!0,location_path:!0,enabled:!0,width:!0,height:!0,fps:!0,codec:!0,protocol:!0,record:!0,record_on_schedule:!0,detection_based_recording:!0,isOnvif:!0,tags:!0,status:!0,availability:!0,first_video_at:!0,last_frame_ts:!0,current_fps:!0,recording_active:!0,last_recording_at:!0,can_configure:!0},dynamicProps:!1,dynamicItems:!1};function j(e,{instancePath:i="",parentData:_,parentDataProperty:d,rootData:m=e,dynamicAnchors:f={}}={}){let s=null,r=0,o=j.evaluated;o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0);let a=r;g(e,{instancePath:i,parentData:_,parentDataProperty:d,rootData:m,dynamicAnchors:f})||(s=s===null?g.errors:s.concat(g.errors),r=s.length);var l=a===r;if(l){let n=r;if(r===n)if(e&&typeof e=="object"&&!Array.isArray(e)){let D;if(e.streams===void 0&&(D="streams"))return j.errors=[{instancePath:i,schemaPath:"#/allOf/1/required",keyword:"required",params:{missingProperty:D},message:"must have required property '"+D+"'"}],!1;if(e.streams!==void 0){let A=e.streams;if(r===r)if(Array.isArray(A)){if(A.length>100)return j.errors=[{instancePath:i+"/streams",schemaPath:"#/allOf/1/properties/streams/maxItems",keyword:"maxItems",params:{limit:100},message:"must NOT have more than 100 items"}],!1;{var t=!0;let v=A.length;for(let p=0;p()=>{try{return a||e((a={exports:{}}).exports,a),a.exports}catch(f){throw a=0,f}};var k=N(P=>{"use strict";Object.defineProperty(P,"__esModule",{value:!0});function w(e){let a=e.length,f=0,l=0,p;for(;l=55296&&p<=56319&&l=",limit:0},message:"must be >= 0"}],!1;var o=m===r}else var o=!0;if(o){if(e.page!==void 0){let t=e.page,m=r;if(!(typeof t=="number"&&!(t%1)&&!isNaN(t)&&isFinite(t)))return n.errors=[{instancePath:a+"/page",schemaPath:"#/properties/page/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(r===m&&typeof t=="number"&&isFinite(t)){if(t>1e6||isNaN(t))return n.errors=[{instancePath:a+"/page",schemaPath:"#/properties/page/maximum",keyword:"maximum",params:{comparison:"<=",limit:1e6},message:"must be <= 1000000"}],!1;if(t<1||isNaN(t))return n.errors=[{instancePath:a+"/page",schemaPath:"#/properties/page/minimum",keyword:"minimum",params:{comparison:">=",limit:1},message:"must be >= 1"}],!1}var o=m===r}else var o=!0;if(o){if(e.page_size!==void 0){let t=e.page_size,m=r;if(!(typeof t=="number"&&!(t%1)&&!isNaN(t)&&isFinite(t)))return n.errors=[{instancePath:a+"/page_size",schemaPath:"#/properties/page_size/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(r===m&&typeof t=="number"&&isFinite(t)){if(t>100||isNaN(t))return n.errors=[{instancePath:a+"/page_size",schemaPath:"#/properties/page_size/maximum",keyword:"maximum",params:{comparison:"<=",limit:100},message:"must be <= 100"}],!1;if(t<1||isNaN(t))return n.errors=[{instancePath:a+"/page_size",schemaPath:"#/properties/page_size/minimum",keyword:"minimum",params:{comparison:">=",limit:1},message:"must be >= 1"}],!1}var o=m===r}else var o=!0;if(o)if(e.total_pages!==void 0){let t=e.total_pages,m=r;if(!(typeof t=="number"&&!(t%1)&&!isNaN(t)&&isFinite(t)))return n.errors=[{instancePath:a+"/total_pages",schemaPath:"#/properties/total_pages/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(r===m&&typeof t=="number"&&isFinite(t)&&(t<0||isNaN(t)))return n.errors=[{instancePath:a+"/total_pages",schemaPath:"#/properties/total_pages/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1;var o=m===r}else var o=!0}}}else return n.errors=[{instancePath:a,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return n.errors=s,r===0}n.evaluated={props:{total:!0,page:!0,page_size:!0,total_pages:!0},dynamicProps:!1,dynamicItems:!1};var A=k().default,D=new RegExp("^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$","u");function d(e,{instancePath:a="",parentData:f,parentDataProperty:l,rootData:p=e,dynamicAnchors:g={}}={}){let s=null,r=0,i=d.evaluated;if(i.dynamicProps&&(i.props=void 0),i.dynamicItems&&(i.items=void 0),r===0)if(typeof e=="string"){if(A(e)>36)return d.errors=[{instancePath:a,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:36},message:"must NOT have more than 36 characters"}],!1;if(!D.test(e))return d.errors=[{instancePath:a,schemaPath:"#/pattern",keyword:"pattern",params:{pattern:"^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$"},message:'must match pattern "^(|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$"'}],!1}else return d.errors=[{instancePath:a,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return d.errors=s,r===0}d.evaluated={dynamicProps:!1,dynamicItems:!1};function c(e,{instancePath:a="",parentData:f,parentDataProperty:l,rootData:p=e,dynamicAnchors:g={}}={}){let s=null,r=0,i=c.evaluated;if(i.dynamicProps&&(i.props=void 0),i.dynamicItems&&(i.items=void 0),r===0)if(typeof e=="string"){if(A(e)>255)return c.errors=[{instancePath:a,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1;if(A(e)<1)return c.errors=[{instancePath:a,schemaPath:"#/minLength",keyword:"minLength",params:{limit:1},message:"must NOT have fewer than 1 characters"}],!1;if(new TextEncoder().encode(e).byteLength>255)return c.errors=[{instancePath:a,schemaPath:"#/x-lightnvr-max-bytes",keyword:"x-lightnvr-max-bytes",params:{},message:"must fit the UTF-8 byte limit"}],!1}else return c.errors=[{instancePath:a,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return c.errors=s,r===0}c.evaluated={dynamicProps:!1,dynamicItems:!1};function y(e,{instancePath:a="",parentData:f,parentDataProperty:l,rootData:p=e,dynamicAnchors:g={}}={}){let s=null,r=0,i=y.evaluated;if(i.dynamicProps&&(i.props=void 0),i.dynamicItems&&(i.items=void 0),r===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let u;if(e.camera_uuid===void 0&&(u="camera_uuid")||e.name===void 0&&(u="name"))return y.errors=[{instancePath:a,schemaPath:"#/required",keyword:"required",params:{missingProperty:u},message:"must have required property '"+u+"'"}],!1;{let t=r;for(let m in e)if(!(m==="camera_uuid"||m==="name")){return y.errors=[{instancePath:a,schemaPath:"#/additionalProperties",keyword:"additionalProperties",params:{additionalProperty:m},message:"must NOT have additional properties"}],!1;break}if(t===r){if(e.camera_uuid!==void 0){let m=r;d(e.camera_uuid,{instancePath:a+"/camera_uuid",parentData:e,parentDataProperty:"camera_uuid",rootData:p,dynamicAnchors:g})||(s=s===null?d.errors:s.concat(d.errors),r=s.length);var o=m===r}else var o=!0;if(o)if(e.name!==void 0){let m=r;c(e.name,{instancePath:a+"/name",parentData:e,parentDataProperty:"name",rootData:p,dynamicAnchors:g})||(s=s===null?c.errors:s.concat(c.errors),r=s.length);var o=m===r}else var o=!0}}}else return y.errors=[{instancePath:a,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return y.errors=s,r===0}y.evaluated={props:!0,dynamicProps:!1,dynamicItems:!1};function h(e,{instancePath:a="",parentData:f,parentDataProperty:l,rootData:p=e,dynamicAnchors:g={}}={}){let s=null,r=0,i=h.evaluated;i.dynamicProps&&(i.props=void 0),i.dynamicItems&&(i.items=void 0);let o=r;n(e,{instancePath:a,parentData:f,parentDataProperty:l,rootData:p,dynamicAnchors:g})||(s=s===null?n.errors:s.concat(n.errors),r=s.length);var u=o===r;if(u){let m=r;if(r===m)if(e&&typeof e=="object"&&!Array.isArray(e)){let b;if(e.streams===void 0&&(b="streams"))return h.errors=[{instancePath:a,schemaPath:"#/allOf/1/required",keyword:"required",params:{missingProperty:b},message:"must have required property '"+b+"'"}],!1;if(e.streams!==void 0){let v=e.streams;if(r===r)if(Array.isArray(v)){if(v.length>100)return h.errors=[{instancePath:a+"/streams",schemaPath:"#/allOf/1/properties/streams/maxItems",keyword:"maxItems",params:{limit:100},message:"must NOT have more than 100 items"}],!1;{var t=!0;let F=v.length;for(let _=0;_()=>{try{return n||e((n={exports:{}}).exports,n),n.exports}catch(_){throw n=0,_}};var T=L(D=>{"use strict";Object.defineProperty(D,"__esModule",{value:!0});function N(e){let n=e.length,_=0,y=0,m;for(;y=55296&&m<=56319&&y1||isNaN(t))return f.errors=[{instancePath:n+"/centerX",schemaPath:"#/properties/centerX/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(t<0||isNaN(t))return f.errors=[{instancePath:n+"/centerX",schemaPath:"#/properties/centerX/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1}else return f.errors=[{instancePath:n+"/centerX",schemaPath:"#/properties/centerX/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var s=a===r}else var s=!0;if(s){if(e.centerY!==void 0){let t=e.centerY,a=r;if(r===a)if(typeof t=="number"&&isFinite(t)){if(t>1||isNaN(t))return f.errors=[{instancePath:n+"/centerY",schemaPath:"#/properties/centerY/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(t<0||isNaN(t))return f.errors=[{instancePath:n+"/centerY",schemaPath:"#/properties/centerY/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1}else return f.errors=[{instancePath:n+"/centerY",schemaPath:"#/properties/centerY/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var s=a===r}else var s=!0;if(s){if(e.radius!==void 0){let t=e.radius,a=r;if(r===a)if(typeof t=="number"&&isFinite(t)){if(t>1||isNaN(t))return f.errors=[{instancePath:n+"/radius",schemaPath:"#/properties/radius/maximum",keyword:"maximum",params:{comparison:"<=",limit:1},message:"must be <= 1"}],!1;if(t<.05||isNaN(t))return f.errors=[{instancePath:n+"/radius",schemaPath:"#/properties/radius/minimum",keyword:"minimum",params:{comparison:">=",limit:.05},message:"must be >= 0.05"}],!1}else return f.errors=[{instancePath:n+"/radius",schemaPath:"#/properties/radius/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var s=a===r}else var s=!0;if(s){if(e.fov!==void 0){let t=e.fov,a=r;if(r===a)if(typeof t=="number"&&isFinite(t)){if(t>360||isNaN(t))return f.errors=[{instancePath:n+"/fov",schemaPath:"#/properties/fov/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(t<160||isNaN(t))return f.errors=[{instancePath:n+"/fov",schemaPath:"#/properties/fov/minimum",keyword:"minimum",params:{comparison:">=",limit:160},message:"must be >= 160"}],!1}else return f.errors=[{instancePath:n+"/fov",schemaPath:"#/properties/fov/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var s=a===r}else var s=!0;if(s){if(e.rotation!==void 0){let t=e.rotation,a=r;if(r===a)if(typeof t=="number"&&isFinite(t)){if(t>360||isNaN(t))return f.errors=[{instancePath:n+"/rotation",schemaPath:"#/properties/rotation/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(t<-360||isNaN(t))return f.errors=[{instancePath:n+"/rotation",schemaPath:"#/properties/rotation/minimum",keyword:"minimum",params:{comparison:">=",limit:-360},message:"must be >= -360"}],!1}else return f.errors=[{instancePath:n+"/rotation",schemaPath:"#/properties/rotation/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var s=a===r}else var s=!0;if(s){if(e.defaultYaw!==void 0){let t=e.defaultYaw,a=r;if(r===a)if(typeof t=="number"&&isFinite(t)){if(t>360||isNaN(t))return f.errors=[{instancePath:n+"/defaultYaw",schemaPath:"#/properties/defaultYaw/maximum",keyword:"maximum",params:{comparison:"<=",limit:360},message:"must be <= 360"}],!1;if(t<-360||isNaN(t))return f.errors=[{instancePath:n+"/defaultYaw",schemaPath:"#/properties/defaultYaw/minimum",keyword:"minimum",params:{comparison:">=",limit:-360},message:"must be >= -360"}],!1}else return f.errors=[{instancePath:n+"/defaultYaw",schemaPath:"#/properties/defaultYaw/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var s=a===r}else var s=!0;if(s){if(e.defaultTilt!==void 0){let t=e.defaultTilt,a=r;if(r===a)if(typeof t=="number"&&isFinite(t)){if(t>30||isNaN(t))return f.errors=[{instancePath:n+"/defaultTilt",schemaPath:"#/properties/defaultTilt/maximum",keyword:"maximum",params:{comparison:"<=",limit:30},message:"must be <= 30"}],!1;if(t<-90||isNaN(t))return f.errors=[{instancePath:n+"/defaultTilt",schemaPath:"#/properties/defaultTilt/minimum",keyword:"minimum",params:{comparison:">=",limit:-90},message:"must be >= -90"}],!1}else return f.errors=[{instancePath:n+"/defaultTilt",schemaPath:"#/properties/defaultTilt/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var s=a===r}else var s=!0;if(s)if(e.defaultViewFov!==void 0){let t=e.defaultViewFov,a=r;if(r===a)if(typeof t=="number"&&isFinite(t)){if(t>120||isNaN(t))return f.errors=[{instancePath:n+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/maximum",keyword:"maximum",params:{comparison:"<=",limit:120},message:"must be <= 120"}],!1;if(t<20||isNaN(t))return f.errors=[{instancePath:n+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/minimum",keyword:"minimum",params:{comparison:">=",limit:20},message:"must be >= 20"}],!1}else return f.errors=[{instancePath:n+"/defaultViewFov",schemaPath:"#/properties/defaultViewFov/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var s=a===r}else var s=!0}}}}}}}}}}else return f.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return f.errors=i,r===0}f.evaluated={props:{version:!0,projection:!0,mount:!0,centerX:!0,centerY:!0,radius:!0,fov:!0,rotation:!0,defaultYaw:!0,defaultTilt:!0,defaultViewFov:!0},dynamicProps:!1,dynamicItems:!1};function b(e,{instancePath:n="",parentData:_,parentDataProperty:y,rootData:m=e,dynamicAnchors:p={}}={}){let i=null,r=0,o=b.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(typeof e=="string"){if(h(e)>1023)return b.errors=[{instancePath:n,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:1023},message:"must NOT have more than 1023 characters"}],!1;if(new TextEncoder().encode(e).byteLength>1023)return b.errors=[{instancePath:n,schemaPath:"#/x-lightnvr-max-bytes",keyword:"x-lightnvr-max-bytes",params:{},message:"must fit the UTF-8 byte limit"}],!1;if(e!==""){let c,t=!0;try{c=JSON.parse(e)}catch{t=!1}if(t){let a=r;f(c,{instancePath:n,parentData:e,parentDataProperty:y,rootData:m,dynamicAnchors:p})||(i=i===null?f.errors:i.concat(f.errors),r=i.length);var s=a===r;t=s}if(!t)return b.errors=[{instancePath:n,schemaPath:"#/contentSchema",keyword:"contentSchema",params:{},message:"must contain valid JSON matching contentSchema (or be empty)"}],!1}}else return b.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return b.errors=i,r===0}b.evaluated={dynamicProps:!1,dynamicItems:!1};function u(e,{instancePath:n="",parentData:_,parentDataProperty:y,rootData:m=e,dynamicAnchors:p={}}={}){let i=null,r=0,o=u.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),!(typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)))return u.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(r===0&&typeof e=="number"&&isFinite(e)){if(e>2147483647||isNaN(e))return u.errors=[{instancePath:n,schemaPath:"#/maximum",keyword:"maximum",params:{comparison:"<=",limit:2147483647},message:"must be <= 2147483647"}],!1;if(e<-2147483648||isNaN(e))return u.errors=[{instancePath:n,schemaPath:"#/minimum",keyword:"minimum",params:{comparison:">=",limit:-2147483648},message:"must be >= -2147483648"}],!1}return u.errors=i,r===0}u.evaluated={dynamicProps:!1,dynamicItems:!1};var I={type:"integer",enum:[0,1],$id:"urn:lightnvr:contract:StreamProtocol"};function k(e,{instancePath:n="",parentData:_,parentDataProperty:y,rootData:m=e,dynamicAnchors:p={}}={}){let i=null,r=0,o=k.evaluated;return o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)?e===0||e===1?(k.errors=i,r===0):(k.errors=[{instancePath:n,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:I.enum},message:"must be equal to one of the allowed values"}],!1):(k.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1)}k.evaluated={dynamicProps:!1,dynamicItems:!1};function g(e,{instancePath:n="",parentData:_,parentDataProperty:y,rootData:m=e,dynamicAnchors:p={}}={}){let i=null,r=0,o=g.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),!(typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)))return g.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(r===0&&typeof e=="number"&&isFinite(e)){if(e>365||isNaN(e))return g.errors=[{instancePath:n,schemaPath:"#/maximum",keyword:"maximum",params:{comparison:"<=",limit:365},message:"must be <= 365"}],!1;if(e<-1||isNaN(e))return g.errors=[{instancePath:n,schemaPath:"#/minimum",keyword:"minimum",params:{comparison:">=",limit:-1},message:"must be >= -1"}],!1}return g.errors=i,r===0}g.evaluated={dynamicProps:!1,dynamicItems:!1};function v(e,{instancePath:n="",parentData:_,parentDataProperty:y,rootData:m=e,dynamicAnchors:p={}}={}){let i=null,r=0,o=v.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(Array.isArray(e)){if(e.length>168)return v.errors=[{instancePath:n,schemaPath:"#/maxItems",keyword:"maxItems",params:{limit:168},message:"must NOT have more than 168 items"}],!1;if(e.length<168)return v.errors=[{instancePath:n,schemaPath:"#/minItems",keyword:"minItems",params:{limit:168},message:"must NOT have fewer than 168 items"}],!1;{var s=!0;let c=e.length;for(let t=0;t511)return x.errors=[{instancePath:n,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1;if(F.test(e)){if(new TextEncoder().encode(e).byteLength>511)return x.errors=[{instancePath:n,schemaPath:"#/x-lightnvr-max-bytes",keyword:"x-lightnvr-max-bytes",params:{},message:"must fit the UTF-8 byte limit"}],!1}else return x.errors=[{instancePath:n,schemaPath:"#/pattern",keyword:"pattern",params:{pattern:"^($|([Hh][Tt][Tt][Pp][Ss]?|[Rr][Tt][Ss][Pp][Ss]?)://)"},message:'must match pattern "^($|([Hh][Tt][Tt][Pp][Ss]?|[Rr][Tt][Ss][Pp][Ss]?)://)"'}],!1}return x.errors=i,r===0}x.evaluated={dynamicProps:!1,dynamicItems:!1};var Y={type:["string","null"],maxLength:511,pattern:"^[\\t\\n\\v\\f\\r ,]*(([Rr][Tt][Mm][Pp][Ss]?://[!#-&(-+\\x2D-\\x5B\\x5D-~]+)([\\t\\n\\v\\f\\r ,]+[Rr][Tt][Mm][Pp][Ss]?://[!#-&(-+\\x2D-\\x5B\\x5D-~]+)*)?[\\t\\n\\v\\f\\r ,]*$","x-lightnvr-max-bytes":511,$id:"urn:lightnvr:contract:PublishUrlList"},E=new RegExp("^[\\t\\n\\v\\f\\r ,]*(([Rr][Tt][Mm][Pp][Ss]?://[!#-&(-+\\x2D-\\x5B\\x5D-~]+)([\\t\\n\\v\\f\\r ,]+[Rr][Tt][Mm][Pp][Ss]?://[!#-&(-+\\x2D-\\x5B\\x5D-~]+)*)?[\\t\\n\\v\\f\\r ,]*$","u");function P(e,{instancePath:n="",parentData:_,parentDataProperty:y,rootData:m=e,dynamicAnchors:p={}}={}){let i=null,r=0,o=P.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),typeof e!="string"&&e!==null)return P.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:Y.type},message:"must be string,null"}],!1;if(r===0&&typeof e=="string"){if(h(e)>511)return P.errors=[{instancePath:n,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1;if(E.test(e)){if(new TextEncoder().encode(e).byteLength>511)return P.errors=[{instancePath:n,schemaPath:"#/x-lightnvr-max-bytes",keyword:"x-lightnvr-max-bytes",params:{},message:"must fit the UTF-8 byte limit"}],!1}else return P.errors=[{instancePath:n,schemaPath:"#/pattern",keyword:"pattern",params:{pattern:"^[\\t\\n\\v\\f\\r ,]*(([Rr][Tt][Mm][Pp][Ss]?://[!#-&(-+\\x2D-\\x5B\\x5D-~]+)([\\t\\n\\v\\f\\r ,]+[Rr][Tt][Mm][Pp][Ss]?://[!#-&(-+\\x2D-\\x5B\\x5D-~]+)*)?[\\t\\n\\v\\f\\r ,]*$"},message:'must match pattern "^[\\t\\n\\v\\f\\r ,]*(([Rr][Tt][Mm][Pp][Ss]?://[!#-&(-+\\x2D-\\x5B\\x5D-~]+)([\\t\\n\\v\\f\\r ,]+[Rr][Tt][Mm][Pp][Ss]?://[!#-&(-+\\x2D-\\x5B\\x5D-~]+)*)?[\\t\\n\\v\\f\\r ,]*$"'}],!1}return P.errors=i,r===0}P.evaluated={dynamicProps:!1,dynamicItems:!1};function l(e,{instancePath:n="",parentData:_,parentDataProperty:y,rootData:m=e,dynamicAnchors:p={}}={}){let i=null,r=0,o=l.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),r===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let c=r;for(let t in e)if(!O.call($.properties,t)){return l.errors=[{instancePath:n,schemaPath:"#/additionalProperties",keyword:"additionalProperties",params:{additionalProperty:t},message:"must NOT have additional properties"}],!1;break}if(c===r){if(e.url!==void 0){let t=e.url,a=r;if(r===a)if(typeof t=="string"){if(h(t)>511)return l.errors=[{instancePath:n+"/url",schemaPath:"#/properties/url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1}else return l.errors=[{instancePath:n+"/url",schemaPath:"#/properties/url/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var s=a===r}else var s=!0;if(s){if(e.enabled!==void 0){let t=r;if(typeof e.enabled!="boolean")return l.errors=[{instancePath:n+"/enabled",schemaPath:"#/properties/enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var s=t===r}else var s=!0;if(s){if(e.enable_disabled!==void 0){let t=r;if(typeof e.enable_disabled!="boolean")return l.errors=[{instancePath:n+"/enable_disabled",schemaPath:"#/properties/enable_disabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var s=t===r}else var s=!0;if(s){if(e.streaming_enabled!==void 0){let t=r;if(typeof e.streaming_enabled!="boolean")return l.errors=[{instancePath:n+"/streaming_enabled",schemaPath:"#/properties/streaming_enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var s=t===r}else var s=!0;if(s){if(e.playback_transport!==void 0){let t=r;w(e.playback_transport,{instancePath:n+"/playback_transport",parentData:e,parentDataProperty:"playback_transport",rootData:m,dynamicAnchors:p})||(i=i===null?w.errors:i.concat(w.errors),r=i.length);var s=t===r}else var s=!0;if(s){if(e.eptz_config!==void 0){let t=r;b(e.eptz_config,{instancePath:n+"/eptz_config",parentData:e,parentDataProperty:"eptz_config",rootData:m,dynamicAnchors:p})||(i=i===null?b.errors:i.concat(b.errors),r=i.length);var s=t===r}else var s=!0;if(s){if(e.codec!==void 0){let t=e.codec,a=r;if(r===a)if(typeof t=="string"){if(h(t)>15)return l.errors=[{instancePath:n+"/codec",schemaPath:"#/properties/codec/maxLength",keyword:"maxLength",params:{limit:15},message:"must NOT have more than 15 characters"}],!1}else return l.errors=[{instancePath:n+"/codec",schemaPath:"#/properties/codec/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var s=a===r}else var s=!0;if(s){if(e.priority!==void 0){let t=r;u(e.priority,{instancePath:n+"/priority",parentData:e,parentDataProperty:"priority",rootData:m,dynamicAnchors:p})||(i=i===null?u.errors:i.concat(u.errors),r=i.length);var s=t===r}else var s=!0;if(s){if(e.protocol!==void 0){let t=r;k(e.protocol,{instancePath:n+"/protocol",parentData:e,parentDataProperty:"protocol",rootData:m,dynamicAnchors:p})||(i=i===null?k.errors:i.concat(k.errors),r=i.length);var s=t===r}else var s=!0;if(s){if(e.segment_duration!==void 0){let t=r;u(e.segment_duration,{instancePath:n+"/segment_duration",parentData:e,parentDataProperty:"segment_duration",rootData:m,dynamicAnchors:p})||(i=i===null?u.errors:i.concat(u.errors),r=i.length);var s=t===r}else var s=!0;if(s){if(e.record!==void 0){let t=r;if(typeof e.record!="boolean")return l.errors=[{instancePath:n+"/record",schemaPath:"#/properties/record/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var s=t===r}else var s=!0;if(s){if(e.detection_based_recording!==void 0){let t=r;if(typeof e.detection_based_recording!="boolean")return l.errors=[{instancePath:n+"/detection_based_recording",schemaPath:"#/properties/detection_based_recording/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var s=t===r}else var s=!0;if(s){if(e.detection_model!==void 0){let t=e.detection_model,a=r;if(r===a)if(typeof t=="string"){if(h(t)>255)return l.errors=[{instancePath:n+"/detection_model",schemaPath:"#/properties/detection_model/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1;if(new TextEncoder().encode(t).byteLength>255)return l.errors=[{instancePath:n+"/detection_model",schemaPath:"#/properties/detection_model/x-lightnvr-max-bytes",keyword:"x-lightnvr-max-bytes",params:{},message:"must fit the UTF-8 byte limit"}],!1}else return l.errors=[{instancePath:n+"/detection_model",schemaPath:"#/properties/detection_model/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var s=a===r}else var s=!0;if(s){if(e.detection_threshold!==void 0){let t=e.detection_threshold,a=r;if(!(typeof t=="number"&&isFinite(t)))return l.errors=[{instancePath:n+"/detection_threshold",schemaPath:"#/properties/detection_threshold/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var s=a===r}else var s=!0;if(s){if(e.detection_interval!==void 0){let t=r;u(e.detection_interval,{instancePath:n+"/detection_interval",parentData:e,parentDataProperty:"detection_interval",rootData:m,dynamicAnchors:p})||(i=i===null?u.errors:i.concat(u.errors),r=i.length);var s=t===r}else var s=!0;if(s){if(e.pre_detection_buffer!==void 0){let t=r;u(e.pre_detection_buffer,{instancePath:n+"/pre_detection_buffer",parentData:e,parentDataProperty:"pre_detection_buffer",rootData:m,dynamicAnchors:p})||(i=i===null?u.errors:i.concat(u.errors),r=i.length);var s=t===r}else var s=!0;if(s){if(e.post_detection_buffer!==void 0){let t=r;u(e.post_detection_buffer,{instancePath:n+"/post_detection_buffer",parentData:e,parentDataProperty:"post_detection_buffer",rootData:m,dynamicAnchors:p})||(i=i===null?u.errors:i.concat(u.errors),r=i.length);var s=t===r}else var s=!0;if(s){if(e.detection_object_filter!==void 0){let t=e.detection_object_filter,a=r;if(r===a)if(typeof t=="string"){if(h(t)>15)return l.errors=[{instancePath:n+"/detection_object_filter",schemaPath:"#/properties/detection_object_filter/maxLength",keyword:"maxLength",params:{limit:15},message:"must NOT have more than 15 characters"}],!1}else return l.errors=[{instancePath:n+"/detection_object_filter",schemaPath:"#/properties/detection_object_filter/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var s=a===r}else var s=!0;if(s){if(e.detection_object_filter_list!==void 0){let t=e.detection_object_filter_list,a=r;if(r===a)if(typeof t=="string"){if(h(t)>255)return l.errors=[{instancePath:n+"/detection_object_filter_list",schemaPath:"#/properties/detection_object_filter_list/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1}else return l.errors=[{instancePath:n+"/detection_object_filter_list",schemaPath:"#/properties/detection_object_filter_list/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var s=a===r}else var s=!0;if(s){if(e.record_audio!==void 0){let t=r;if(typeof e.record_audio!="boolean")return l.errors=[{instancePath:n+"/record_audio",schemaPath:"#/properties/record_audio/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var s=t===r}else var s=!0;if(s){if(e.audio_voice_enhancement!==void 0){let t=r;if(typeof e.audio_voice_enhancement!="boolean")return l.errors=[{instancePath:n+"/audio_voice_enhancement",schemaPath:"#/properties/audio_voice_enhancement/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var s=t===r}else var s=!0;if(s){if(e.isOnvif!==void 0){let t=r;if(typeof e.isOnvif!="boolean")return l.errors=[{instancePath:n+"/isOnvif",schemaPath:"#/properties/isOnvif/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var s=t===r}else var s=!0;if(s){if(e.backchannel_enabled!==void 0){let t=r;if(typeof e.backchannel_enabled!="boolean")return l.errors=[{instancePath:n+"/backchannel_enabled",schemaPath:"#/properties/backchannel_enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var s=t===r}else var s=!0;if(s){if(e.onvif_username!==void 0){let t=e.onvif_username,a=r;if(r===a)if(typeof t=="string"){if(h(t)>63)return l.errors=[{instancePath:n+"/onvif_username",schemaPath:"#/properties/onvif_username/maxLength",keyword:"maxLength",params:{limit:63},message:"must NOT have more than 63 characters"}],!1}else return l.errors=[{instancePath:n+"/onvif_username",schemaPath:"#/properties/onvif_username/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var s=a===r}else var s=!0;if(s){if(e.onvif_password!==void 0){let t=e.onvif_password,a=r;if(r===a)if(typeof t=="string"){if(h(t)>63)return l.errors=[{instancePath:n+"/onvif_password",schemaPath:"#/properties/onvif_password/maxLength",keyword:"maxLength",params:{limit:63},message:"must NOT have more than 63 characters"}],!1}else return l.errors=[{instancePath:n+"/onvif_password",schemaPath:"#/properties/onvif_password/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var s=a===r}else var s=!0;if(s){if(e.onvif_profile!==void 0){let t=e.onvif_profile,a=r;if(r===a)if(typeof t=="string"){if(h(t)>63)return l.errors=[{instancePath:n+"/onvif_profile",schemaPath:"#/properties/onvif_profile/maxLength",keyword:"maxLength",params:{limit:63},message:"must NOT have more than 63 characters"}],!1}else return l.errors=[{instancePath:n+"/onvif_profile",schemaPath:"#/properties/onvif_profile/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var s=a===r}else var s=!0;if(s){if(e.onvif_port!==void 0){let t=r;u(e.onvif_port,{instancePath:n+"/onvif_port",parentData:e,parentDataProperty:"onvif_port",rootData:m,dynamicAnchors:p})||(i=i===null?u.errors:i.concat(u.errors),r=i.length);var s=t===r}else var s=!0;if(s){if(e.retention_days!==void 0){let t=r;g(e.retention_days,{instancePath:n+"/retention_days",parentData:e,parentDataProperty:"retention_days",rootData:m,dynamicAnchors:p})||(i=i===null?g.errors:i.concat(g.errors),r=i.length);var s=t===r}else var s=!0;if(s){if(e.detection_retention_days!==void 0){let t=r;g(e.detection_retention_days,{instancePath:n+"/detection_retention_days",parentData:e,parentDataProperty:"detection_retention_days",rootData:m,dynamicAnchors:p})||(i=i===null?g.errors:i.concat(g.errors),r=i.length);var s=t===r}else var s=!0;if(s){if(e.max_storage_mb!==void 0){let t=r;u(e.max_storage_mb,{instancePath:n+"/max_storage_mb",parentData:e,parentDataProperty:"max_storage_mb",rootData:m,dynamicAnchors:p})||(i=i===null?u.errors:i.concat(u.errors),r=i.length);var s=t===r}else var s=!0;if(s){if(e.tier_critical_multiplier!==void 0){let t=e.tier_critical_multiplier,a=r;if(!(typeof t=="number"&&isFinite(t)))return l.errors=[{instancePath:n+"/tier_critical_multiplier",schemaPath:"#/properties/tier_critical_multiplier/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var s=a===r}else var s=!0;if(s){if(e.tier_important_multiplier!==void 0){let t=e.tier_important_multiplier,a=r;if(!(typeof t=="number"&&isFinite(t)))return l.errors=[{instancePath:n+"/tier_important_multiplier",schemaPath:"#/properties/tier_important_multiplier/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var s=a===r}else var s=!0;if(s){if(e.tier_ephemeral_multiplier!==void 0){let t=e.tier_ephemeral_multiplier,a=r;if(!(typeof t=="number"&&isFinite(t)))return l.errors=[{instancePath:n+"/tier_ephemeral_multiplier",schemaPath:"#/properties/tier_ephemeral_multiplier/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var s=a===r}else var s=!0;if(s){if(e.storage_priority!==void 0){let t=r;u(e.storage_priority,{instancePath:n+"/storage_priority",parentData:e,parentDataProperty:"storage_priority",rootData:m,dynamicAnchors:p})||(i=i===null?u.errors:i.concat(u.errors),r=i.length);var s=t===r}else var s=!0;if(s){if(e.ptz_enabled!==void 0){let t=r;if(typeof e.ptz_enabled!="boolean")return l.errors=[{instancePath:n+"/ptz_enabled",schemaPath:"#/properties/ptz_enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var s=t===r}else var s=!0;if(s){if(e.ptz_max_x!==void 0){let t=r;u(e.ptz_max_x,{instancePath:n+"/ptz_max_x",parentData:e,parentDataProperty:"ptz_max_x",rootData:m,dynamicAnchors:p})||(i=i===null?u.errors:i.concat(u.errors),r=i.length);var s=t===r}else var s=!0;if(s){if(e.ptz_max_y!==void 0){let t=r;u(e.ptz_max_y,{instancePath:n+"/ptz_max_y",parentData:e,parentDataProperty:"ptz_max_y",rootData:m,dynamicAnchors:p})||(i=i===null?u.errors:i.concat(u.errors),r=i.length);var s=t===r}else var s=!0;if(s){if(e.ptz_max_z!==void 0){let t=r;u(e.ptz_max_z,{instancePath:n+"/ptz_max_z",parentData:e,parentDataProperty:"ptz_max_z",rootData:m,dynamicAnchors:p})||(i=i===null?u.errors:i.concat(u.errors),r=i.length);var s=t===r}else var s=!0;if(s){if(e.ptz_has_home!==void 0){let t=r;if(typeof e.ptz_has_home!="boolean")return l.errors=[{instancePath:n+"/ptz_has_home",schemaPath:"#/properties/ptz_has_home/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var s=t===r}else var s=!0;if(s){if(e.record_on_schedule!==void 0){let t=r;if(typeof e.record_on_schedule!="boolean")return l.errors=[{instancePath:n+"/record_on_schedule",schemaPath:"#/properties/record_on_schedule/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var s=t===r}else var s=!0;if(s){if(e.recording_schedule!==void 0){let t=r;v(e.recording_schedule,{instancePath:n+"/recording_schedule",parentData:e,parentDataProperty:"recording_schedule",rootData:m,dynamicAnchors:p})||(i=i===null?v.errors:i.concat(v.errors),r=i.length);var s=t===r}else var s=!0;if(s){if(e.detection_record_on_schedule!==void 0){let t=r;if(typeof e.detection_record_on_schedule!="boolean")return l.errors=[{instancePath:n+"/detection_record_on_schedule",schemaPath:"#/properties/detection_record_on_schedule/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var s=t===r}else var s=!0;if(s){if(e.detection_recording_schedule!==void 0){let t=r;v(e.detection_recording_schedule,{instancePath:n+"/detection_recording_schedule",parentData:e,parentDataProperty:"detection_recording_schedule",rootData:m,dynamicAnchors:p})||(i=i===null?v.errors:i.concat(v.errors),r=i.length);var s=t===r}else var s=!0;if(s){if(e.tags!==void 0){let t=e.tags,a=r;if(d(t,{instancePath:n+"/tags",parentData:e,parentDataProperty:"tags",rootData:m,dynamicAnchors:p})||(i=i===null?d.errors:i.concat(d.errors),r=i.length),r===a&&typeof t=="string"&&h(t)>255)return l.errors=[{instancePath:n+"/tags",schemaPath:"#/properties/tags/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1;var s=a===r}else var s=!0;if(s){if(e.admin_url!==void 0){let t=e.admin_url,a=r;if(d(t,{instancePath:n+"/admin_url",parentData:e,parentDataProperty:"admin_url",rootData:m,dynamicAnchors:p})||(i=i===null?d.errors:i.concat(d.errors),r=i.length),r===a&&typeof t=="string"&&h(t)>511)return l.errors=[{instancePath:n+"/admin_url",schemaPath:"#/properties/admin_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1;var s=a===r}else var s=!0;if(s){if(e.motion_trigger_source!==void 0){let t=e.motion_trigger_source,a=r;if(d(t,{instancePath:n+"/motion_trigger_source",parentData:e,parentDataProperty:"motion_trigger_source",rootData:m,dynamicAnchors:p})||(i=i===null?d.errors:i.concat(d.errors),r=i.length),r===a&&typeof t=="string"&&h(t)>255)return l.errors=[{instancePath:n+"/motion_trigger_source",schemaPath:"#/properties/motion_trigger_source/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1;var s=a===r}else var s=!0;if(s){if(e.go2rtc_source_override!==void 0){let t=e.go2rtc_source_override,a=r;if(d(t,{instancePath:n+"/go2rtc_source_override",parentData:e,parentDataProperty:"go2rtc_source_override",rootData:m,dynamicAnchors:p})||(i=i===null?d.errors:i.concat(d.errors),r=i.length),r===a&&typeof t=="string"&&h(t)>8191)return l.errors=[{instancePath:n+"/go2rtc_source_override",schemaPath:"#/properties/go2rtc_source_override/maxLength",keyword:"maxLength",params:{limit:8191},message:"must NOT have more than 8191 characters"}],!1;var s=a===r}else var s=!0;if(s){if(e.sub_stream_url!==void 0){let t=e.sub_stream_url,a=r;if(d(t,{instancePath:n+"/sub_stream_url",parentData:e,parentDataProperty:"sub_stream_url",rootData:m,dynamicAnchors:p})||(i=i===null?d.errors:i.concat(d.errors),r=i.length),r===a&&typeof t=="string"&&h(t)>511)return l.errors=[{instancePath:n+"/sub_stream_url",schemaPath:"#/properties/sub_stream_url/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1;var s=a===r}else var s=!0;if(s){if(e.detection_url!==void 0){let t=r;x(e.detection_url,{instancePath:n+"/detection_url",parentData:e,parentDataProperty:"detection_url",rootData:m,dynamicAnchors:p})||(i=i===null?x.errors:i.concat(x.errors),r=i.length);var s=t===r}else var s=!0;if(s)if(e.publish_url!==void 0){let t=r;P(e.publish_url,{instancePath:n+"/publish_url",parentData:e,parentDataProperty:"publish_url",rootData:m,dynamicAnchors:p})||(i=i===null?P.errors:i.concat(P.errors),r=i.length);var s=t===r}else var s=!0}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}else return l.errors=[{instancePath:n,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return l.errors=i,r===0}l.evaluated={props:!0,dynamicProps:!1,dynamicItems:!1};export{q as validateStreamUpdateRequest}; diff --git a/web/js/api/generated/validators/SummaryForbiddenSensitiveKeys.d.mts b/web/js/api/generated/validators/SummaryForbiddenSensitiveKeys.d.mts new file mode 100644 index 000000000..dd19ef92d --- /dev/null +++ b/web/js/api/generated/validators/SummaryForbiddenSensitiveKeys.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateSummaryForbiddenSensitiveKeys } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/SummaryForbiddenSensitiveKeys.mjs b/web/js/api/generated/validators/SummaryForbiddenSensitiveKeys.mjs new file mode 100644 index 000000000..9128803f1 --- /dev/null +++ b/web/js/api/generated/validators/SummaryForbiddenSensitiveKeys.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var S=u;function u(r,{instancePath:_="",parentData:j,parentDataProperty:q,rootData:w=r,dynamicAnchors:P={}}={}){let e=null,s=0,t=u.evaluated;t.dynamicProps&&(t.props=void 0),t.dynamicItems&&(t.items=void 0);let f=s,v=s,c=s,l=!1,y=s;if(r&&typeof r=="object"&&!Array.isArray(r)){let n;if(r.url===void 0&&(n="url")){let i={};e===null?e=[i]:e.push(i),s++}}var o=y===s;l=l||o;let d=s;if(r&&typeof r=="object"&&!Array.isArray(r)){let n;if(r.onvif_username===void 0&&(n="onvif_username")){let i={};e===null?e=[i]:e.push(i),s++}}var o=d===s;l=l||o;let p=s;if(r&&typeof r=="object"&&!Array.isArray(r)){let n;if(r.onvif_password===void 0&&(n="onvif_password")){let i={};e===null?e=[i]:e.push(i),s++}}var o=p===s;l=l||o;let m=s;if(r&&typeof r=="object"&&!Array.isArray(r)){let n;if(r.sub_stream_url===void 0&&(n="sub_stream_url")){let i={};e===null?e=[i]:e.push(i),s++}}var o=m===s;l=l||o;let a=s;if(r&&typeof r=="object"&&!Array.isArray(r)){let n;if(r.detection_url===void 0&&(n="detection_url")){let i={};e===null?e=[i]:e.push(i),s++}}var o=a===s;l=l||o;let h=s;if(r&&typeof r=="object"&&!Array.isArray(r)){let n;if(r.publish_url===void 0&&(n="publish_url")){let i={};e===null?e=[i]:e.push(i),s++}}var o=h===s;l=l||o;let b=s;if(r&&typeof r=="object"&&!Array.isArray(r)){let n;if(r.go2rtc_source_override===void 0&&(n="go2rtc_source_override")){let i={};e===null?e=[i]:e.push(i),s++}}var o=b===s;l=l||o;let A=s;if(r&&typeof r=="object"&&!Array.isArray(r)){let n;if(r.detection_api_url===void 0&&(n="detection_api_url")){let i={};e===null?e=[i]:e.push(i),s++}}var o=A===s;if(l=l||o,l)s=c,e!==null&&(c?e.length=c:e=null);else{let n={};e===null?e=[n]:e.push(n),s++}var g=v===s;return g?(u.errors=[{instancePath:_,schemaPath:"#/not",keyword:"not",params:{},message:"must NOT be valid"}],!1):(s=f,e!==null&&(f?e.length=f:e=null),u.errors=e,s===0)}u.evaluated={dynamicProps:!1,dynamicItems:!1};export{S as validateSummaryForbiddenSensitiveKeys}; diff --git a/web/js/api/generated/validators/SummaryPageMeta.d.mts b/web/js/api/generated/validators/SummaryPageMeta.d.mts new file mode 100644 index 000000000..48a21b64d --- /dev/null +++ b/web/js/api/generated/validators/SummaryPageMeta.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateSummaryPageMeta } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/SummaryPageMeta.mjs b/web/js/api/generated/validators/SummaryPageMeta.mjs new file mode 100644 index 000000000..7b32b2515 --- /dev/null +++ b/web/js/api/generated/validators/SummaryPageMeta.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var y=t;function t(r,{instancePath:s="",parentData:u,parentDataProperty:l,rootData:g=r,dynamicAnchors:f={}}={}){let n=null,i=0,o=t.evaluated;if(o.dynamicProps&&(o.props=void 0),o.dynamicItems&&(o.items=void 0),i===0)if(r&&typeof r=="object"&&!Array.isArray(r)){let p;if(r.total===void 0&&(p="total")||r.page===void 0&&(p="page")||r.page_size===void 0&&(p="page_size")||r.total_pages===void 0&&(p="total_pages"))return t.errors=[{instancePath:s,schemaPath:"#/required",keyword:"required",params:{missingProperty:p},message:"must have required property '"+p+"'"}],!1;if(r.total!==void 0){let e=r.total,a=i;if(!(typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)))return t.errors=[{instancePath:s+"/total",schemaPath:"#/properties/total/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(i===a&&typeof e=="number"&&isFinite(e)&&(e<0||isNaN(e)))return t.errors=[{instancePath:s+"/total",schemaPath:"#/properties/total/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1;var m=a===i}else var m=!0;if(m){if(r.page!==void 0){let e=r.page,a=i;if(!(typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)))return t.errors=[{instancePath:s+"/page",schemaPath:"#/properties/page/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(i===a&&typeof e=="number"&&isFinite(e)){if(e>1e6||isNaN(e))return t.errors=[{instancePath:s+"/page",schemaPath:"#/properties/page/maximum",keyword:"maximum",params:{comparison:"<=",limit:1e6},message:"must be <= 1000000"}],!1;if(e<1||isNaN(e))return t.errors=[{instancePath:s+"/page",schemaPath:"#/properties/page/minimum",keyword:"minimum",params:{comparison:">=",limit:1},message:"must be >= 1"}],!1}var m=a===i}else var m=!0;if(m){if(r.page_size!==void 0){let e=r.page_size,a=i;if(!(typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)))return t.errors=[{instancePath:s+"/page_size",schemaPath:"#/properties/page_size/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(i===a&&typeof e=="number"&&isFinite(e)){if(e>100||isNaN(e))return t.errors=[{instancePath:s+"/page_size",schemaPath:"#/properties/page_size/maximum",keyword:"maximum",params:{comparison:"<=",limit:100},message:"must be <= 100"}],!1;if(e<1||isNaN(e))return t.errors=[{instancePath:s+"/page_size",schemaPath:"#/properties/page_size/minimum",keyword:"minimum",params:{comparison:">=",limit:1},message:"must be >= 1"}],!1}var m=a===i}else var m=!0;if(m)if(r.total_pages!==void 0){let e=r.total_pages,a=i;if(!(typeof e=="number"&&!(e%1)&&!isNaN(e)&&isFinite(e)))return t.errors=[{instancePath:s+"/total_pages",schemaPath:"#/properties/total_pages/type",keyword:"type",params:{type:"integer"},message:"must be integer"}],!1;if(i===a&&typeof e=="number"&&isFinite(e)&&(e<0||isNaN(e)))return t.errors=[{instancePath:s+"/total_pages",schemaPath:"#/properties/total_pages/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"}],!1;var m=a===i}else var m=!0}}}else return t.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return t.errors=n,i===0}t.evaluated={props:{total:!0,page:!0,page_size:!0,total_pages:!0},dynamicProps:!1,dynamicItems:!1};export{y as validateSummaryPageMeta}; diff --git a/web/js/api/generated/validators/SummaryStatus.d.mts b/web/js/api/generated/validators/SummaryStatus.d.mts new file mode 100644 index 000000000..4ebbd91b0 --- /dev/null +++ b/web/js/api/generated/validators/SummaryStatus.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateSummaryStatus } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/SummaryStatus.mjs b/web/js/api/generated/validators/SummaryStatus.mjs new file mode 100644 index 000000000..64b00c8d2 --- /dev/null +++ b/web/js/api/generated/validators/SummaryStatus.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var d=r,o={type:"string",enum:["Running","Degraded","Error","Stopped","Unknown"],$id:"urn:lightnvr:contract:SummaryStatus"};function r(e,{instancePath:t="",parentData:u,parentDataProperty:m,rootData:i=e,dynamicAnchors:l={}}={}){let s=null,a=0,n=r.evaluated;return n.dynamicProps&&(n.props=void 0),n.dynamicItems&&(n.items=void 0),typeof e!="string"?(r.errors=[{instancePath:t,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1):e==="Running"||e==="Degraded"||e==="Error"||e==="Stopped"||e==="Unknown"?(r.errors=s,a===0):(r.errors=[{instancePath:t,schemaPath:"#/enum",keyword:"enum",params:{allowedValues:o.enum},message:"must be equal to one of the allowed values"}],!1)}r.evaluated={dynamicProps:!1,dynamicItems:!1};export{d as validateSummaryStatus}; diff --git a/web/js/api/generated/validators/UrlWithoutQuerySecrets.d.mts b/web/js/api/generated/validators/UrlWithoutQuerySecrets.d.mts new file mode 100644 index 000000000..dad6a29a3 --- /dev/null +++ b/web/js/api/generated/validators/UrlWithoutQuerySecrets.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateUrlWithoutQuerySecrets } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/UrlWithoutQuerySecrets.mjs b/web/js/api/generated/validators/UrlWithoutQuerySecrets.mjs new file mode 100644 index 000000000..bde68f4cf --- /dev/null +++ b/web/js/api/generated/validators/UrlWithoutQuerySecrets.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var m=r;var c=new RegExp("[?&;][^=&#]*([Pp][Aa][Ss][Ss]|[Pp][Ww][Dd]|[Tt][Oo][Kk][Ee][Nn]|[Ss][Ee][Cc][Rr][Ee][Tt]|[Aa][Pp][Ii]_?[Kk][Ee][Yy])[^=&#]*=[^&#]","u");function r(s,{instancePath:i="",parentData:u,parentDataProperty:d,rootData:f=s,dynamicAnchors:y={}}={}){let e=null,t=0,n=r.evaluated;if(n.dynamicProps&&(n.props=void 0),n.dynamicItems&&(n.items=void 0),typeof s!="string")return r.errors=[{instancePath:i,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;let a=t,l=t;if(typeof s=="string"&&!c.test(s)){let o={};e===null?e=[o]:e.push(o),t++}var p=l===t;return p?(r.errors=[{instancePath:i,schemaPath:"#/not",keyword:"not",params:{},message:"must NOT be valid"}],!1):(t=a,e!==null&&(a?e.length=a:e=null),r.errors=e,t===0)}r.evaluated={dynamicProps:!1,dynamicItems:!1};export{m as validateUrlWithoutQuerySecrets}; diff --git a/web/js/api/generated/validators/UrlWithoutUserinfo.d.mts b/web/js/api/generated/validators/UrlWithoutUserinfo.d.mts new file mode 100644 index 000000000..287b6213b --- /dev/null +++ b/web/js/api/generated/validators/UrlWithoutUserinfo.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateUrlWithoutUserinfo } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/UrlWithoutUserinfo.mjs b/web/js/api/generated/validators/UrlWithoutUserinfo.mjs new file mode 100644 index 000000000..a2ad4eb92 --- /dev/null +++ b/web/js/api/generated/validators/UrlWithoutUserinfo.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var m=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(n){throw e=0,n}};var c=m(o=>{"use strict";Object.defineProperty(o,"__esModule",{value:!0});function u(t){let e=t.length,n=0,a=0,s;for(;a=55296&&s<=56319&&a511)return r.errors=[{instancePath:e,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1;if(!p.test(t))return r.errors=[{instancePath:e,schemaPath:"#/pattern",keyword:"pattern",params:{pattern:"^(?![A-Za-z][A-Za-z0-9+.-]*://[^/?#]*@)"},message:'must match pattern "^(?![A-Za-z][A-Za-z0-9+.-]*://[^/?#]*@)"'}],!1}else return r.errors=[{instancePath:e,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return r.errors=f,l===0}r.evaluated={dynamicProps:!1,dynamicItems:!1};export{v as validateUrlWithoutUserinfo}; diff --git a/web/js/api/generated/validators/ViewerSafeUrl.d.mts b/web/js/api/generated/validators/ViewerSafeUrl.d.mts new file mode 100644 index 000000000..3baf626a0 --- /dev/null +++ b/web/js/api/generated/validators/ViewerSafeUrl.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateViewerSafeUrl } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/ViewerSafeUrl.mjs b/web/js/api/generated/validators/ViewerSafeUrl.mjs new file mode 100644 index 000000000..8739651c5 --- /dev/null +++ b/web/js/api/generated/validators/ViewerSafeUrl.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var A=(e,t)=>()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(l){throw t=0,l}};var g=A(h=>{"use strict";Object.defineProperty(h,"__esModule",{value:!0});function v(e){let t=e.length,l=0,a=0,i;for(;a=55296&&i<=56319&&a511)return o.errors=[{instancePath:t,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:511},message:"must NOT have more than 511 characters"}],!1;if(!E.test(e))return o.errors=[{instancePath:t,schemaPath:"#/pattern",keyword:"pattern",params:{pattern:"^(?![A-Za-z][A-Za-z0-9+.-]*://[^/?#]*@)"},message:'must match pattern "^(?![A-Za-z][A-Za-z0-9+.-]*://[^/?#]*@)"'}],!1}else return o.errors=[{instancePath:t,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return o.errors=r,s===0}o.evaluated={dynamicProps:!1,dynamicItems:!1};var w=new RegExp("[?&;][^=&#]*([Pp][Aa][Ss][Ss]|[Pp][Ww][Dd]|[Tt][Oo][Kk][Ee][Nn]|[Ss][Ee][Cc][Rr][Ee][Tt]|[Aa][Pp][Ii]_?[Kk][Ee][Yy])[^=&#]*=[^&#]","u");function c(e,{instancePath:t="",parentData:l,parentDataProperty:a,rootData:i=e,dynamicAnchors:f={}}={}){let r=null,s=0,n=c.evaluated;if(n.dynamicProps&&(n.props=void 0),n.dynamicItems&&(n.items=void 0),typeof e!="string")return c.errors=[{instancePath:t,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;let u=s,d=s;if(typeof e=="string"&&!w.test(e)){let y={};r===null?r=[y]:r.push(y),s++}var p=d===s;return p?(c.errors=[{instancePath:t,schemaPath:"#/not",keyword:"not",params:{},message:"must NOT be valid"}],!1):(s=u,r!==null&&(u?r.length=u:r=null),c.errors=r,s===0)}c.evaluated={dynamicProps:!1,dynamicItems:!1};function m(e,{instancePath:t="",parentData:l,parentDataProperty:a,rootData:i=e,dynamicAnchors:f={}}={}){let r=null,s=0,n=m.evaluated;n.dynamicProps&&(n.props=void 0),n.dynamicItems&&(n.items=void 0);let u=s;o(e,{instancePath:t,parentData:l,parentDataProperty:a,rootData:i,dynamicAnchors:f})||(r=r===null?o.errors:r.concat(o.errors),s=r.length);var d=u===s;if(d){let p=s;c(e,{instancePath:t,parentData:l,parentDataProperty:a,rootData:i,dynamicAnchors:f})||(r=r===null?c.errors:r.concat(c.errors),s=r.length);var d=p===s}return m.errors=r,s===0}m.evaluated={dynamicProps:!1,dynamicItems:!1};export{k as validateViewerSafeUrl}; diff --git a/web/js/api/generated/validators/ZonePoint.d.mts b/web/js/api/generated/validators/ZonePoint.d.mts new file mode 100644 index 000000000..297cb337e --- /dev/null +++ b/web/js/api/generated/validators/ZonePoint.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateZonePoint } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/ZonePoint.mjs b/web/js/api/generated/validators/ZonePoint.mjs new file mode 100644 index 000000000..ac917804a --- /dev/null +++ b/web/js/api/generated/validators/ZonePoint.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var l=r;function r(e,{instancePath:i="",parentData:y,parentDataProperty:m,rootData:d=e,dynamicAnchors:f={}}={}){let u=null,t=0,n=r.evaluated;if(n.dynamicProps&&(n.props=void 0),n.dynamicItems&&(n.items=void 0),t===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let o;if(e.x===void 0&&(o="x")||e.y===void 0&&(o="y"))return r.errors=[{instancePath:i,schemaPath:"#/required",keyword:"required",params:{missingProperty:o},message:"must have required property '"+o+"'"}],!1;if(e.x!==void 0){let s=e.x,p=t;if(!(typeof s=="number"&&isFinite(s)))return r.errors=[{instancePath:i+"/x",schemaPath:"#/properties/x/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var a=p===t}else var a=!0;if(a)if(e.y!==void 0){let s=e.y,p=t;if(!(typeof s=="number"&&isFinite(s)))return r.errors=[{instancePath:i+"/y",schemaPath:"#/properties/y/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var a=p===t}else var a=!0}else return r.errors=[{instancePath:i,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return r.errors=u,t===0}r.evaluated={props:{x:!0,y:!0},dynamicProps:!1,dynamicItems:!1};export{l as validateZonePoint}; diff --git a/web/js/api/generated/validators/ZonesResponse.d.mts b/web/js/api/generated/validators/ZonesResponse.d.mts new file mode 100644 index 000000000..4eb7678a0 --- /dev/null +++ b/web/js/api/generated/validators/ZonesResponse.d.mts @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +export { validateZonesResponse } from '../validators.mjs'; diff --git a/web/js/api/generated/validators/ZonesResponse.mjs b/web/js/api/generated/validators/ZonesResponse.mjs new file mode 100644 index 000000000..d7a7fc8a4 --- /dev/null +++ b/web/js/api/generated/validators/ZonesResponse.mjs @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Generated by scripts/quality/contracts.mjs; do not edit. +var D=(e,s)=>()=>{try{return s||e((s={exports:{}}).exports,s),s.exports}catch(d){throw s=0,d}};var k=D(P=>{"use strict";Object.defineProperty(P,"__esModule",{value:!0});function w(e){let s=e.length,d=0,y=0,p;for(;y=55296&&p<=56319&&y255)return u.errors=[{instancePath:s,schemaPath:"#/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1;if(v(e)<1)return u.errors=[{instancePath:s,schemaPath:"#/minLength",keyword:"minLength",params:{limit:1},message:"must NOT have fewer than 1 characters"}],!1;if(new TextEncoder().encode(e).byteLength>255)return u.errors=[{instancePath:s,schemaPath:"#/x-lightnvr-max-bytes",keyword:"x-lightnvr-max-bytes",params:{},message:"must fit the UTF-8 byte limit"}],!1}else return u.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;return u.errors=o,r===0}u.evaluated={dynamicProps:!1,dynamicItems:!1};function c(e,{instancePath:s="",parentData:d,parentDataProperty:y,rootData:p=e,dynamicAnchors:g={}}={}){let o=null,r=0,m=c.evaluated;if(m.dynamicProps&&(m.props=void 0),m.dynamicItems&&(m.items=void 0),r===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let f;if(e.x===void 0&&(f="x")||e.y===void 0&&(f="y"))return c.errors=[{instancePath:s,schemaPath:"#/required",keyword:"required",params:{missingProperty:f},message:"must have required property '"+f+"'"}],!1;if(e.x!==void 0){let n=e.x,a=r;if(!(typeof n=="number"&&isFinite(n)))return c.errors=[{instancePath:s+"/x",schemaPath:"#/properties/x/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var t=a===r}else var t=!0;if(t)if(e.y!==void 0){let n=e.y,a=r;if(!(typeof n=="number"&&isFinite(n)))return c.errors=[{instancePath:s+"/y",schemaPath:"#/properties/y/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var t=a===r}else var t=!0}else return c.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return c.errors=o,r===0}c.evaluated={props:{x:!0,y:!0},dynamicProps:!1,dynamicItems:!1};function i(e,{instancePath:s="",parentData:d,parentDataProperty:y,rootData:p=e,dynamicAnchors:g={}}={}){let o=null,r=0,m=i.evaluated;if(m.dynamicProps&&(m.props=void 0),m.dynamicItems&&(m.items=void 0),r===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let n;if(e.id===void 0&&(n="id")||e.stream_name===void 0&&(n="stream_name")||e.name===void 0&&(n="name")||e.enabled===void 0&&(n="enabled")||e.color===void 0&&(n="color")||e.polygon===void 0&&(n="polygon")||e.filter_classes===void 0&&(n="filter_classes")||e.min_confidence===void 0&&(n="min_confidence"))return i.errors=[{instancePath:s,schemaPath:"#/required",keyword:"required",params:{missingProperty:n},message:"must have required property '"+n+"'"}],!1;if(e.id!==void 0){let a=e.id,l=r;if(r===l)if(typeof a=="string"){if(v(a)>63)return i.errors=[{instancePath:s+"/id",schemaPath:"#/properties/id/maxLength",keyword:"maxLength",params:{limit:63},message:"must NOT have more than 63 characters"}],!1}else return i.errors=[{instancePath:s+"/id",schemaPath:"#/properties/id/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var t=l===r}else var t=!0;if(t){if(e.stream_name!==void 0){let a=r;u(e.stream_name,{instancePath:s+"/stream_name",parentData:e,parentDataProperty:"stream_name",rootData:p,dynamicAnchors:g})||(o=o===null?u.errors:o.concat(u.errors),r=o.length);var t=a===r}else var t=!0;if(t){if(e.name!==void 0){let a=e.name,l=r;if(r===l)if(typeof a=="string"){if(v(a)>63)return i.errors=[{instancePath:s+"/name",schemaPath:"#/properties/name/maxLength",keyword:"maxLength",params:{limit:63},message:"must NOT have more than 63 characters"}],!1}else return i.errors=[{instancePath:s+"/name",schemaPath:"#/properties/name/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var t=l===r}else var t=!0;if(t){if(e.enabled!==void 0){let a=r;if(typeof e.enabled!="boolean")return i.errors=[{instancePath:s+"/enabled",schemaPath:"#/properties/enabled/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"}],!1;var t=a===r}else var t=!0;if(t){if(e.color!==void 0){let a=e.color,l=r;if(r===l)if(typeof a=="string"){if(v(a)>7)return i.errors=[{instancePath:s+"/color",schemaPath:"#/properties/color/maxLength",keyword:"maxLength",params:{limit:7},message:"must NOT have more than 7 characters"}],!1}else return i.errors=[{instancePath:s+"/color",schemaPath:"#/properties/color/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var t=l===r}else var t=!0;if(t){if(e.polygon!==void 0){let a=e.polygon,l=r;if(r===l)if(Array.isArray(a)){if(a.length>32)return i.errors=[{instancePath:s+"/polygon",schemaPath:"#/properties/polygon/maxItems",keyword:"maxItems",params:{limit:32},message:"must NOT have more than 32 items"}],!1;{var f=!0;let x=a.length;for(let _=0;_255)return i.errors=[{instancePath:s+"/filter_classes",schemaPath:"#/properties/filter_classes/maxLength",keyword:"maxLength",params:{limit:255},message:"must NOT have more than 255 characters"}],!1}else return i.errors=[{instancePath:s+"/filter_classes",schemaPath:"#/properties/filter_classes/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var t=l===r}else var t=!0;if(t)if(e.min_confidence!==void 0){let a=e.min_confidence,l=r;if(!(typeof a=="number"&&isFinite(a)))return i.errors=[{instancePath:s+"/min_confidence",schemaPath:"#/properties/min_confidence/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var t=l===r}else var t=!0}}}}}}}else return i.errors=[{instancePath:s,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return i.errors=o,r===0}i.evaluated={props:{id:!0,stream_name:!0,name:!0,enabled:!0,color:!0,polygon:!0,filter_classes:!0,min_confidence:!0},dynamicProps:!1,dynamicItems:!1};function h(e,{instancePath:s="",parentData:d,parentDataProperty:y,rootData:p=e,dynamicAnchors:g={}}={}){let o=null,r=0,m=h.evaluated;if(m.dynamicProps&&(m.props=void 0),m.dynamicItems&&(m.items=void 0),r===0)if(e&&typeof e=="object"&&!Array.isArray(e)){let f;if(e.zones===void 0&&(f="zones"))return h.errors=[{instancePath:s,schemaPath:"#/required",keyword:"required",params:{missingProperty:f},message:"must have required property '"+f+"'"}],!1;if(e.zones!==void 0){let n=e.zones;if(r===r)if(Array.isArray(n)){if(n.length>16)return h.errors=[{instancePath:s+"/zones",schemaPath:"#/properties/zones/maxItems",keyword:"maxItems",params:{limit:16},message:"must NOT have more than 16 items"}],!1;{var t=!0;let l=n.length;for(let b=0;b Date: Sat, 31 Oct 2026 03:45:43 -0400 Subject: [PATCH 025/230] T10: enforce typed lint rules and stable migration identities --- quality/evidence/T10-expansion.md | 58 ++++++++ quality/evidence/T10.md | 52 +++++++ tests/quality/lint-compat.test.mjs | 128 ++++++++++++++++++ .../no-duplicate-implementation.js | 18 +++ web/eslint-rules/no-literal-ui-string.js | 21 ++- web/eslint-rules/source-identity.js | 54 ++++++++ web/eslint.config.js | 23 +++- 7 files changed, 345 insertions(+), 9 deletions(-) create mode 100644 quality/evidence/T10-expansion.md create mode 100644 quality/evidence/T10.md create mode 100644 tests/quality/lint-compat.test.mjs create mode 100644 web/eslint-rules/no-duplicate-implementation.js create mode 100644 web/eslint-rules/source-identity.js diff --git a/quality/evidence/T10-expansion.md b/quality/evidence/T10-expansion.md new file mode 100644 index 000000000..111c98752 --- /dev/null +++ b/quality/evidence/T10-expansion.md @@ -0,0 +1,58 @@ +# T10 localization follow-up records + +The strengthened lint rule exposes 21 existing attribute/interpolation literals +in ten files. No baseline increase or detector relaxation is permitted. Append +these task records, add T10.3 to T14/T15, and order overlapping T7.* source writers +after the relevant T10 child. English fallback is supported by the existing +locale loader and catalog policy; no untranslated copies are added to the other +locale catalogs. + +### T10.1: Supply attribute translation keys and regression fixtures +- **depends_on**: [T10] +- **agent_type**: worker +- **ownership**: `web/public/locales/en.json`, `tests/quality/localized-attributes.test.mjs`, `quality/evidence/T10.1.md`. +- **description**: Add explicit English keys for newly exposed placeholder examples, plan labels/shortcuts, recording thumbnail/count and tag-removal labels. Reuse existing settings.tabsLabel, recordings.download/protect/unprotect keys. Test real i18n interpolation and English fallback for a partial locale; do not translate protocol examples or add fabricated translations to other catalogs. +- **acceptance_criteria**: + - Required source keys exist and interpolate variable values, singular/plural counts, shortcut labels and multiline examples without raw key names or dropped parameters. + - Existing English output is preserved except the intentional reuse of the more descriptive existing Protect/Unprotect recording labels. + - No i18n literal allowance is increased; non-English partial-catalog fallback follows existing behavior. +- **validation**: + - `node --test tests/quality/localized-attributes.test.mjs` + - `npm --prefix web test -- --runInBand --testPathPatterns='i18n|locale-coverage'` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T10.2: Localize settings and stream editor attributes +- **depends_on**: [T10.1] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/SettingsView.jsx`, `web/js/components/preact/StreamConfigModal.jsx`, `web/js/components/preact/settings/DetectionTab.jsx`, `web/js/components/preact/settings/Go2rtcTab.jsx`, `web/js/components/preact/settings/StorageTab.jsx`, `quality/evidence/T10.2.md`. +- **description**: Replace the nine newly exposed literals in five settings files with T10.1 keys. Remove redundant English fallback for the existing settings.tabsLabel key. Preserve dynamic bucket interpolation and full multiline URL/config examples, handlers, field values and disabled-state logic. +- **acceptance_criteria**: + - All reported attribute literals in these five files pass the strengthened i18n rule with unchanged baseline counts. + - Example URL schemes, credentials-as-examples, protocol options, whitespace/newlines and storage bucket interpolation remain accurate. + - No strings are moved to helper constants merely to evade AST inspection. +- **validation**: + - `node --test tests/quality/localized-attributes.test.mjs` + - `(cd web && node_modules/.bin/eslint js/components/preact/SettingsView.jsx js/components/preact/StreamConfigModal.jsx js/components/preact/settings/DetectionTab.jsx js/components/preact/settings/Go2rtcTab.jsx js/components/preact/settings/StorageTab.jsx)` + - `npm --prefix web test -- --runInBand --testPathPatterns='i18n|locale-coverage|go2rtcSettings'` +- **status**: Not Completed +- **log**: +- **files edited/created**: + +### T10.3: Localize live and recording attributes and close lint integration +- **depends_on**: [T10.2] +- **agent_type**: worker +- **ownership**: `web/js/components/preact/live/LiveBuildingPlan.jsx`, `web/js/components/preact/live/PlanSketchControls.jsx`, `web/js/components/preact/recordings/RecordingsGrid.jsx`, `web/js/components/preact/recordings/RecordingsTable.jsx`, `web/js/components/preact/recordings/TagsOverlay.jsx`, `quality/evidence/T10.3.md`. +- **description**: Replace remaining newly detected attribute literals with T10.1 keys and existing download/protection keys. Obtain i18n in TagChip at component top level, preserve callback and focus behavior, and preserve count/singular/plural and filename/size interpolation. Run final whole-tree lint and compatibility tests after serial source fixes. +- **acceptance_criteria**: + - No new i18n errors remain; the 897 existing accessibility warnings stay explicit rather than being suppressed or rebaselined. + - Labels retain the stream/plan/tag/count/size values and shortcut information; existing action handlers remain unchanged. + - T10 compatibility tests and relevant localization/live/recording regressions pass; baseline JSON bytes remain unchanged. +- **validation**: + - `node --test tests/quality/lint-compat.test.mjs tests/quality/localized-attributes.test.mjs` + - `npm --prefix web run lint` + - `npm --prefix web test -- --runInBand --testPathPatterns='i18n|locale-coverage|planSketch|buildingPlan|recording|tag'` +- **status**: Not Completed +- **log**: +- **files edited/created**: diff --git a/quality/evidence/T10.md b/quality/evidence/T10.md new file mode 100644 index 000000000..62e4cca6b --- /dev/null +++ b/quality/evidence/T10.md @@ -0,0 +1,52 @@ +# T10 — Lint identity and typed AST compatibility + +Implemented the lint foundation; full lint closure is explicitly assigned to +T10.1–T10.3 because the stronger detector exposed 21 existing untranslated +attribute/interpolation literals. T14/T15 and overlapping T7 repair owners must +wait for the appropriate children; no allowance was enlarged to conceal them. + +## Changes + +- Existing baseline keys are canonicalized by removing only `.js`, `.jsx`, `.ts` + or `.tsx`. Allowance counts remain byte-for-byte unchanged. Duplicate canonical + baseline keys fail configuration instead of creating two allowances. +- A first-party source identity may have only one implementation. A temporary JS + sibling is permitted only with `@ts-check`, no suppression directives and a + body composed solely of re-exports from its same-name typed sibling. The + migration/typecheck integrator must still ensure each bridge participates in + compiler checking; the lint rule proves bridge structure, not tsconfig coverage. +- TS expression wrappers, visible attribute expressions, nested template + interpolation, array children and sequence results are inspected for visible + strings. Translated calls and non-visible API/class attributes remain outside + this intentionally syntax-based rule. This is not whole-program string-flow + analysis. +- TS/TSX first-party modules now enforce hooks ordering/dependencies, + accessibility, explicit-any bans and TS suppression bans as errors. Inline + ESLint configuration cannot turn these checks off in migrated source. Legacy + accessibility warnings remain explicit. + +## RED → GREEN evidence + +`node --test tests/quality/lint-compat.test.mjs` initially had **23 failures out +of 27**: rename allowance, typed children/attributes, hooks/a11y severity, type +escapes and duplicate-source cases. Four preserved-behavior controls passed. +The first implementation reached 26/27; the checked bridge control caught use +of an unavailable parser method (`parse` instead of `parseForESLint().ast`). +Correcting that reached 27/27 without weakening the control. An additional test +then proved inline `eslint-disable` could bypass migrated type enforcement; +`noInlineConfig` fixed that final RED case. Final result: **28/28 passing**. + +Raw logs: `build/eng-artifacts/T10/{red,red-inline,green}.log` (ignored). + +`npm --prefix web run lint` and the JSON-report equivalent run truthfully exit +1: **21 new localization errors and the unchanged 897 accessibility warnings**. +These are pre-existing source strings previously missed by attribute/template +inspection, not new UI edits. The ten affected files, exact literals and lines +are in `build/eng-artifacts/T10/eslint.json`; full bounded correction records are +in `quality/evidence/T10-expansion.md`. T10's lint integration is not yet green. + +Baseline SHA-256 before and after: +`6c2869999c1a295aa4c81c2c192bce0a8ee246d21e02f5803a2f8b858519da2f`. +No package, lockfile, production UI, locale catalog or source baseline file was +changed by this foundation task. Tests use temporary directories outside the +checkout for duplicate implementations and remove them after each case. diff --git a/tests/quality/lint-compat.test.mjs b/tests/quality/lint-compat.test.mjs new file mode 100644 index 000000000..f4c33ebce --- /dev/null +++ b/tests/quality/lint-compat.test.mjs @@ -0,0 +1,128 @@ +import assert from 'node:assert/strict'; +import { mkdtemp, mkdir, writeFile, rm } from 'node:fs/promises'; +import os from 'node:os'; +import path from 'node:path'; +import { createRequire } from 'node:module'; +import { fileURLToPath } from 'node:url'; +import test from 'node:test'; +import config from '../../web/eslint.config.js'; + +const web = fileURLToPath(new URL('../../web/', import.meta.url)); +const require = createRequire(new URL('../../web/package.json', import.meta.url)); +const { ESLint } = require('eslint'); +const lint = new ESLint({ cwd: web, overrideConfigFile: true, overrideConfig: config }); +const literalRule = 'lightnvr-i18n/no-literal-ui-string'; +const duplicateRule = 'lightnvr-source/no-duplicate-implementation'; +async function messages(source, filename = 'js/components/preact/T10Probe.tsx') { + return (await lint.lintText(source, { filePath: path.join(web, filename) }))[0].messages; +} +function forRule(result, rule) { return result.filter((message) => message.ruleId === rule); } + +for (const extension of ['jsx', 'tsx']) { + test(`${extension} retains the Footer allowance exactly once`, async () => { + const filename = `js/components/preact/Footer.${extension}`; + assert.equal(forRule(await messages('export const Footer = () =>
LightNVR ©
;', filename), literalRule).length, 0); + const result = await messages('export const Footer = () =>
LightNVR ©LightNVR ©
;', filename); + assert.equal(forRule(result, literalRule).length, 1); + }); +} + +for (const expression of [ + "('Untranslated greeting' as string)", + "('Untranslated greeting' satisfies string)", + "('Untranslated greeting' as string)!", + "(true ? ('Untranslated greeting' as string) : t('key'))", + "`${('Untranslated greeting' as string)}`", + "[('Untranslated greeting' as string)]", +]) { + test(`typed JSX child is checked: ${expression}`, async () => { + const result = await messages(`export const View = () =>
{${expression}}
;`); + assert.equal(forRule(result, literalRule).length, 1, JSON.stringify(result)); + }); +} + +for (const attribute of ['title', 'aria-label', 'placeholder', 'alt']) { + test(`typed visible attribute ${attribute} is checked`, async () => { + const result = await messages(`export const View = () => ;`); + assert.equal(forRule(result, literalRule).length, 1); + }); +} + +test('translated calls and non-visible strings remain allowed', async () => { + const result = await messages("export const View = () =>
{t('message')}
;"); + assert.equal(forRule(result, literalRule).length, 0); +}); + +test('nested wrapper occurrences consume the same canonical allowance', async () => { + const result = await messages("export const Footer = () =>
{('LightNVR ©' as string)}{('LightNVR ©' satisfies string)}
;", 'js/components/preact/Footer.tsx'); + assert.equal(forRule(result, literalRule).length, 1); +}); + +test('TSX hook order and accessibility violations are blocking', async () => { + const result = await messages("import {useState} from 'preact/hooks'; export function View({enabled}: {enabled: boolean}) { if(enabled) useState(0); return ; }"); + assert.equal(forRule(result, 'react-hooks/rules-of-hooks')[0]?.severity, 2, JSON.stringify(result)); + assert.equal(forRule(result, 'jsx-a11y/alt-text')[0]?.severity, 2); +}); + +test('TSX missing effect dependencies are blocking', async () => { + const result = await messages("import {useEffect} from 'preact/hooks'; export function View({value}: {value: string}) { useEffect(() => { console.log(value); }, []); return null; }"); + assert.equal(forRule(result, 'react-hooks/exhaustive-deps')[0]?.severity, 2, JSON.stringify(result)); +}); + +test('legacy accessibility remains visible at warning severity', async () => { + const result = await messages("export const View = () => ;", 'js/components/preact/T10Probe.jsx'); + assert.equal(forRule(result, 'jsx-a11y/alt-text')[0]?.severity, 1); +}); + +test('explicit any is blocked in migrated source', async () => { + const result = await messages('export const decode = (value: any) => value;', 'js/api/T10Probe.ts'); + assert.equal(forRule(result, '@typescript-eslint/no-explicit-any')[0]?.severity, 2); +}); + +for (const directive of ['ts-nocheck', 'ts-ignore', 'ts-expect-error']) { + test(`@${directive} cannot bypass migrated checks`, async () => { + const result = await messages(`// @${directive}\nexport const number: number = 'invalid';`, 'js/api/T10Probe.ts'); + assert.equal(forRule(result, '@typescript-eslint/ban-ts-comment')[0]?.severity, 2); + }); +} + +async function siblings(files, callback) { + const root = await mkdtemp(path.join(os.tmpdir(), 'lightnvr-t10-')); + try { + const dir = path.join(root, 'js', 'components'); + await mkdir(dir, { recursive: true }); + for (const [name, body] of Object.entries(files)) await writeFile(path.join(dir, name), body); + const eslint = new ESLint({ cwd: root, overrideConfigFile: true, overrideConfig: config }); + await callback((await eslint.lintFiles(Object.keys(files).map((name) => path.join(dir, name)))).flatMap((result) => result.messages)); + } finally { await rm(root, { recursive: true, force: true }); } +} + +test('coexisting JS and TS implementations cannot double their identity', async () => { + await siblings({ 'Probe.jsx': 'export const value = 1;', 'Probe.tsx': 'export const value = 2;' }, (result) => { + assert.ok(forRule(result, duplicateRule).length >= 1, JSON.stringify(result)); + }); +}); + +test('a checked same-module JS re-export bridge is permitted', async () => { + await siblings({ 'Probe.js': '// @ts-check\nexport { value } from "./Probe.ts";', 'Probe.ts': 'export const value = 1;' }, (result) => { + assert.equal(forRule(result, duplicateRule).length, 0, JSON.stringify(result)); + }); +}); + +for (const bridge of [ + 'export { value } from "./Probe.ts";', + '// @ts-check\nexport { value } from "./Other.ts";', + '// @ts-check\nexport { value } from "./Probe.ts"; export const duplicate = 2;', + '// @ts-check\n// @ts-nocheck\nexport { value } from "./Probe.ts";', +]) { + test(`an unchecked or implementing bridge is rejected: ${bridge}`, async () => { + await siblings({ 'Probe.js': bridge, 'Probe.ts': 'export const value = 1;' }, (result) => { + assert.ok(forRule(result, duplicateRule).length >= 1, JSON.stringify(result)); + }); + }); +} + +test('inline eslint disabling cannot hide a migrated type escape', async () => { + const result = await messages('/* eslint-disable @typescript-eslint/no-explicit-any */\nexport const decode = (value: any) => value;', 'js/api/T10Probe.ts'); + assert.equal(forRule(result, '@typescript-eslint/no-explicit-any')[0]?.severity, 2); +}); diff --git a/web/eslint-rules/no-duplicate-implementation.js b/web/eslint-rules/no-duplicate-implementation.js new file mode 100644 index 000000000..a019cfe97 --- /dev/null +++ b/web/eslint-rules/no-duplicate-implementation.js @@ -0,0 +1,18 @@ +import { duplicateImplementations } from './source-identity.js'; + +export default { + meta: { + type: 'problem', + docs: { description: 'Reject multiple implementations of one extension-independent module identity' }, + schema: [], + messages: { duplicate: 'Duplicate module implementations: {{files}}. Keep one implementation; a JS bridge must use @ts-check and only re-export its typed sibling.' }, + }, + create(context) { + return { + Program(node) { + const duplicates = duplicateImplementations(context.filename); + if (duplicates.length) context.report({ node, messageId: 'duplicate', data: { files: duplicates.join(', ') } }); + }, + }; + }, +}; diff --git a/web/eslint-rules/no-literal-ui-string.js b/web/eslint-rules/no-literal-ui-string.js index 3ca92ce6e..24630c22e 100644 --- a/web/eslint-rules/no-literal-ui-string.js +++ b/web/eslint-rules/no-literal-ui-string.js @@ -1,12 +1,14 @@ import fs from 'node:fs'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; +import { canonicalAllowances, sourceIdentity } from './source-identity.js'; -const baseline = JSON.parse(fs.readFileSync(new URL('../i18n-literal-baseline.json', import.meta.url), 'utf8')); +const baseline = canonicalAllowances(JSON.parse(fs.readFileSync(new URL('../i18n-literal-baseline.json', import.meta.url), 'utf8'))); const componentsRoot = fileURLToPath(new URL('../js/components/', import.meta.url)); const visibleAttributes = new Set(['title', 'aria-label', 'placeholder', 'alt']); function candidate(value) { + if (typeof value !== 'string') return null; const normalized = value.replace(/\s+/g, ' ').trim(); return /[A-Za-z]/.test(normalized) ? normalized : null; } @@ -16,7 +18,14 @@ function candidate(value) { function expressionStrings(node) { if (!node) return []; if (node.type === 'Literal' && typeof node.value === 'string') return [node.value]; - if (node.type === 'TemplateLiteral') return node.quasis.map((part) => part.value.cooked || ''); + if (['TSAsExpression', 'TSTypeAssertion', 'TSNonNullExpression', 'TSSatisfiesExpression', 'ChainExpression'].includes(node.type)) { + return expressionStrings(node.expression); + } + if (node.type === 'TemplateLiteral') { + return [...node.quasis.map((part) => part.value.cooked || ''), ...node.expressions.flatMap(expressionStrings)]; + } + if (node.type === 'ArrayExpression') return node.elements.flatMap(expressionStrings); + if (node.type === 'SequenceExpression') return expressionStrings(node.expressions.at(-1)); if (node.type === 'ConditionalExpression') { return [...expressionStrings(node.consequent), ...expressionStrings(node.alternate)]; } @@ -35,7 +44,7 @@ export default { }, create(context) { const file = path.relative(componentsRoot, context.filename).replaceAll(path.sep, '/'); - const allowed = baseline[file] || {}; + const allowed = baseline.get(sourceIdentity(file)) || {}; const seen = new Map(); function check(node, text) { @@ -51,8 +60,10 @@ export default { return { JSXText(node) { check(node, node.value); }, JSXAttribute(node) { - if (visibleAttributes.has(node.name.name) && node.value?.type === 'Literal') { - check(node, node.value.value); + if (!visibleAttributes.has(node.name.name)) return; + if (node.value?.type === 'Literal') check(node, node.value.value); + if (node.value?.type === 'JSXExpressionContainer') { + for (const value of expressionStrings(node.value.expression)) check(node, value); } }, JSXExpressionContainer(node) { diff --git a/web/eslint-rules/source-identity.js b/web/eslint-rules/source-identity.js new file mode 100644 index 000000000..e6d701f98 --- /dev/null +++ b/web/eslint-rules/source-identity.js @@ -0,0 +1,54 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import tseslint from 'typescript-eslint'; + +const extensions = ['.js', '.jsx', '.ts', '.tsx']; + +// Extensions describe the compiler, not a new implementation or allowance. +export function sourceIdentity(filename) { + return filename.replaceAll(path.sep, '/').replace(/\.[jt]sx?$/, ''); +} + +export function canonicalAllowances(baseline) { + const result = new Map(); + for (const [filename, counts] of Object.entries(baseline)) { + const identity = sourceIdentity(filename); + if (result.has(identity)) throw new Error(`Duplicate i18n baseline identity: ${identity}`); + result.set(identity, counts); + } + return result; +} + +function checkedReExport(filename, siblings) { + if (!/\.jsx?$/.test(filename)) return false; + try { + const ast = tseslint.parser.parseForESLint(fs.readFileSync(filename, 'utf8'), { + filePath: filename, + sourceType: 'module', + ecmaVersion: 'latest', + ecmaFeatures: { jsx: true }, + comment: true, + }).ast; + const comments = ast.comments || []; + if (!comments.some(({ value }) => /^\s*@ts-check\b/.test(value))) return false; + if (comments.some(({ value }) => /@ts-(?:nocheck|ignore|expect-error)\b/.test(value))) return false; + return ast.body.length > 0 && ast.body.every((statement) => { + if (!['ExportNamedDeclaration', 'ExportAllDeclaration'].includes(statement.type) + || statement.declaration || typeof statement.source?.value !== 'string') return false; + const target = path.resolve(path.dirname(filename), statement.source.value); + return /\.tsx?$/.test(target) && siblings.includes(target) + && sourceIdentity(filename) === sourceIdentity(target); + }); + } catch { + // A broken or unreadable sibling cannot be treated as a safe bridge. + return false; + } +} + +export function duplicateImplementations(filename) { + const identity = filename.replace(/\.[jt]sx?$/, ''); + const siblings = extensions.map((extension) => identity + extension).filter((file) => fs.existsSync(file)); + if (siblings.length < 2) return []; + const implementations = siblings.filter((file) => !checkedReExport(file, siblings)); + return implementations.length > 1 ? implementations : []; +} diff --git a/web/eslint.config.js b/web/eslint.config.js index bac0acb3b..2e12ac919 100644 --- a/web/eslint.config.js +++ b/web/eslint.config.js @@ -2,14 +2,14 @@ * ESLint configuration for the LightNVR web UI. * * Adds eslint-plugin-jsx-a11y (recommended ruleset) as part of the WCAG 2.2 AA - * audit in https://github.com/opensensor/lightNVR/issues/647. All rules start - * in warn mode so CI reports violations without failing the build; switch rules - * to error as each finding category in the issue is closed. + * audit in https://github.com/opensensor/lightNVR/issues/647. Legacy JS findings remain warnings recorded in the findings inventory. + * Migrated TS/TSX sources enforce accessibility, hooks and type-escape rules. */ import tseslint from 'typescript-eslint'; import jsxA11y from 'eslint-plugin-jsx-a11y'; import reactHooks from 'eslint-plugin-react-hooks'; import noLiteralUiString from './eslint-rules/no-literal-ui-string.js'; +import noDuplicateImplementation from './eslint-rules/no-duplicate-implementation.js'; const recommendedRules = jsxA11y.flatConfigs.recommended.rules; @@ -28,7 +28,11 @@ export default [ // this a11y lint; don't flag them as unused here. reportUnusedDisableDirectives: 'off', }, - plugins: { 'jsx-a11y': jsxA11y, 'react-hooks': reactHooks }, + plugins: { + 'jsx-a11y': jsxA11y, + 'react-hooks': reactHooks, + 'lightnvr-source': { rules: { 'no-duplicate-implementation': noDuplicateImplementation } }, + }, languageOptions: { ...jsxA11y.flatConfigs.recommended.languageOptions, sourceType: 'module', @@ -40,6 +44,7 @@ export default [ }, rules: { ...a11yWarnRules, + 'lightnvr-source/no-duplicate-implementation': 'error', // The plugin is registered only so pre-existing targeted // eslint-disable-next-line comments referencing react-hooks rules // resolve; its rules stay off while this config tracks the a11y audit. @@ -58,5 +63,15 @@ export default [ files: ['js/**/*.{ts,tsx}'], languageOptions: { parser: tseslint.parser }, plugins: { '@typescript-eslint': tseslint.plugin }, + linterOptions: { noInlineConfig: true, reportUnusedDisableDirectives: 'error' }, + rules: { + ...Object.fromEntries(Object.keys(recommendedRules).map((name) => [name, 'error'])), + 'react-hooks/rules-of-hooks': 'error', + 'react-hooks/exhaustive-deps': 'error', + '@typescript-eslint/no-explicit-any': 'error', + '@typescript-eslint/ban-ts-comment': ['error', { + 'ts-check': false, 'ts-nocheck': true, 'ts-ignore': true, 'ts-expect-error': true, + }], + }, }, ]; From a69d3bad8efb91cc40457cb799147875aa7058c7 Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Sat, 31 Oct 2026 03:46:53 -0400 Subject: [PATCH 026/230] T10.1: add catalog keys for uncovered visible attributes --- quality/evidence/T10.1.md | 20 ++++++++ tests/quality/localized-attributes.test.mjs | 51 +++++++++++++++++++++ web/public/locales/en.json | 16 ++++++- 3 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 quality/evidence/T10.1.md create mode 100644 tests/quality/localized-attributes.test.mjs diff --git a/quality/evidence/T10.1.md b/quality/evidence/T10.1.md new file mode 100644 index 000000000..352dd908a --- /dev/null +++ b/quality/evidence/T10.1.md @@ -0,0 +1,20 @@ +# T10.1 — Attribute translation catalog and regression fixtures + +Added 14 English keys for the newly detected labels and technical placeholders. +Existing download, protection and settings-section translations are reused. +Other locale catalogs retain the established English fallback for these new +keys; they were not padded with English copies or unreviewed translations. + +RED: `node --test tests/quality/localized-attributes.test.mjs` failed both tests +because new keys rendered as raw key names. GREEN after catalog addition: 2/2. +The tests call the real i18n loader and formatter with deterministic catalog +responses, covering interpolation, quoted tags, singular/plural counts, +multiline camera/config examples, shortcuts and partial-locale fallback without +replacing already localized settings labels. + +`npm --prefix web test -- --runInBand --testPathPatterns='i18n|locale-coverage'`: +2 suites, 35 tests passed. Existing catalog policy permits missing keys with +English fallback; this result does not claim these 14 strings were translated +into all supported languages. No baseline allowances changed. + +Raw RED and catalog test output is in `build/eng-artifacts/T10/`. diff --git a/tests/quality/localized-attributes.test.mjs b/tests/quality/localized-attributes.test.mjs new file mode 100644 index 000000000..e9a71401b --- /dev/null +++ b/tests/quality/localized-attributes.test.mjs @@ -0,0 +1,51 @@ +import assert from 'node:assert/strict'; +import { readFileSync } from 'node:fs'; +import test from 'node:test'; +import { __resetI18nStateForTests, setLocalePreference, t } from '../../web/js/i18n.js'; + +const english = JSON.parse(readFileSync(new URL('../../web/public/locales/en.json', import.meta.url), 'utf8')); +const examples = [ + ['streamsConfig.go2rtcSourcePlaceholder', {}, 'rtsp://admin:pass@camera/stream#transport=tcp\n\nOr multi-source:\n- rtsp://admin:pass@camera/main#transport=tcp\n- ffmpeg:camera1#video=h264#hardware'], + ['settings.apiDetectionDoodsPlaceholder', {}, 'http://localhost:8080/detect'], + ['settings.apiDetectionOnnxPlaceholder', {}, 'http://localhost:8000/api/v1/detect'], + ['settings.go2rtcOverridePlaceholder', {}, 'ffmpeg:\n h264_hw: "-codec:v h264_v4l2m2m"\n\nlog:\n level: trace'], + ['settings.storageTargets.objectRootPlaceholder', { bucket: 'front-door-archive' }, 's3://front-door-archive/instance'], + ['settings.storageTargets.localRootPlaceholder', {}, '/mnt/nvr-hot-01'], + ['settings.storageTargets.bucketPlaceholder', {}, 'bucket'], + ['live.plan.canvasLabel', { name: 'Floor 2' }, 'Floor 2 camera plan'], + ['live.plan.sketch.undoShortcut', {}, 'Undo drawing (Ctrl+Z)'], + ['live.plan.sketch.redoShortcut', {}, 'Redo drawing (Ctrl+Shift+Z)'], + ['recordings.thumbnailAlt', { stream: 'Front entrance' }, 'Front entrance recording'], + ['recordings.detectionCountOne', { count: 1 }, '1 detection'], + ['recordings.detectionCountMany', { count: 4 }, '4 detections'], + ['recordings.removeTagTitle', { tag: 'front "entrance"' }, 'Remove tag "front "entrance""'], +]; + +async function load(context, locale) { + __resetI18nStateForTests(); + context.mock.method(globalThis, 'fetch', async (url) => ({ + ok: true, + async json() { + if (url.endsWith('/manifest.json')) return { locales: [{ code: 'en' }, { code: 'fr' }] }; + if (url.endsWith('/en.json')) return english; + if (url.endsWith('/fr.json')) return { 'settings.tabsLabel': 'Sections des paramètres' }; + throw new Error(`Unexpected locale URL ${url}`); + }, + })); + await setLocalePreference(locale); + context.after(() => __resetI18nStateForTests()); +} + +test('attribute keys preserve interpolation, plural labels and technical examples', async (context) => { + await load(context, 'en'); + for (const [key, params, expected] of examples) assert.equal(t(key, params), expected, key); + assert.equal(t('recordings.download'), 'Download'); + assert.equal(t('recordings.protect'), 'Protect recording'); + assert.equal(t('recordings.unprotect'), 'Unprotect recording'); +}); + +test('partial locale uses English attribute fallback without losing localized existing keys', async (context) => { + await load(context, 'fr'); + for (const [key, params, expected] of examples) assert.equal(t(key, params), expected, key); + assert.equal(t('settings.tabsLabel'), 'Sections des paramètres'); +}); diff --git a/web/public/locales/en.json b/web/public/locales/en.json index 53599f78c..bfabe674c 100644 --- a/web/public/locales/en.json +++ b/web/public/locales/en.json @@ -2865,5 +2865,19 @@ "lpr.error.searchForbidden": "You do not have permission to search plates for this camera.", "lpr.error.cameras": "Could not load cameras.", "lpr.error.deleteFailed": "Could not delete the plate read.", - "lpr.error.generic": "The plate search failed. Try again." + "lpr.error.generic": "The plate search failed. Try again.", + "streamsConfig.go2rtcSourcePlaceholder": "rtsp://admin:pass@camera/stream#transport=tcp\n\nOr multi-source:\n- rtsp://admin:pass@camera/main#transport=tcp\n- ffmpeg:camera1#video=h264#hardware", + "settings.apiDetectionDoodsPlaceholder": "http://localhost:8080/detect", + "settings.apiDetectionOnnxPlaceholder": "http://localhost:8000/api/v1/detect", + "settings.go2rtcOverridePlaceholder": "ffmpeg:\n h264_hw: \"-codec:v h264_v4l2m2m\"\n\nlog:\n level: trace", + "settings.storageTargets.objectRootPlaceholder": "s3://{bucket}/instance", + "settings.storageTargets.localRootPlaceholder": "/mnt/nvr-hot-01", + "settings.storageTargets.bucketPlaceholder": "bucket", + "live.plan.canvasLabel": "{name} camera plan", + "live.plan.sketch.undoShortcut": "Undo drawing (Ctrl+Z)", + "live.plan.sketch.redoShortcut": "Redo drawing (Ctrl+Shift+Z)", + "recordings.thumbnailAlt": "{stream} recording", + "recordings.detectionCountOne": "{count} detection", + "recordings.detectionCountMany": "{count} detections", + "recordings.removeTagTitle": "Remove tag \"{tag}\"" } From f2b93b680ced1b5dc5847cee1fe1ca16e1b76aa2 Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Sat, 31 Oct 2026 03:47:22 -0400 Subject: [PATCH 027/230] T10.2: localize settings and stream editor attribute text --- quality/evidence/T10.2.md | 18 ++++++++++++++++++ web/js/components/preact/SettingsView.jsx | 2 +- web/js/components/preact/StreamConfigModal.jsx | 2 +- .../preact/settings/DetectionTab.jsx | 2 +- .../components/preact/settings/Go2rtcTab.jsx | 2 +- .../components/preact/settings/StorageTab.jsx | 2 +- 6 files changed, 23 insertions(+), 5 deletions(-) create mode 100644 quality/evidence/T10.2.md diff --git a/quality/evidence/T10.2.md b/quality/evidence/T10.2.md new file mode 100644 index 000000000..266381119 --- /dev/null +++ b/quality/evidence/T10.2.md @@ -0,0 +1,18 @@ +# T10.2 — Settings and stream-editor attribute localization + +Replaced the nine detected strings across SettingsView, StreamConfigModal and +Detection/Go2rtc/Storage settings tabs with T10.1 catalog calls. Removed the +redundant English fallback for the existing settings.tabsLabel key. Bucket +interpolation, URL/config examples, multiline whitespace, input values and +handlers are preserved. Only five JSX attribute expressions changed. + +RED was the T10 lint run: nine errors in these files. The exact scoped ESLint +command in the plan now exits 0 with **0 errors and 256 pre-existing a11y +warnings**. No suppressions or baseline changes were used. + +- `node --test tests/quality/localized-attributes.test.mjs`: 2/2 pass. +- `npm --prefix web test -- --runInBand --testPathPatterns='i18n|locale-coverage|go2rtcSettings'`: + 3 suites / 41 tests pass. + +Logs: `build/eng-artifacts/T10/{settings-lint,settings-tests}.log`. +Full lint remains dependent on T10.3's remaining live/recordings literals. diff --git a/web/js/components/preact/SettingsView.jsx b/web/js/components/preact/SettingsView.jsx index 1e1ec81bf..14a36e3b5 100644 --- a/web/js/components/preact/SettingsView.jsx +++ b/web/js/components/preact/SettingsView.jsx @@ -879,7 +879,7 @@ export function SettingsView() { Desktop: vertical pill list. */}
{tabs.map((tab) => { diff --git a/web/js/components/preact/StreamConfigModal.jsx b/web/js/components/preact/StreamConfigModal.jsx index fae897f8c..694db3be9 100644 --- a/web/js/components/preact/StreamConfigModal.jsx +++ b/web/js/components/preact/StreamConfigModal.jsx @@ -1655,7 +1655,7 @@ export function StreamConfigModal({ name="go2rtcSourceOverride" className="w-full px-3 py-2 border border-input rounded-md shadow-sm focus:ring-2 focus:ring-primary bg-background text-foreground font-mono text-sm" rows="4" - placeholder={"rtsp://admin:pass@camera/stream#transport=tcp\n\nOr multi-source:\n- rtsp://admin:pass@camera/main#transport=tcp\n- ffmpeg:camera1#video=h264#hardware"} + placeholder={t('streamsConfig.go2rtcSourcePlaceholder')} value={currentStream.go2rtcSourceOverride || ''} onChange={onInputChange} /> diff --git a/web/js/components/preact/settings/DetectionTab.jsx b/web/js/components/preact/settings/DetectionTab.jsx index fd802a769..2f0be4053 100644 --- a/web/js/components/preact/settings/DetectionTab.jsx +++ b/web/js/components/preact/settings/DetectionTab.jsx @@ -66,7 +66,7 @@ export function DetectionTab({ settings, handleInputChange, handleThresholdChang value={settings.apiDetectionUrl} onChange={handleInputChange} disabled={!canModifySettings} - placeholder={isDoods2 ? 'http://localhost:8080/detect' : 'http://localhost:8000/api/v1/detect'} + placeholder={t(isDoods2 ? 'settings.apiDetectionDoodsPlaceholder' : 'settings.apiDetectionOnnxPlaceholder')} /> {isDoods2 ? t('settings.apiDetectionUrlHelpDoods2') : t('settings.apiDetectionUrlHelp')} diff --git a/web/js/components/preact/settings/Go2rtcTab.jsx b/web/js/components/preact/settings/Go2rtcTab.jsx index ad0df31e9..9c81e3769 100644 --- a/web/js/components/preact/settings/Go2rtcTab.jsx +++ b/web/js/components/preact/settings/Go2rtcTab.jsx @@ -495,7 +495,7 @@ export function Go2rtcTab({ settings, setSettings, handleInputChange, canModifyS onBlur={handleOverrideBlur} disabled={!canModifySettings} maxLength={GO2RTC_OVERRIDE_MAX_BYTES} - placeholder={"ffmpeg:\n h264_hw: \"-codec:v h264_v4l2m2m\"\n\nlog:\n level: trace"} + placeholder={t('settings.go2rtcOverridePlaceholder')} /> {/* Size indicator */} diff --git a/web/js/components/preact/settings/StorageTab.jsx b/web/js/components/preact/settings/StorageTab.jsx index fbb0a6cb2..b0ffda5e2 100644 --- a/web/js/components/preact/settings/StorageTab.jsx +++ b/web/js/components/preact/settings/StorageTab.jsx @@ -141,7 +141,7 @@ function StorageTargetEditor({ value, onChange, onCancel, onSave, busy, t }) {