Commit Graph

12 Commits

Author SHA1 Message Date
jared b0a21d6211 os-backlog: post-ship review corrections for the triage hook + project index (cards #1818330518584820864, #1818330528525321347)
Codex review + verification pass over f9a81a1/3708c00 found the triage
hook resolving boards differently from the CLI. Corrections:
- Config#planka_board: tracker=planka:<board> now counts as board
  configuration everywhere (Resolver included), not just the explicit
  board key that config-write never writes.
- Triage hook board resolution extracted to pure
  TriageCheck.board_name_for honoring the umbrella rule: the session
  cwd's .cc-os/config overrides the git root's (the hook previously
  walked up and read only the root config).
- config-write keys the global project index by the realpath of the
  directory the config lands in, not the git toplevel — umbrella
  subprojects no longer overwrite the umbrella's row.
- projects <filter> matches name, tracker, or path; hook timeout
  8s->15s; CC_OS_DEBUG=1 surfaces swallowed hook errors on stderr.
Residual (name-only board lookup across all Planka projects) captured
as Backlog card #1818385174308586768. Suite 138/295/0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VkeTPRWqaqJZEpf48H1aC7
2026-07-13 12:27:43 -04:00
jared 43932d40ab os-backlog: wakeup-polling + tmux-convention design spike (issue #28, ADR-0035/0036)
Poll + tmux direction chosen at the human gate. Thin pilot: Backlog::Wakeup
+ bin/wakeup-poll (dry-run default; opt-in wakeup=true; afk-ready acts,
semi triage-only, else pull-only notify). No cron installed. Suite 128/0.
Follow-up: single designated poller machine; cadence deferred to first opt-in.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CLeMz48rvG3s9XpAsDxeho
2026-07-13 11:02:44 -04:00
jared f9a81a17c5 os-backlog: cross-project filing convention + derived global project index (issue #27, ADR-0034)
Backlog::ProjectIndex at ~/.cc-os/projects.json, upserted fail-soft by
config-write, queried via new 'projects' subcommand. Discoverer template +
filing mechanics reference doc; CROSS-PROJECT rule line in the SessionStart
note. ADR-0034 Accepted. Suite 112/233/0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CLeMz48rvG3s9XpAsDxeho
2026-07-13 10:48:19 -04:00
jared 9415eb0d65 os-backlog: route inspect issue-shape classification, split-by-kind default (issue #26)
inspect fetches remote-issue metadata (fail-soft) and emits issue_shape:
sequential-chain|flat-adhoc|mixed|null via a pure classifier. Route step 2
rewritten as three branches with split as the default for spec-shaped issue
sets (one tracker key, no migration); step 3 never-re-trigger exception;
boundary rule cites ADR-0033. Suite 103/212/0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CLeMz48rvG3s9XpAsDxeho
2026-07-13 10:32:58 -04:00
jared 46b0584643 os-backlog: cache resolved Planka board id in .cc-os/config (issue #22)
- Backlog::BoardResolver with injected config read/write; Cards does no filesystem I/O
- board_id honored only for planka: trackers; id hit validated against returned board
  name; 404/mismatch/cache failure degrades to name lookup and rewrites the cache
- comment-preserving Config.set mirrors os-status's writer (Config.merge not used)
- FakePlankaClient boards.get 404 support; 14 new tests; suite 90 runs / 0 failures

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CLeMz48rvG3s9XpAsDxeho
2026-07-13 09:18:45 -04:00
jared 7a264f1175 os-backlog: card-move with CLI-enforced column ownership (ADR-029)
Adds card-move over planka-api Cards#move; ownership rules enforced in
lib (never Next, never hitl, never out of Done, Done only for
afk-ready). afk-ready cards now skip Review per user decision; semi
still stops at Review. Skills updated to "working a card means moving
it". Suite 68 runs/153 assertions.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QBAYNm4AmczQaEHfXwai5a
2026-07-12 19:11:49 -04:00
jared 696aefcf23 os-status + os-backlog: /os-status:fix unified setup/update + /os-backlog:route tracker onboarding (closes #21, refs #14, ADR-026)
os-status (#21): fix skill orchestrates remediation of failing checks via a
new hooks/checks.py --json runner; remediation pointers on every Check; new
project-graph-present and config-version-current checks; version= stamping
in .cc-os/config; banner names /os-status:fix as the single entry point.
Suite 64 tests (was 36).

os-backlog (#14): route skill (inspect + config-write subcommands,
lib/backlog/tracker.rb + inspector.rb); destination choice and live-history
migration are named human gates; Config.merge preserves other keys. Suite
54 runs / 110 assertions (was 35). Rollout (onboard cc-os, then one more
project) still pending, so #14 stays open.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EUyiRB4vHaRkhYKUdoMW2P
2026-07-12 15:54:08 -04:00
jared 8df0cb7e1e os-backlog: migrate to planka-api 0.2.0 typed returns
0.2.0 returns Planka::Types value objects instead of parsed-JSON
hashes. Replace all hash access with typed accessors, rebuild
Cards#snapshot output as explicit string-keyed hashes (JSON output
stays byte-compatible, so skill/agent contracts are unchanged), and
rewrite test fakes on real Planka::Types records. 34 runs green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014GjXD4ZDsucFZXNgVVrnZB
2026-07-10 16:51:49 -04:00
jared 27f8e5f2b2 os-backlog: card-triage + board-audit named agents (refs #15)
Two agent definitions. card-triage batch-labels raw Backlog cards with
one priority (P0-P3) and one autonomy (hitl/semi/afk-ready) label —
label changes only, ambiguity defaults to hitl. board-audit reports the
four drift classes (stale Doing, WIP over cap, Waiting unblocked, aging
Review) and writes at most one comment per drifting card. Both
definitions state the column-ownership constraints: never move cards
past Review, never pull Next, never touch Done.

Supporting read/write primitives: Cards#attach_label + Cards#comment,
exposed as card-label / card-comment subcommands alongside the existing
read-only snapshot JSON. Fake-client unit tests, no live API.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XknQRvihHDpYE47RTmUR4N
2026-07-10 13:44:13 -04:00
jared 3bcf3a1b48 os-backlog: capture + list skills, card CLI (refs #13)
/os-backlog:capture resolves repo -> board via the pure resolver, runs
board-ensure transparently when the board is missing, and creates the
card at Backlog only. /os-backlog:list is strictly pull-based — board
state is never injected unasked. Both skills state the column-ownership
rules (create at Backlog only, move Doing -> Review at most, never pull
Next, never move Review -> Done, never self-assign hitl cards) and fail
soft when the gem/Planka is unavailable.

New Backlog::Cards lib class + card-add / cards / snapshot subcommands;
fake-client unit tests, no live API. Manual live verification is still
pending: the planka-api gem is not installed in this environment.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XknQRvihHDpYE47RTmUR4N
2026-07-10 13:41:44 -04:00
jared 8d4b1c7f46 os-backlog: routing resolver CLI (refs #12)
Pure repo -> board decision function (Backlog::Resolver) plus the
`resolve` os-backlog subcommand: given repo path, .cc-os/config contents,
and a board-name inventory (all passed in — no filesystem or network
access in the resolver itself), returns exactly one of "use <board>" /
"activate <archived board>" / "stop-and-discuss". An explicit config
board takes precedence; otherwise the board name is derived from the
repo/client dir basename with project inferred from ~/dev vs ~/clients.
Unmapped paths, and configured-but-unmatched boards, both resolve to
stop-and-discuss rather than silently falling back. Pure Ruby unit tests,
no network.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XknQRvihHDpYE47RTmUR4N
2026-07-10 13:36:08 -04:00
jared 9a0e8a79fb os-backlog: plugin scaffold + board-ensure (refs #10)
Idempotent board-ensure over the installed planka-api gem: uniform lists
(Backlog/Next/Doing/Waiting/Review/Done), uniform label set (P0-P3, hitl,
semi, afk-ready) with per-label color-candidate fallback since Planka's
color whitelist isn't documented, the archived--<name> rename convention
(activate/archive primitives; ensure never archives automatically), and
the bot-created-project visibility fix (shared-type project + explicit
project-manager add + null ownerProjectManagerId). Unit tests stub the
client layer entirely — no live API calls.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XknQRvihHDpYE47RTmUR4N
2026-07-10 13:35:18 -04:00