Skip to content

board-ingest: pull GitHub issues into board cards#50

Merged
hartsock merged 1 commit into
mainfrom
feat/board-ingest
Jun 10, 2026
Merged

board-ingest: pull GitHub issues into board cards#50
hartsock merged 1 commit into
mainfrom
feat/board-ingest

Conversation

@hartsock

@hartsock hartsock commented Jun 9, 2026

Copy link
Copy Markdown
Owner

Summary

Closes the ingestion gap noted when retiring the board-scan skill: modulex had card storage but nothing to populate the board from a tracker. Adds a board-ingest step that turns open GitHub issues into board cards.

Per repo (spec.repos or shared.github_repos):
gh issue list -R <repo> --state open --json number,title,url,labels --limit <N> (via ExecGate), then store.card_add per issue with a stable card_id gh-<owner>-<repo>-<number> so re-runs upsert, never duplicate:

  • lane = highest priority label p0/p1/p2, else [board] default_lane (→ p2)
  • summary = title; status = blocked if a blocked label is present
  • refs {issue: <url>}; source = github, source_id = <url>

Soft-skips: no store; all-repos-auth-failed (with the gh auth login hint, parity with github-pr-scan). limit param (default 100). data_schema {repos:[{repo, state, ingested, card_ids}]} — golden pinned.

This step writes to the store mid-routine (like url-watch), so a "good morning" routine can refresh the board from GitHub before rendering it (board-ingestboard).

Disclosure tier: step.

Fixes #49

Test plan

  • just check green (fmt + clippy -D warnings + all tests incl. golden + data-contract; EXIT=0).
  • Unit: lane_for_picks_highest_priority_then_default, ingests_issues_as_cards_idempotently (p0/p1+blocked/default mapping, source fields, runs twice → still 3 cards), auth_failure_soft_skips, no_store_soft_skips.

FIXTURE-SYNC: the gh issue-list JSON shape is exercised by tests/live_contract.rs::live_gh_pr_list_json_shape.

🤖 Generated with Claude Code

WHAT: Add a `board-ingest` step that lists open GitHub issues via `gh` and
upserts a board card per issue — the ingestion half of the retired
board-scan workflow (modulex already had the card storage).

Per repo (spec.repos or shared.github_repos):
  gh issue list -R <repo> --state open --json number,title,url,labels --limit N
Each issue → store.card_add with a STABLE card_id `gh-<owner>-<repo>-<number>`
so re-runs upsert (idempotent), never duplicate:
  - lane   = highest priority label p0/p1/p2, else [board] default_lane (→ p2)
  - summary = issue title
  - status = "blocked" if a blocked label is present
  - refs {issue: <url>}; source = "github", source_id = <url>
All-auth-failed soft-skips with the gh auth login hint (parity with
github-pr-scan); soft-skips without a store. `limit` param (default 100).
data_schema {repos:[{repo, state, ingested, card_ids}]}; golden pinned.

This step WRITES to the store mid-routine, like url-watch — so "good
morning" can refresh the board from GitHub before showing it.

Disclosure tier: step. Registered + documented + data-contract + golden.
FIXTURE-SYNC: the gh issue-list JSON shape is exercised by
tests/live_contract.rs::live_gh_pr_list_json_shape.

Fixes #49

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 merged commit d316169 into main Jun 10, 2026
1 check passed
@hartsock hartsock deleted the feat/board-ingest branch June 10, 2026 00:46
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.

board-ingest: pull GitHub issues into board cards (close the board-scan gap)

1 participant