docs/adr/ADR-187-archive-v1-deprecation-honest-labeling.md
archive/v1 Deprecation & Model-Weights Honest LabelingTwo open GitHub issues are, at root, the same complaint: the project's public surface lets a reader believe a WiFi→17-keypoint pose model exists and produces real accuracy, when the specific code they land on cannot back that claim.
This ADR follows the prove-everything / anti-"AI-slop" directive and the honest-labeling precedent set by ADR-160: the fix is to make the labels TRUE, not to fabricate a capability. Grading vocabulary (from ADR-152 / ADR-160):
The situation is more nuanced than either issue implies — worse in one place, and distinctly better in others. Forcing a uniformly negative narrative would itself be dishonest. The findings:
1. archive/v1 — the issue reporter is correct here.
archive/v1/src/models/densepose_head.py defines DensePoseHead (segmentation +
UV-regression heads). Its _initialize_weights() uses kaiming_normal_ random
initialization only — there is no checkpoint-loading path in the class.Glob archive/v1/**/*.{pth,onnx,safetensors,pt,ckpt,bin} → zero files. There are
no trained weights anywhere under archive/v1/. The "architecture defined, no
weights" claim is TRUE for this tree.archive/v1/README.md calls the tree "the legacy Python implementation" in a single
closing note but does not loudly warn users off it, and there is no
archive/v1/DEPRECATED.md. This is the dead-but-present code that shows up in greps
and search and reads as if it were the live implementation.wifi-densepose 1.x (1.99.0 raises an ImportError telling users to migrate). The
code is already tombstoned on PyPI but not in the repo.2. v2 (the current, maintained system) — real weights DO exist; the "no weights
anywhere" reading is FALSE at the project level. Git-tracked, committed checkpoints:
v2/crates/cog-pose-estimation/cog/artifacts/pose_v1.safetensors (507 KB) +
pose_v1.onnx (12 KB) + train_results.json — a real committed 17-keypoint
model, trained with Candle on an RTX 5080.v2/crates/cog-person-count/cog/artifacts/count_v1.{safetensors,onnx} — a committed
person-count model.ruvnet/wifi-densepose-pretrained (CSI encoder + presence head, honestly re-labeled
at 82.3% held-out temporal-triplet accuracy — the older "100% presence" figure was
already retracted, an existing honest-labeling win) and ruvnet/wifi-densepose-mmfi-pose
(a pose model reporting 82.69% torso-PCK@20 on the MM-Fi random_split protocol).3. The honest gap is narrow and specific — the live, on-device ESP32 17-keypoint
pose path. Per v2/crates/cog-pose-estimation/cog/README.md (already an exemplary
"Honest reading" section):
pose_v1 scores PCK@20 = 3.0% / PCK@50 = 18.5% on a 217-sample
holdout — below the ADR-079 target of PCK@20 ≥ 35%. It learns coarse structure
(r_hip 77% PCK@50) but distal/face joints are near-random. encoder_init was
random; it was trained on a single 30-min seated-at-desk recording (1,077 samples,
avg confidence 0.44).confidence=0 — the pose_v1.safetensors weights are not yet wired into
src/inference.rs.Not "the project has no weights" (false) and not "there is a validated pretrained DensePoseHead" (false for the live ESP32 path). The real problem is a labeling and navigation gap:
archive/v1's random-init DensePoseHead is indistinguishable, to a grepping
reader, from the live implementation, and carries no deprecation notice.pose_v1 3% PCK@20, runtime stubbed), and which are
architecture-only with no weights at all (archive/v1 DensePoseHead).Two coordinated honest-labeling actions. Neither invents a capability; both make the public surface match what the code and checkpoints actually deliver.
archive/v1 in the repo — MEASURED gap, proposed fixarchive/v1/DEPRECATED.md — a loud tombstone stating that archive/v1 is the
original pure-Python implementation, is unmaintained and superseded, that its
DensePoseHead is architecture-only with random-initialized weights and ships no
trained checkpoint, and that the maintained path is the v2/ Rust workspace + the
wifi-densepose 2.x / ruview pip wheel (ADR-117). Mirror the disclaimer tone of
ADR-160's //! headers and the pip 1.99.0 tombstone text.archive/v1/README.md (the file exists) — a > ⚠️ DEPRECATED block at the very top pointing to DEPRECATED.md, v2/, and the pip
wheel, before any of the existing "how to install v1" content.archive/v1/ may reference archive/v1 code (other than the
ADR-028 deterministic proof at archive/v1/data/proof/verify.py, which is a
legitimately live signal-pipeline witness and stays) as if it were current. The two
README references verified (README.md lines 139/198/204; docs/user-guide.md
proof/swift-compile lines) are all proof/utility invocations, not implementation
claims — they are acceptable and out of scope.Add a "Model weights: what's real, what's not" subsection to README.md and
docs/user-guide.md that names the three tiers verified above, so no reader can infer
"a pretrained 17-keypoint DensePoseHead produces real pose accuracy on my ESP32":
| Tier | Checkpoint(s) | Honest status |
|---|---|---|
| Real & validated | ruvnet/wifi-densepose-pretrained (encoder + presence, 82.3% held-out temporal-triplet); ruvnet/wifi-densepose-mmfi-pose (82.69% torso-PCK@20, MM-Fi random_split); count_v1 | MEASURED / published; keep current honest labels |
| Real but weak (honestly labeled) | committed pose_v1.safetensors in cog-pose-estimation | PCK@20 = 3.0%, below the ADR-079 ≥35% target; runtime path is a confidence=0 stub until weights are wired into src/inference.rs. Already disclosed in the cog README; surface the same caveat wherever the live ESP32 pose feature is advertised |
| Architecture only, no weights | archive/v1 DensePoseHead | random-init, no checkpoint; deprecated per (a) |
| Phase | Action | State |
|---|---|---|
| P0 | This ADR (investigation + decision) | DONE (this file) |
| P1 | Add archive/v1/DEPRECATED.md + loud notice atop archive/v1/README.md | DONE (1fb5397dd) |
| P2 | Add "Model weights: what's real, what's not" tier table to README.md + docs/user-guide.md; add the caveat wherever the live ESP32 17-keypoint feature is advertised | DONE (1fb5397dd; follow-up caveated the hardware table, hero caption, and live-pipeline note) |
| P3 | Answer #509's SISO/no-weights question and #1125's "does it run" in docs/user-guide.md (point to the reproducible proofs: MM-Fi arena, archive/v1/data/proof/verify.py, cog train_results.json) | DONE (1fb5397dd) |
| P4 | Close the DATA-GATED live-pose gap via ADR-079 first reproducible on-device baseline (PCK@20 ≥35%) + wire pose_v1.safetensors into cog-pose-estimation/src/inference.rs | ACCEPTED-FUTURE ([#645]) |
archive/v1/DEPRECATED.md exists and names v2/ + the pip wheel as the maintained path.archive/v1/README.md opens with a > ⚠️ DEPRECATED block before any install instructions.README.md and docs/user-guide.md no longer let a reader infer that archive/v1
or an untrained/random-init DensePoseHead produces real pose accuracy without the
caveats added here.count_v1) keep their existing honest labels — nothing is weakened or overclaimed.archive/v1's random-init DensePoseHead for
the live system; the dead code is loudly tombstoned in the repo, matching its PyPI 1.99.0 tombstone.DEPRECATED.md, the tier table) as the checkpoints evolve.archive/v1 stays in the tree as a research archive
(ADR-117 §1.3) and its ADR-028 proof witness is untouched.archive/v1/src/models/densepose_head.py — DensePoseHead, random _initialize_weights(), no checkpoint load.archive/v1/README.md — legacy note; no loud deprecation (target of P1).v2/crates/cog-pose-estimation/cog/README.md — the "Honest reading" precedent (PCK@20 = 3.0%, runtime stub).v2/crates/cog-pose-estimation/cog/artifacts/{pose_v1.safetensors,pose_v1.onnx,train_results.json} — committed first-cut pose model.v2/crates/cog-person-count/cog/artifacts/count_v1.{safetensors,onnx} — committed count model.ruvnet/wifi-densepose-pretrained, ruvnet/wifi-densepose-mmfi-pose — published, benchmarked checkpoints.