feat(mcp): T5-2 — embedded MCP scaffold (audit-first)#195
Merged
Conversation
lusoris
pushed a commit
that referenced
this pull request
Apr 29, 2026
Resolves PR #195 CI failures: - Doc-Substance Gate (ADR-0167): meson_options.txt added 4 enable_mcp* options without matching docs/development/build-flags.md edit. This commit adds the four rows pointing at ADR-0209 + docs/mcp/embedded.md. - Assertion Density (Power of 10 §5): vmaf_mcp_transport_available was 22 lines with 0 asserts. Adds an assert on the input-bound contract ((unsigned)transport <= 31u) which the function already validates before reading the bitmask. Self-documenting precondition + satisfies the JPL >=1 assert per >=20-line function rule. No behaviour change (assert disables under NDEBUG; the existing explicit bound check still rejects out-of-range transports at runtime). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Audit-first scaffold for the in-process MCP server declared by ADR-0128 + Research-0005. Public header, stub TU returning -ENOSYS on every entry point, build-flag wiring (umbrella + three per-transport sub-flags, all default false), 12-sub-test smoke pinning the -ENOSYS + NULL-guard contract, and user-facing doc. Same audit-first shape as ADR-0175 (Vulkan T5-1) and ADR-0184 (T7-29 part 1): land the static surfaces so the T5-2b runtime PR (cJSON + mongoose vendoring, dedicated MCP pthread, SPSC ring buffer, SSE / UDS / stdio transport bodies) has a stable base. Verified: meson setup -Denable_mcp=false → 37/37 tests pass; meson setup --reconfigure -Denable_mcp=true (+ all three sub-flags) → 38/38 tests pass; clang-tidy -p build-cpu on libvmaf/src/mcp/mcp.c clean. Closes T5-2 (audit half). T5-2b follows. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Resolves PR #195 CI failures: - Doc-Substance Gate (ADR-0167): meson_options.txt added 4 enable_mcp* options without matching docs/development/build-flags.md edit. This commit adds the four rows pointing at ADR-0209 + docs/mcp/embedded.md. - Assertion Density (Power of 10 §5): vmaf_mcp_transport_available was 22 lines with 0 asserts. Adds an assert on the input-bound contract ((unsigned)transport <= 31u) which the function already validates before reading the bitmask. Self-documenting precondition + satisfies the JPL >=1 assert per >=20-line function rule. No behaviour change (assert disables under NDEBUG; the existing explicit bound check still rejects out-of-range transports at runtime). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
adb88f1 to
fbb184b
Compare
lusoris
pushed a commit
that referenced
this pull request
Apr 29, 2026
PRs #195 (T5-2 MCP scaffold), #199 (this PR), #200 (T7-10 HIP), #201 (T7-38 SVE2) all independently picked ADR-0209. #195 opened first and keeps it; this PR (T6-9 model registry + Sigstore) rebases onto current master and renames to ADR-0211. References updated across CHANGELOG, AGENTS, security.md, model-registry.md, README, schema, vmaf.c, cli_parse.h, test_tiny_model_verify.c, model_loader.{c,h}, dnn.h, rebase-notes. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
lusoris
pushed a commit
that referenced
this pull request
Apr 29, 2026
PRs #195 (T5-2 MCP scaffold), #199 (this PR), #200 (T7-10 HIP), first and keeps it; this PR (T6-9 model registry + Sigstore) rebases onto current master and renames to ADR-0211. References updated across CHANGELOG, AGENTS, security.md, model-registry.md, README, schema, vmaf.c, cli_parse.h, test_tiny_model_verify.c, model_loader.{c,h}, dnn.h, rebase-notes. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
lusoris
added a commit
that referenced
this pull request
Apr 29, 2026
…#199) * feat(ai): T6-9 — model registry schema + Sigstore --tiny-model-verify Formalize model/tiny/registry.json with a JSON Schema (Draft 2020-12) extended with license + Sigstore-bundle metadata, and wire the previously-stubbed --tiny-model-verify CLI flag through to `cosign verify-blob` via posix_spawnp(3p). Both halves operate on the same registry surface; landing them together avoids a schema flip-flop. Implements ADR-0209. - model/tiny/registry.schema.json: schema_version bumps to 1; new optional license, license_url, sigstore_bundle, description fields. - model/tiny/registry.json: every entry gains license metadata (BSD-3-Clause-Plus-Patent for fork-trained, BSD-2-Clause for the upstream LPIPS-Sq export) and a sigstore_bundle path; bundles themselves are populated at release time. - ai/scripts/validate_model_registry.py: jsonschema-backed validator with structural-fallback for distros without python-jsonschema; cross-file consistency (sha256 match, sidecar presence, bundle path shape). New CI lane in .github/workflows/lint-and-format.yml. - libvmaf/src/dnn/model_loader.{c,h}: new vmaf_dnn_verify_signature(); parses the registry inline (no JSON dep), spawns cosign via posix_spawnp (system(3) is and stays banned). Public declaration in libvmaf/include/libvmaf/dnn.h. - libvmaf/tools/cli_parse.{c,h}, vmaf.c: --tiny-model-verify flag + tiny_model_verify settings field; CLI calls the verifier before model load and exits non-zero on any failure. - Tests: python/test/model_registry_schema_test.py (10 cases) + libvmaf/test/dnn/test_tiny_model_verify.c (5 failure-mode cases on Unix; ENOSYS smoke on Windows). - Docs: new docs/ai/model-registry.md; docs/ai/inference.md gains a --tiny-model-verify row; docs/ai/security.md Layer 4 updated. - CHANGELOG, AGENTS invariant, rebase-notes 0074, ADR index row. Closes T6-9. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(docs): renumber ADR-0209 → ADR-0211 to avoid 4-way collision PRs #195 (T5-2 MCP scaffold), #199 (this PR), #200 (T7-10 HIP), first and keeps it; this PR (T6-9 model registry + Sigstore) rebases onto current master and renames to ADR-0211. References updated across CHANGELOG, AGENTS, security.md, model-registry.md, README, schema, vmaf.c, cli_parse.h, test_tiny_model_verify.c, model_loader.{c,h}, dnn.h, rebase-notes. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(dnn): move arg-validation before platform probe + tighten test fixture mode Two CI fixes for PR #199 (T6-9 model registry + Sigstore verify): 1. Windows MinGW64 build (`test_verify_null_path`): the `_WIN32` branch of `vmaf_dnn_verify_signature()` was returning `-ENOSYS` unconditionally without honouring the public-API contract that a `NULL onnx_path` returns `-EINVAL`. The non-Windows branch already had the NULL check at the function head; mirror it in the Windows branch so the contract is platform-independent. 2. CodeQL `cpp/world-writable-file-creation` at `test_tiny_model_verify.c:41`: the test scratch helper used `fopen("wb")`, which inherits the umask (commonly 0644 — and 0666 in some containerised CI environments) and was flagged as a real issue. Switch to `open(O_CREAT|O_WRONLY|O_TRUNC, 0600)` + `fdopen()` so the fixture creates owner-only files regardless of the runner's umask. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs(cli): document --tiny-model-verify (T6-9 / ADR-0211) Adds a Sigstore-bundle verification subsection under the Tiny-AI flags section of docs/usage/cli.md so the --tiny-model-verify flag introduced in T6-9 satisfies the per-surface doc-substance bar from ADR-0100. The new copy covers the verify-blob shell-out, the supply-chain use case, and the three failure modes that exit non-zero before inference. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(dnn): expand --tiny-model-verify branch coverage + snprintf truncation Two issues raised on PR #199 (T6-9 model registry / Sigstore): 1. Coverage Gate FAIL — `libvmaf/src/dnn/model_loader.c` is on the security-critical list (libvmaf/src/dnn/*) which requires ≥85% line coverage. Baseline was 71% because `vmaf_dnn_verify_signature()` only had NULL-arg + missing-file smoke tests; the cosign-locate, posix_spawnp/waitpid, default- registry-derivation, and find_bundle_for_onnx malformed-JSON branches all sat dark. Added 14 fixture-driven tests covering: - default registry path derivation (NULL registry_path) - onnx_path with no '/' (model/tiny/registry.json fallback) - registry path with no '/' (relative bundle resolve branch) - bundle is a directory rather than a regular file - cosign-not-on-PATH (-EACCES) and empty-PATH short-circuit - cosign success via a fake `cosign` shell stub on PATH - cosign non-zero exit (-EPROTO) via the same stub - six malformed-JSON cases driving find_bundle_for_onnx() to -ENOENT / -EBADMSG on missing colon / quote / closing quote in the onnx and sigstore_bundle keys. model_loader.c coverage now sits at 86.0% line / 68.8% branch per gcovr against the dnn meson suite (verified locally with `scripts/ci/coverage-check.sh`). 2. -Wformat-truncation defect at model_loader.c:589. The snprintf("%s", bundle_rel) feeding bundle_abs's tail-buffer couldn't be proved bounded by gcc — bundle_rel is a PATH_MAX-sized buffer, the destination tail is up to `sizeof(bundle_abs) - 1`, and the runtime length precondition is opaque to -Wformat-truncation. Switched both branches to memcpy + explicit NUL using the already-validated lengths, keeping the bounds check load-bearing without the false positive. The no-slash fallback is rewritten symmetrically so neither branch uses snprintf for the rel-component copy. New test fixtures use mode 0600 for files and 0700 for scratch directories (CodeQL fix from the previous round, preserved). PATH overrides save and restore the original env so the test never leaks state on early failure. Touched files leave the lint pass clean to PR-baseline (no new clang-tidy errors, no new -Wformat warnings; pre-existing analyzer false-positive on slurp_registry stays untouched). --------- Co-authored-by: Lusoris <lusoris@pm.me> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
lusoris
added a commit
that referenced
this pull request
Apr 29, 2026
* feat(hip): T7-10 — HIP (AMD) backend scaffold (audit-first)
Mirrors the Vulkan T5-1 scaffold (ADR-0175) for the HIP / AMD ROCm
backend. Lands the static surfaces (header, build wiring, kernel
stubs, smoke test, CI matrix row, docs) so the runtime + first-kernel
PRs that follow have a stable base to land on.
Public C-API surface (libvmaf/include/libvmaf/libvmaf_hip.h)
+ VmafHipState (opaque)
+ VmafHipConfiguration { device_index, flags }
+ vmaf_hip_state_init / _import_state / _state_free
+ vmaf_hip_list_devices / vmaf_hip_available
Header purity: HIP runtime types cross the ABI as uintptr_t.
Backend tree (libvmaf/src/hip/)
+ common.{c,h} — context_new/destroy/device_count + public C-API stubs.
+ picture_hip.{c,h} — alloc/free stubs (-ENOSYS).
+ dispatch_strategy.{c,h} — feature-name → kernel routing stub.
+ meson.build — paths relative to libvmaf/src/hip/, with `..`
walks to the feature stubs at libvmaf/src/feature/hip/.
Feature kernel stubs (libvmaf/src/feature/hip/)
+ adm_hip.c, vif_hip.c, motion_hip.c — _init / _run return -ENOSYS
pending real implementations.
+ feature_hip.h — forward declarations so the stubs aren't flagged
by clang-tidy's misc-use-internal-linkage checker.
Build wiring
+ new `enable_hip` boolean option in libvmaf/meson_options.txt
(default false — matches enable_cuda / enable_sycl convention;
Vulkan's `feature` form is intentionally not mirrored, see
ADR-0209 § "Decision").
+ conditional `subdir('hip')` in libvmaf/src/meson.build, with
`hip_sources` threaded into libvmaf_feature_static_lib and
`hip_deps` into the top-level library() dependencies list.
+ cdata.set10('HAVE_HIP', true) when enabled.
+ dependency('hip-lang', required: false) optional probe — no hard
SDK requirement for the scaffold.
Smoke test
+ libvmaf/test/test_hip_smoke.c — 9 sub-tests pinning the contract
(4 internal-context lifecycle + 5 public C-API entry-point
-ENOSYS / -EINVAL / NULL-safe assertions). Wired in
libvmaf/test/meson.build under `if get_option('enable_hip')`.
+ verified locally: meson setup -Denable_hip=true + ninja +
test_hip_smoke → 9/9 pass. Default no-HIP build still 37/37.
CI matrix
+ new "Build — Ubuntu HIP (T7-10 scaffold)" row in
.github/workflows/libvmaf-build-matrix.yml. Compiles with
-Denable_hip=true. No ROCm SDK install step needed.
Docs
+ new docs/backends/hip/overview.md — "scaffold only" warning,
build instructions, "what lands next" sequence.
+ ADR-0209 captures the audit-first decision + alternatives
(separate libvmaf_hip.so vs in-tree, AMD-only vs hipify
auto-translation, ROCm vs HIP runtime, boolean vs feature
option type).
+ Research-0032 covers AMD market share + ROCm 6.x Linux
maturity check.
+ ADR README index updated; docs/backends/index.md flipped from
"planned" to "scaffold"; docs/development/build-flags.md row
added; docs/rebase-notes.md entry 0074 added; libvmaf/AGENTS.md
rebase-sensitive invariant entry added.
+ CHANGELOG entry under [Unreleased] § Added.
Zero hard runtime dependencies — `dependency('hip-lang')` probe
stays optional. Adding the real linkage is the responsibility of
the runtime PR (T7-10b).
ADRs: 0209.
Research: 0032.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* fix(docs): renumber ADR-0209 → ADR-0212 and Research-0032 → 0033
PRs #195/#199/#200/#201 all picked ADR-0209; #196/#200 both
picked Research-0032. #195 keeps ADR-0209 (opened first), #196
keeps Research-0032 (cambi). This PR (T7-10 HIP) bumps both.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Lusoris <lusoris@pm.me>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
lusoris
pushed a commit
that referenced
this pull request
Apr 29, 2026
lusoris
added a commit
that referenced
this pull request
Apr 29, 2026
* feat(simd): T7-38 — SSIMULACRA 2 PTLR + IIR-blur SVE2 ports Mirror the NEON SSIMULACRA 2 ports lane-for-lane in a new SVE2 sister TU under a fixed 4-lane `svwhilelt_b32(0, 4)` predicate so the SVE2 path is byte-identical to NEON regardless of the runtime vector length, satisfying the ADR-0138 / ADR-0139 / ADR-0140 byte-exact contract. Runtime gate via getauxval(AT_HWCAP2) & HWCAP2_SVE2; NEON stays the fallback. Build-time probe `cc.compiles(... -march=armv9-a+sve2)` leaves HAVE_SVE2 unset on toolchains without SVE2 intrinsics so the legacy NEON-only build path is unchanged. Validated under qemu-aarch64-static -cpu max via the new cross-file build-aux/aarch64-linux-gnu-sve2.ini: dispatch surfaces "NEON=1 SVE2=1" and all 11 test_ssimulacra2_simd bit-exactness subtests pass byte-for-byte against the scalar reference. Closes Research-0016 / Research-0017 "SVE2 deferred pending CI hardware" footnote and backlog row T7-38. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(docs): renumber ADR-0209 → ADR-0213 to avoid collision PRs #195/#199/#200/#201 all picked ADR-0209 simultaneously. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs(metrics): add SSIMULACRA 2 SVE2 SIMD note (T7-38 / ADR-0213) Note SVE2 ports for IIR-blur and PTLR alongside the existing AVX2 / AVX-512 / NEON paths in the SSIMULACRA 2 backends paragraph, citing ADR-0213 and the Research-0016 / Research-0017 deferral flips. Closes the doc-substance gate gap on PR #201 — the SVE2 sources under libvmaf/src/feature/arm64/ are user-discoverable SIMD paths and need a docs/metrics/ entry per CLAUDE.md §12 r10 / ADR-0100. --------- Co-authored-by: Lusoris <lusoris@pm.me> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Closed
14 tasks
lusoris
pushed a commit
that referenced
this pull request
May 1, 2026
…-1a Netflix Public dataset row) Update docs/state.md `_Updated:` stamp to 2026-04-29 and rewrite the "Tiny-AI C1 baseline `fr_regressor_v1.onnx`" deferral row's reopen-trigger to TRIGGERED — the Netflix Public training corpus that gated C1 is now locally available at `.workingdir2/netflix/` (9 ref + 70 dis YUVs, ~37 GB, gitignored; provided by lawrence 2026-04-27), unblocking BACKLOG T6-1a. Verified the rest of state.md against the 2026-04-29-session merged PR set (#193–#205, #209). Every merged PR was feature / chore / docs / perf with no bug-status delta to record per CLAUDE §12 rule 13: - #193 chore(dnn) T7-12 env override removal — chore. - #194 docs(research) T7-9 NPU digest — research. - #195 feat(mcp) T5-2 embedded scaffold — feature. - #196 feat(vulkan) T7-36 cambi integration — feature. - #197 feat(motion) Netflix b949ceb port — upstream port. - #198 chore(backlog) T7-32 micro-investigations — verify-only. - #199 feat(ai) T6-9 model registry — feature. - #200 feat(hip) T7-10 HIP scaffold — feature. - #201 feat(simd) T7-38 SVE2 ports — feature. - #202 feat(ci) T6-8 parity matrix — feature. - #203 feat(ai) T6-7 FastDVDnet — feature. - #205 docs(audit) T7-4 quarterly audit — explicitly notes "no state.md changes (no upstream commit ruled in/out a fork bug)". - #209 perf(sycl) T7-17 fp64-less device — perf. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Merged
14 tasks
lusoris
pushed a commit
that referenced
this pull request
May 1, 2026
…-1a Netflix Public dataset row) Update docs/state.md `_Updated:` stamp to 2026-04-29 and rewrite the "Tiny-AI C1 baseline `fr_regressor_v1.onnx`" deferral row's reopen-trigger to TRIGGERED — the Netflix Public training corpus that gated C1 is now locally available at `.workingdir2/netflix/` (9 ref + 70 dis YUVs, ~37 GB, gitignored; provided by lawrence 2026-04-27), unblocking BACKLOG T6-1a. Verified the rest of state.md against the 2026-04-29-session merged PR set (#193–#205, #209). Every merged PR was feature / chore / docs / perf with no bug-status delta to record per CLAUDE §12 rule 13: - #193 chore(dnn) T7-12 env override removal — chore. - #194 docs(research) T7-9 NPU digest — research. - #195 feat(mcp) T5-2 embedded scaffold — feature. - #196 feat(vulkan) T7-36 cambi integration — feature. - #197 feat(motion) Netflix b949ceb port — upstream port. - #198 chore(backlog) T7-32 micro-investigations — verify-only. - #199 feat(ai) T6-9 model registry — feature. - #200 feat(hip) T7-10 HIP scaffold — feature. - #201 feat(simd) T7-38 SVE2 ports — feature. - #202 feat(ci) T6-8 parity matrix — feature. - #203 feat(ai) T6-7 FastDVDnet — feature. - #205 docs(audit) T7-4 quarterly audit — explicitly notes "no state.md changes (no upstream commit ruled in/out a fork bug)". - #209 perf(sycl) T7-17 fp64-less device — perf. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
lusoris
pushed a commit
that referenced
this pull request
May 1, 2026
…-1a Netflix Public dataset row) Update docs/state.md `_Updated:` stamp to 2026-04-29 and rewrite the "Tiny-AI C1 baseline `fr_regressor_v1.onnx`" deferral row's reopen-trigger to TRIGGERED — the Netflix Public training corpus that gated C1 is now locally available at `.workingdir2/netflix/` (9 ref + 70 dis YUVs, ~37 GB, gitignored; provided by lawrence 2026-04-27), unblocking BACKLOG T6-1a. Verified the rest of state.md against the 2026-04-29-session merged PR set (#193–#205, #209). Every merged PR was feature / chore / docs / perf with no bug-status delta to record per CLAUDE §12 rule 13: - #193 chore(dnn) T7-12 env override removal — chore. - #194 docs(research) T7-9 NPU digest — research. - #195 feat(mcp) T5-2 embedded scaffold — feature. - #196 feat(vulkan) T7-36 cambi integration — feature. - #197 feat(motion) Netflix b949ceb port — upstream port. - #198 chore(backlog) T7-32 micro-investigations — verify-only. - #199 feat(ai) T6-9 model registry — feature. - #200 feat(hip) T7-10 HIP scaffold — feature. - #201 feat(simd) T7-38 SVE2 ports — feature. - #202 feat(ci) T6-8 parity matrix — feature. - #203 feat(ai) T6-7 FastDVDnet — feature. - #205 docs(audit) T7-4 quarterly audit — explicitly notes "no state.md changes (no upstream commit ruled in/out a fork bug)". - #209 perf(sycl) T7-17 fp64-less device — perf. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
lusoris
added a commit
that referenced
this pull request
May 1, 2026
…-1a Netflix Public dataset row) (#245) Update docs/state.md `_Updated:` stamp to 2026-04-29 and rewrite the "Tiny-AI C1 baseline `fr_regressor_v1.onnx`" deferral row's reopen-trigger to TRIGGERED — the Netflix Public training corpus that gated C1 is now locally available at `.workingdir2/netflix/` (9 ref + 70 dis YUVs, ~37 GB, gitignored; provided by lawrence 2026-04-27), unblocking BACKLOG T6-1a. Verified the rest of state.md against the 2026-04-29-session merged PR set (#193–#205, #209). Every merged PR was feature / chore / docs / perf with no bug-status delta to record per CLAUDE §12 rule 13: - #193 chore(dnn) T7-12 env override removal — chore. - #194 docs(research) T7-9 NPU digest — research. - #195 feat(mcp) T5-2 embedded scaffold — feature. - #196 feat(vulkan) T7-36 cambi integration — feature. - #197 feat(motion) Netflix b949ceb port — upstream port. - #198 chore(backlog) T7-32 micro-investigations — verify-only. - #199 feat(ai) T6-9 model registry — feature. - #200 feat(hip) T7-10 HIP scaffold — feature. - #201 feat(simd) T7-38 SVE2 ports — feature. - #202 feat(ci) T6-8 parity matrix — feature. - #203 feat(ai) T6-7 FastDVDnet — feature. - #205 docs(audit) T7-4 quarterly audit — explicitly notes "no state.md changes (no upstream commit ruled in/out a fork bug)". - #209 perf(sycl) T7-17 fp64-less device — perf. Co-authored-by: Lusoris <lusoris@pm.me> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Audit-first scaffold for the in-process MCP server declared by ADR-0128 + Research-0005. Mirrors the ADR-0175 (Vulkan T5-1) + ADR-0184 (T7-29 part 1) pattern: ship the static surfaces in a focused PR so the T5-2b runtime PR (cJSON + mongoose vendoring, dedicated MCP pthread, SPSC ring buffer, SSE / UDS / stdio transport bodies) has a stable base to land on.
Zero runtime dependencies in this PR — no cJSON, no mongoose, no transport bodies. Those land in T5-2b.
Test plan
Reproducer
```bash
meson setup build-cpu libvmaf
-Denable_cuda=false -Denable_sycl=false
-Denable_mcp=true -Denable_mcp_sse=true
-Denable_mcp_uds=true -Denable_mcp_stdio=true
ninja -C build-cpu
meson test -C build-cpu test_mcp_smoke
```
ADR-0108 deep-dive checklist
Hard rule status
What lands next (T5-2b)
Per Research-0005 § "Next steps" + ADR-0209 § "What lands next":
🤖 Generated with Claude Code