5.9 KiB
Session 0085.0 — Transcript
App: ohm Start: 2026-06-07T16-55 (PST) Type: planning-and-executing Status: FINALIZED.
Launch prompt
/goal next → resume stored goal: SLICE-2 of configurable-collection-metadata
— collection fields: schema + central metadata_schema.validate.
Pre-state
- Repo
ben.stull/rfc-appon clean, pushedmain=98c276a@ v0.47.0 (SLICE-1 sidecars shipped session 0084). - One stale in-flight transcript surfaced at claim: SESSION-0080
(
--INPROGRESSfrom 2026-06-06), but sessions 0083/0084 finalized after it — almost certainly a crash orphan the SessionEnd hook didn't flag. Not adopted (not my work, no context, not annotatedENDED-UNFINALIZED); noted and proceeded (autonomous default). - Memory
Next /goal:field said SLICE-2; design docdocs/design/2026-06-06-configurable-collection-metadata.md§7.2 is the spec.
Plan
Plan doc: docs/design/plans/2026-06-07-slice2-collection-field-schema.md
(archived to ben/ohm-rfc:plans/).
DoD (design §7.2 SLICE-2): .collection.yaml fields: parsed + stored (rides in
existing collections.config_json, no migration); metadata_schema.validate
advisory at read / enforcement point for write (write endpoints land SLICE-4/5);
schema served via GET …/collections/{id}; no-fields: collections unchanged
(INV-5).
Steps: (1) new app/metadata_schema.py — lenient parse_fields + advisory
validate (enum/tags/text); (2) registry.parse_collection_manifest reads
fields: into config; (3) collections.get_collection unpacks fields from
config_json → served by API; (4) cache._refresh_collection_corpus runs advisory
validation, OR-ing into metadata_malformed (INV-3); (5) full suite green, bump
0.48.0 + CHANGELOG, PR + merge. TDD throughout.
Turn-by-turn arc
- Classified the
/goal nextopening → planning-and-executing; ranwgl-planning-and-executinginit: computed PST start, confirmed clean/pushedmain, peeked in-flight (SESSION-0080 orphan), claimed session 0085. - Read the design doc + amended SPEC §22.4a + the SLICE-1 surfaces
(
metadata.py,entry.pyextra,registry.pyingest,collections.pyread,cache.pycorpus mirror,api_collections.py). Confirmed schema field values land inEntry.extra(custom) /Entry.tags(tags), and that the.collection.yamlfields:block flows throughparse_collection_manifest→CollectionEntry.config→collections.config_json— no migration needed. - Wrote the plan doc + seeded the transcript Plan block. Logged three deferred decisions (multi-enum=no; default-collection-fields out of scope; lenient schema parsing).
- TDD: wrote
tests/test_metadata_schema.py(19 cases), thenapp/metadata_schema.py→ green. - Wired ingest:
registry.parse_collection_manifestreadsfields:;collections.get_collectionunpacks_fields_from_config; extendedtest_collection_registry.py+test_collection_helpers.py→ green. - Wired advisory validation in
cache._refresh_collection_corpus(fetch schema once/collection, validate per entry, OR intometadata_malformed); extendedtest_metadata_cache.py(3 cases incl. INV-5/INV-7) → green. - Full backend suite: 601 passed. Bumped VERSION + package.json → 0.48.0,
wrote CHANGELOG 0.48.0 (+ upgrade steps). Committed, pushed branch
worktree-metadata-slice2-schema, created PR #32 (Gitea API), merged, syncedmain=1bcf8aa, pruned branch. - Finalize: archived the plan to the content repo, updated memory + index, published this transcript.
Cut state
- Origin
main=1bcf8aa@ v0.48.0; tree clean. Backend suite 601 green. - SLICE-2 complete (all DoD met). Write-boundary enforcement intentionally deferred to SLICE-4/5 (no edit endpoints yet). No deploy (3-minor undeployed gap vs OHM @0.46.1 — batched intentionally).
Outcome
SLICE-2 of configurable-collection-metadata shipped as v0.48.0 (PR #32,
origin main = 1bcf8aa). New app/metadata_schema.py (lenient parse_fields
- advisory
validate);.collection.yaml fields:ingested via registry intocollections.config_json; schema served on the collection API; advisory validation wired into the corpus mirror (metadata_malformed, INV-3). Backend suite green (601 passed). No DB migration. INV-5 (no-fields unchanged) tested.
Next: SLICE-3 — faceted left-pane filtering (read): list endpoint returns
facet counts + honors filter params incl. malformed; left pane renders faceted
groups with counts + tag-value search. Has a UI surface → Playwright E2E.
Deferred decisions
- Q2 (multi-enum in v1?) → decided no: v1 field types are
enum/tags/textonly, per design §6.3. Unknown types ignored with a warning;multi-enum/refdeferred. - Default-collection
fields:→ out of SLICE-2: a default collection has no.collection.yaml, and the N=1 default isdocumentwith no fields (INV-5). Field schemas attach to named collections (with a manifest). A deployment wanting fields on its primary corpus declares a named collection. Consistent with the opt-in story; flagged so SLICE-3+ can revisit if needed. - Lenient schema parsing → a bad
fields:block / field def is skipped with a warning, never fatal (INV-3 spirit), unlike structural manifest errors (type/visibility) which still raise. - Deploy deferred → SLICE-2 shipped v0.48.0 to
mainbut was not deployed. OHM is live @0.46.1; three non-breaking framework minors (0.46.2, 0.47.0, 0.48.0) now accumulate undeployed — matching the prior slice sessions' pattern of batching the deploy. A dedicated flotilla deploy gesture should pick up the batch when the operator wants it. - Orphan session 0080 → surfaced at claim but not adopted/finalized (not this session's work, no context, not flagged ENDED-UNFINALIZED). Left for the operator to reconcile.