A3: store-backed board step for the morning report#44
Merged
Conversation
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Stacked on #43. Adds a
boardstep that reads open knowledge-board cards from the agent state store and renders them grouped by lane — the operational counterpart of the filesystemboard-scan(which is unchanged).boardstep: pure (no subprocess), soft-skips without a store. Optional paramslane(single lane) andproject(filter). With nolane, shows the open work lanesp0/p1/p2(closed lanes only on request). Flags cards withblocked_onrefs as[blocked].data_schema():{lanes:[{lane, cards:[{card_id, project, summary, status, size, blocked}]}], open}— new versioned contract, golden-pinned.builtin_registry; documented-types test + module table updated;board-scan(filesystem) vsboard(store) distinction documented.boardjoinsCONTRACT_CONFIGand 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/listcost).Test plan
just checkgreen (fmt + clippy -D warnings + all tests incl. golden + data-contract; EXIT=0).board_step_missing_store_soft_skips,board_step_lists_open_lanes_only,board_step_honors_lane_param,board_render_flags_blocked_cards, plus goldenboard.jsonand the contract harness validating real output.🤖 Generated with Claude Code