decisions-guard: require a **Signals:** line (MemPalace recall metadata contract) #545

Closed
opened 2026-07-21 20:14:22 +02:00 by timothy · 2 comments
Owner

The decisions-guard validator (scripts/decisions_validate.py) enforces the decision-record lifecycle metadata (key, status, since, supersedes, superseded-by + reciprocal links, archive placement, no rationale laundering) but does not require the **Signals:** line.

**Signals:** (plus key:) is exactly what MemPalace’\s keyword/closet-boost recall matches on when surfacing a decision — verified this session: the #536 work-ahead decision surfaced at 0.90 similarity, driven by its Signals line. A migrated record with a missing or empty Signals line ingests into MemPalace with weak recall metadata, producing confident false-negatives ("no convention exists") for the very "MemPalace to find, file to confirm" workflow the retrieval layer depends on.

Make **Signals:** a hard-required field in the validator so the ingestion-side metadata contract matches what recall actually needs. All 114 current active + 2 archive records already carry a Signals line, so this is non-breaking on the existing corpus.

Done-when

  • decisions_validate.py fails a migrated record with a missing/empty **Signals:** line (same weight as key:)
  • Existing corpus still validates green (all current records already have Signals)
  • Unit test covers the missing-Signals failure and the clean case
  • docs/decisions.md header + Enforcement section note that **Signals:** is required and why (MemPalace recall)
  • adversarial review passed
The `decisions-guard` validator (`scripts/decisions_validate.py`) enforces the decision-record **lifecycle** metadata (`key`, `status`, `since`, `supersedes`, `superseded-by` + reciprocal links, archive placement, no rationale laundering) but does **not** require the `**Signals:**` line. `**Signals:**` (plus `key:`) is exactly what MemPalace’\s keyword/closet-boost recall matches on when surfacing a decision — verified this session: the #536 work-ahead decision surfaced at 0.90 similarity, driven by its Signals line. A migrated record with a missing or empty Signals line ingests into MemPalace with weak recall metadata, producing confident false-negatives ("no convention exists") for the very "MemPalace to find, file to confirm" workflow the retrieval layer depends on. Make `**Signals:**` a hard-required field in the validator so the ingestion-side metadata contract matches what recall actually needs. All 114 current active + 2 archive records already carry a Signals line, so this is non-breaking on the existing corpus. ## Done-when - [x] `decisions_validate.py` fails a migrated record with a missing/empty `**Signals:**` line (same weight as `key:`) - [x] Existing corpus still validates green (all current records already have Signals) - [x] Unit test covers the missing-Signals failure and the clean case - [x] `docs/decisions.md` header + Enforcement section note that `**Signals:**` is required and why (MemPalace recall) - [x] adversarial review passed
timothy added the in-progresspriority: medium labels 2026-07-21 20:14:52 +02:00
Author
Owner

Claiming. Making **Signals:** a hard-required field in decisions_validate.py (via REQUIRED_META), updating the test _rec() helper + adding a missing-Signals test, and documenting the requirement in docs/decisions.md.

Claiming. Making `**Signals:**` a hard-required field in `decisions_validate.py` (via `REQUIRED_META`), updating the test `_rec()` helper + adding a missing-Signals test, and documenting the requirement in `docs/decisions.md`.
timothy removed the in-progress label 2026-07-21 21:22:00 +02:00
Author
Owner

Done — merged via PR #547 (main).

What was done: added signals to REQUIRED_META in scripts/decisions_validate.py, so a migrated decision record with a missing/empty **Signals:** line now fails the decisions-guard gate the same way a missing key: does (both CI and the Husky pre-commit shim).

Root cause: a metadata-contract gap. The validator enforced the lifecycle fields (key/status/since/supersedes/superseded-by + reciprocal links) but not **Signals:** — which is exactly what MemPalace`s keyword/closet-boost recall matches on. A record without it ingested with weak recall metadata, yielding confident false-negatives for the "MemPalace to find, file to confirm" workflow.

Non-breaking: all 114 active + 2 archive records already carry a Signals line; validator stays green on the corpus. Archive records are intentionally out of scope (recall targets the active corpus).

Files: decisions_validate.py, tests/test_decisions_validate.py (29 pass). Docs: docs/decisions.md header + Enforcement section now state the requirement and why.

Review: independent cold review — MERGEABLE, non-vacuity empirically confirmed (toggling REQUIRED_META).

Also this session: added a "MemPalace to find, file to confirm" convention note to the global knowledge-workflow instructions.

Done — merged via PR #547 (main). **What was done**: added `signals` to `REQUIRED_META` in `scripts/decisions_validate.py`, so a migrated decision record with a missing/empty `**Signals:**` line now fails the `decisions-guard` gate the same way a missing `key:` does (both CI and the Husky pre-commit shim). **Root cause**: a metadata-contract gap. The validator enforced the lifecycle fields (`key`/`status`/`since`/`supersedes`/`superseded-by` + reciprocal links) but not `**Signals:**` — which is exactly what MemPalace`s keyword/closet-boost recall matches on. A record without it ingested with weak recall metadata, yielding confident false-negatives for the "MemPalace to find, file to confirm" workflow. **Non-breaking**: all 114 active + 2 archive records already carry a Signals line; validator stays green on the corpus. Archive records are intentionally out of scope (recall targets the active corpus). **Files**: `decisions_validate.py`, `tests/test_decisions_validate.py` (29 pass). **Docs**: `docs/decisions.md` header + Enforcement section now state the requirement and why. **Review**: independent cold review — MERGEABLE, non-vacuity empirically confirmed (toggling `REQUIRED_META`). Also this session: added a "MemPalace to find, file to confirm" convention note to the global knowledge-workflow instructions.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: timothy/ersatztv#545