Appendix A — Implementation notes (45 findings)
These findings are defects of the reference pipeline (services/verd/, scripts/), not of VER 1.0. This branch is a standards-track branch: it patches only the eleven items the decisions brief authorises (D7.0), because the rest need model and vector-database coverage this environment cannot exercise. Everything else is recorded here so that its absence is a decision rather than an oversight.
| ID | Summary | Disposition |
|---|---|---|
EMB-01 | Mid-chain model fallback changes the embedding space without a loud warning | documented — not patched |
EMB-02 | Qdrant collection is guarded by vector size only, never by space_id | documented — not patched |
QD-01 | No query path filters by space_id; one scalar space_id covers three named vectors | documented — not patched |
QD-02 | must_tags is an OR filter despite its name and CLI help | documented — not patched |
SC-01 | weights_sha256 folds the filename into the preimage, so it is not the file digest | documented — not patched; preimage defined by ADR-0007 |
SC-02 | Weights digest depends on local HuggingFace cache state, not on the checkpoint | documented — not patched; ADR-0007 |
SC-03 | Multi-file weights preimage has no length framing between name and content | documented — not patched; ADR-0007 |
SC-04 | Descriptor cache re-emits a stale weights_sha256 after weights change | documented — not patched |
SC-05 | No model revision is pinned, so one space_id can denote different weights over time | documented — not patched |
SC-06 | Derived space_id for unregistered checkpoints violates the schema pattern | documented — not patched; 1.1 §11.6 relaxes the pattern |
FUSE-01 | Fused space_id is a constant naming siglip2 regardless of the real base space | documented — not patched |
FUSE-02 | Fusion runs with no same-space or same-dimension check on its inputs | documented — not patched; validator-rule VER704 catches the record-level form |
FUSE-03 | Embeddings indexed by role, discarding all but the last of each role | documented — not patched |
FUSE-04 | Bare next() raises StopIteration on a schema-valid record with an absent space | documented — not patched; validator-rule VER501 |
FUSE-06 | Fused embeddings are written to records but never upserted into the index | documented — not patched |
MIG-01 | Migration scrolls without vectors, then deletes the collection — vectors unrecoverable | documented — not patched (do not run this script as written) |
MIG-02 | Every vector decoded as little-endian fp16, ignoring the declared dtype | documented — not patched; validator-rule VER602/VER604 |
MIG-03 | Collection dimension taken from whichever record is read first | documented — not patched |
MIG-04 | Vectors indexed by pixel_hash while points are keyed by (producer, pixel_hash) | documented — not patched; annex E27 |
CFG-01 | Tag threshold is a global scalar with no binding to the space it was calibrated on | documented — not patched |
CFG-02 | No configuration surface for the embedding space; the chain is a module constant | documented — not patched |
CFG-03 | Scripts hard-code the records directory, ignoring the documented setting | documented — not patched |
EMB-03 | One space_id denotes device-dependent arithmetic with no declared tolerance | documented — not patched; annex E12/N5 |
EMB-04 | l2_normalize emits a zero vector for a zero row despite normalization: l2 | documented — not patched |
TAG-01 | Anchor cache is not validated against weights_sha256 | documented — not patched |
TAG-02 | tag_scores are published without the taxonomy version that produced them | documented — not patched; drafted-in-1.1 §14 (VER-F) |
HASH-01 | pdq_hash returns pdq/1.0:<hex> and that whole string lands in perceptual[].value | fixed in this branch (D7.0 #1); validator-rule VER801 |
MOD-01 | Wire identity hash/dimension fields are unconstrained str/int | fixed in this branch (D7.0 #2, #8); drafted-in-1.1 §14.3 |
REC-01 | conformance_level hardcoded L1 even when raw capture failed | fixed in this branch (D7.0 #4); validator-rule VER302 |
REC-02 | availability.c2pa hardcoded absent — a positive claim never checked | documented — not patched; validator-rule VER1103 |
REC-07 | encode_vector hardcodes fp16 while the embedding declares the space's dtype | documented — not patched; validator-rule VER602/VER604; annex E24 |
CPNP-01 | Decoder's own format string passed through to the closed image.format enum | documented — not patched |
REC-12 | Records written unvalidated, non-atomically, with locale-default encoding | documented — not patched |
CPNP-11 | §4's alpha formula is delegated to a third-party fixed-point routine | documented — not patched; annex E4 pins the arithmetic domain |
WIRE-06 | Remotely triggerable arbitrary file write from an unvalidated firehose pixelSha256 | fixed in this branch (D7.0 #3); drafted-in-1.1 §14.3 |
WIRE-20 | handle_event's totality contract is false — hostile base64 raises out of the handler | documented — not patched |
WIRE-22 | Thumbnail cache keyed on pixel_hash alone is shared with foreign producers | documented — not patched; annex E27 |
WIRE-23 | Federated re-embed decodes stranger-supplied bytes with no sandbox | documented — not patched; annex E12 |
WIRE-27 | Publish path never validates the source record against the authoritative schema | documented — not patched; the profile validator now makes this a one-line check |
TEST-COLLECT-ABORT | pytest tests/ aborts at collection, taking the thesis test with it | fixed in this branch (D7.0 #7, tests/conftest.py) |
ENV-CREDS-PARSE | cp .env.example .env yields non-empty garbage atproto credentials | documented — not patched |
TEST-QDRANT-PROBE-IMPORTTIME | qdrant_up() runs at import time with a network timeout per module | documented — not patched; the standards tests are network-free by construction |
TEST-SETTINGS-SINGLETON-MUTATION | A module-scoped fixture mutates the cached global Settings singleton | documented — not patched |
TEST-A2-MODEL-DEPENDENT | A2 asserts exact counts over zero-shot model output | documented — not patched |
SCRIPT-ROLE-AS-KEY | Scripts index embeddings by role, destroying the dual-embed migration path | documented — not patched |
Fixed in this branch (the D7.0 set, in full): HASH-01 (bare PDQ digest), MOD-01 (wire-model field constraints plus a regression test), WIRE-06 (hex-guard before path construction), REC-01 and IMPL-CONFORMANCE-SELF-DECLARED (conformance-level honesty), REC-09 and IMPL-RECORD-ID-COLLIDES (record_id preimage), RUFF-CONFIG-UNREACHABLE and PYTEST-TESTPATHS-ESCAPE (root tool config), TEST-COLLECT-ABORT (tests/conftest.py), DOCKER-UNPINNED (pinned image plus healthcheck), THESIS-01, CLAUDEMD-STALE, and DOCTRINE-PIXHASH-HALF-APPLIED (README and CLAUDE.md). MOD-02 is fixed as a documentation change in the same pass: the Hashes docstring in services/verd/src/verd/models.py no longer claims that pixel does not change when metadata changes, and states E1's survival profile instead. No behaviour of that module changes.
TEST-A3-INCOMPLETE is deliberately not patched. A3 is the thesis test; the brief's ruling is that it is not weakened, extended, or touched on a standards branch.
Intentional behavior change riding on the MOD-01 fix: RecordIdentity.phashDct64 is now pattern-constrained (^[a-f0-9]{16}$), so atp.lite_from_full raises a ValidationError for a full record that carries no phash-dct/64 perceptual digest, where it previously published an empty string onto the wire. This is the correct reading of spec §5 (phash-dct/64 is the baseline perceptual digest the reference pipeline always computes) and an empty-string digest on a public firehose was itself a defect — but any downstream producer publishing records without a pHash will now fail closed at publication rather than silently emitting a malformed wire record.
