Skip to content

A3: store-backed board step for the morning report#44

Merged
hartsock merged 2 commits into
mainfrom
feat/board-step
Jun 9, 2026
Merged

A3: store-backed board step for the morning report#44
hartsock merged 2 commits into
mainfrom
feat/board-step

Conversation

@hartsock

@hartsock hartsock commented Jun 9, 2026

Copy link
Copy Markdown
Owner

Summary

Stacked on #43. Adds a board step that reads open knowledge-board cards from the agent state store and renders them grouped by lane — the operational counterpart of the filesystem board-scan (which is unchanged).

  • board step: pure (no subprocess), soft-skips without a store. Optional params lane (single lane) and project (filter). With no lane, shows the open work lanes p0/p1/p2 (closed lanes only on request). Flags cards with blocked_on refs as [blocked].
  • data_schema(): {lanes:[{lane, cards:[{card_id, project, summary, status, size, blocked}]}], open} — new versioned contract, golden-pinned.
  • Registered in builtin_registry; documented-types test + module table updated; board-scan (filesystem) vs board (store) distinction documented.
  • Data-contract harness: board joins CONTRACT_CONFIG and the golden set; a seeded card proves executed output validates against its schema.

Disclosure tier: step (the FOUNDATION-preferred path — a read path, zero tools/list cost).

Test plan

  • just check green (fmt + clippy -D warnings + all tests incl. golden + data-contract; EXIT=0).
  • New tests: board_step_missing_store_soft_skips, board_step_lists_open_lanes_only, board_step_honors_lane_param, board_render_flags_blocked_cards, plus golden board.json and the contract harness validating real output.

Note: targets feat/board-markdown-roundtrip (#43). Rebase down the stack as #42/#43 merge.

🤖 Generated with Claude Code

hartsock and others added 2 commits June 9, 2026 15:22
WHAT: Add board_md (card_to_markdown / card_from_markdown) and the
Store::import_dir / export_dir directory sync, so the operational SQLite
cards round-trip to/from the portable markdown+frontmatter form.

- board_md.rs: emits the canonical frontmatter field order (id, project,
  created, updated, summary, size, status, recurs, expires, blocked_on,
  refs, author/source) + body; parses tolerantly (free-text status,
  trailing `# comments` on list items, a `blocked_by` alias for
  blocked_on, refs label:url map). lane/context are directory facts, left
  empty by the parser and filled by the walker.
- Store::import_dir walks <root>/[<context>/]<lane>/*.md (lanes
  p0|p1|p2|done|dropped), follows symlinks (the lane-view convention) but
  dedups by card_id so a source file and its lane symlink import once;
  returns {added, updated, skipped}.
- Store::export_dir writes flat <context>/<lane>/<card_id>.md real files
  (non-destructive; never deletes files it didn't write).
- BoardConfig gains sync_dir / default_lane / default_context (all
  #[serde(default)], existing configs parse unchanged).
- New dependency: serde_yaml_ng (maintained drop-in for the deprecated
  serde_yaml) — parses the frontmatter map + list cleanly.

WHY: Markdown stays the portable, sovereign artifact (no lock-in); SQLite
is the fast operational store. v1 round-trip is at the card-content level
(frontmatter + body survive SQLite -> md -> SQLite) — it does NOT
reconstruct the numbered relative-symlink lane views; that's a follow-up.

Disclosure tier: internal capability + one new dependency. No MCP surface
change, no listed step yet.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
WHAT: Add a `board` step type that reads open knowledge-board cards from
the agent state store and renders them grouped by lane — the operational
counterpart of the filesystem `board-scan` step (which stays as-is).

- steps/board::Board: pure step (no subprocess), soft-skips without a
  store. Params (optional): `lane` (a single lane), `project` (filter).
  With no `lane`, shows the open work lanes p0/p1/p2 (closed lanes only on
  request). Flags cards carrying blocked_on refs as `[blocked]`.
- data_schema(): {lanes:[{lane, cards:[{card_id, project, summary, status,
  size, blocked}]}], open} — a new versioned contract (golden pinned).
- Registered in builtin_registry; documented-types test + module table
  updated. board-scan vs board distinction documented (filesystem vs store).
- data-contract harness: the `board` step joins CONTRACT_CONFIG and the
  golden set; a seeded card proves executed output validates against the
  schema.

WHY: The store-backed board is what makes "good morning" surface the local
knowledge board with no git or filesystem layout required — cards live in
SQLite (synced from/to markdown via A2). Preferred disclosure path per
FOUNDATION: a read-only step, zero MCP tools/list cost.

Disclosure tier: step.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@hartsock hartsock added the risk:low Scoped, tested, no CI/build changes label Jun 9, 2026
@hartsock hartsock changed the base branch from feat/board-markdown-roundtrip to main June 9, 2026 20:23
@hartsock hartsock merged commit fa6b6d4 into main Jun 9, 2026
1 check passed
@hartsock hartsock deleted the feat/board-step branch June 9, 2026 20:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

risk:low Scoped, tested, no CI/build changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant