Commit Graph

77 Commits

Author SHA1 Message Date
jared 930ac6e80d os-context: absolute delegation policy (ADR-0043)
10-orchestration.md rewritten from the per-task threshold heuristic to an
absolute policy: main loop as executive, enumerated E-a..E-d exemptions,
one persistent sonnet manager continued via SendMessage, opus escalation
on observed failure only. Audit rubric rewritten to match (exemption
decision procedure, exemption-chaining, delegation-overhead-mismatch,
accepted-cost severity modifiers, read-write sub-tag). WS4 eval retired
as a measurement instrument (contaminated + encodes superseded policy),
kept as harness template.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 10:19:32 -04:00
jared cc2f2914c5 Remediate cc-architect audit findings across os-* plugins (#75-#79)
- os-context: audit-sessions rubric updated to ADR-0042 git-issues-only
  boundary (#75)
- os-backlog: drop dead Planka Config#board/#configured?, retarget tests;
  record ADR-0025 exemption for bin/wakeup-poll in plugin CLAUDE.md (#76)
- os-vault: align hooks/config.py default to graphify-out; refresh stale
  eval/README.md WS2 status (#77)
- gitignore .pytest_cache/ (#78)
- cc-architect: plugin_config resolves actual marketplace from
  installed_plugins.json instead of assuming cc-os (#79)

Opus-reviewed PASS; os-backlog 85 runs / cc-architect script suites green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CTE1yYvTEg1cJZBhKNRZvL
2026-07-16 16:36:23 -04:00
jared 06fff77d75 Merge branch 'worktree-os-sdlc' (os-sdlc concept map + to-tickets rename)
# Conflicts:
#	plugins/os-backlog/skills/route/SKILL.md
2026-07-16 16:24:25 -04:00
jared 23fa2fbdbd os-sdlc: /implement is a skill-as-orchestrator over the agent pipeline
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VgG2g9ooqbnBiZYGAonGYG
2026-07-16 16:23:45 -04:00
jared 5c18ba696f os-sdlc: reviewer is a named agent with hook-assembled context packet
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VgG2g9ooqbnBiZYGAonGYG
2026-07-16 16:18:28 -04:00
jared 4cc524b3a5 os-sdlc: observability node, ADR copy-tag-audit pattern, to-issues→to-tickets rename adopted
- reference/pipeline-observability.md: new tenth concept node (run exhaust,
  predefined lifespans via os-doc-hygiene, copy-tag-audit pattern)
- self-improvement-loops: ADR-audit mechanics via vault-copy hook + virgin-tag
- spec-and-ticket-layer: to-tickets confirmed as Pocock v1.1 rename of
  to-issues (leftover skill removed from ~/.agents/skills)
- OVERVIEW: map + index updated, grill queue recorded
- repo docs: live /to-issues references swapped to /to-tickets

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VgG2g9ooqbnBiZYGAonGYG
2026-07-16 16:08:23 -04:00
jared 65cc751c6f Merge branch 'worktree-os-plugin-standards-audit' (os-plugin standards audit)
Conflicts in CLAUDE.md and docs/implementation-status.md resolved keep-both:
main's Planka-retirement changes + the branch's standards-audit additions.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014HWNfGWoWnhrub4EJa1M1Y
2026-07-16 15:51:04 -04:00
jared 0dd9bc1bee Retire Planka: os-backlog reworked to git-issues-only (ADR-0042)
Executes OpenSpec change retire-planka-git-issues-only (archived, 25/25 tasks):
- os-backlog v0.3.0: Planka lib/CLI/agents deleted; issue-create/issues
  helpers (tea/gh/repo-file dispatch); ten-label taxonomy, human-only next
- planka: rejected fail-soft citing ADR-0042 in tracker grammar,
  config-write, and the os-status check
- Skills, SessionStart note (~687 -> ~444 tokens), /to-issues, os-status fix
  rewritten to the single-tracker model
- All boards snapshotted + pg-dumped (ovh-vps ~/planka-final-snapshot-2026-07-16);
  cards migrated to jared/cc-os#61-70, jared/ops#1-21, jared/llf-schema#7-10
- Planka server decommissioned; planka gem repo archived read-only
- Delta specs synced to openspec/specs/ (issue-backlog, issue-state-labels)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014HWNfGWoWnhrub4EJa1M1Y
2026-07-16 15:48:40 -04:00
jared 79012c4fda os-sdlc: design mapped into concept-node reference docs + OVERVIEW v0.2
Decompose the 2026-07-16 design session into nine independent-context
nodes under plugins/os-sdlc/reference/, with OVERVIEW.md rewritten as
the central concept map + index. Also fixes the dangling
matt-pocock-skills-v1.1-notes.md reference (notes live in the vault as
matt-pocock-skills-v1-1-changes.md; ADR-0037 affected-paths cleaned).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VgG2g9ooqbnBiZYGAonGYG
2026-07-16 15:39:35 -04:00
jared a2b329dd7f Audit os-* plugins against cc-architect standards + remediate
Post-Phase-B standards audit (backlog ticket): ran cc-architect's
audit-plugin checklist against all 8 os-* plugins and remediated:

- index-style CLAUDE.md (ADR-0032) for every plugin; os-doc-hygiene's
  stale cc-plugins-era CLAUDE.md/PRD.md reconciled
- invariants.md added for os-shortcuts and os-vault
- naming convention folded into cc-architect references (canonical:
  references/conventions/cc-os-naming.md); CLAUDE.md + vault note point there
- repo-level bin/test runner for the mixed minitest/pytest suites (6 pass)
- os-vault settings.json hook wiring documented as deliberate
- ADR-0025/os-adr: exemption already recorded in the ADR; no retrofit
- deferred to retire-planka rework: os-backlog ADR-0025 deviations
  (Forgejo jared/cc-os#74), Planka refs in os-context/os-status

Detail: docs/implementation-status/standards-audit.md

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NCs64GAhRWrnjwfGwS4biX
2026-07-16 15:34:41 -04:00
jared 3f76755e85 Adopt cc-architect from cc-plugins (Phase B)
cc-architect (plugin standards authority, v1.0.1) now lives here with the
other universal system plugins, registered in the marketplace manifest and
installed via the standard local-plugins symlink.

Also sync the os-backlog marketplace description to its updated
plugin.json so the cross-repo acceptance gate passes; that rewrite is
otherwise untouched here.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UmdZ3xYPSGpuGv8V3mNv6c
2026-07-16 15:07:46 -04:00
jared b062ac354e docs: hygiene cleanup (2 edits across 2 files)
Auto: 1 (freeze ×1)
Confirmed: 1 (delete ×1)
Skipped (re-analysis recommended): 1
2026-07-15 15:41:55 -04:00
jared 39356ebdbf wip: checkpoint before hygiene cleanup 2026-07-15 15:41:09 -04:00
jared 3466159f7c os-doc-hygiene: sync calibrate-assessment-inventory delta specs to main + archive change
Main specs updated: lifecycle-rulebook (+nominations memory, +canonical
writer-enforced ordering, envelope modified), calibrate (+intake filter,
+consult persistence, persistence-by-scope and class-never-path modified),
doc-clean (extract-then-delete extracted.md pointer). Change archived to
openspec/changes/archive/2026-07-15-calibrate-assessment-inventory/.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LjFRroqLsvkL2WrMJtRBrK
2026-07-15 15:06:38 -04:00
jared 0d303caf43 os-doc-hygiene: calibrate assessment inventory implemented (map #49)
RulesFileWriter (canonical .dochygiene-rules.json serialization) +
NominationIntakeFilter (deterministic Step 3.5) in calibrate_helpers.py;
calibrate SKILL.md Steps 3.5/5/6 wired (open-consults exits, keep/decline/
consult persistence through the writer); patch_applier extract-then-delete
appends the extracted.md vault pointer fail-closed; clean SKILL.md Step 6.5
supplies extraction_pointer. Suite 434 passed (26 new tests). OpenSpec
change: calibrate-assessment-inventory.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LjFRroqLsvkL2WrMJtRBrK
2026-07-15 14:59:58 -04:00
jared 9f11df3e2a os-doc-hygiene: calibrate assessment-inventory design locked — spec deltas + ADR amendments (map #49, ticket #58)
Persist the full :calibrate assessment inventory + rulebook refinements
per wayfinder map #49 (tickets #51-#57, #59): nominations memory
(consults/rejected) in the rules file, deterministic nomination intake
filter, writer-enforced canonical ordering, keep-verdict persistence with
keep-tier relaxation, enumerate-siblings rule-quality test, extracted.md
extract-index convention + global keep rule, judge.md corrective edits,
and the test-coverage decisions. Implementation hands off to an OpenSpec
change.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LjFRroqLsvkL2WrMJtRBrK
2026-07-15 13:58:07 -04:00
jared 807dcc8d90 os-doc-hygiene: post-calibration follow-ups
- Rules: 4 new lifecycle rules for OpenSpec trees (specs/** keep;
  changes/archive/*/ temporary retain 3 / 90d), root + plugins/*
- Fill TBD Purpose placeholders in doc-check + doc-clean specs (the
  doc-check one was a check-run miss: sat under file_length thresholds)
- Report header: "findings: N" + "cleared: K of M evaluated entries"
  (cleared no longer masquerades as files-scanned)
- CLAUDE.md: vault user-guide pointer; fix stale .dochygiene/ state
  path to .cc-os/dochygiene/ (ADR-0027)

Suite: 408 passed, 3 skipped.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LAw7YxP71Fk6K9AHNaYPj2
2026-07-15 10:22:41 -04:00
jared fe04297604 os-doc-hygiene: sync lifecycle delta specs to main + archive change
Main specs gain calibrate, determinism-promotion, lifecycle-deletion,
lifecycle-rulebook (new) and rulebook-aware updates to doc-check,
doc-clean, report-schema. Change archived to
openspec/changes/archive/2026-07-15-lifecycle-aware-doc-hygiene.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LAw7YxP71Fk6K9AHNaYPj2
2026-07-15 08:51:21 -04:00
jared 7b9afb1f6a os-doc-hygiene: lifecycle-aware hygiene implementation + calibration pass #1 (map #31)
Implements the lifecycle-aware-doc-hygiene change (ADR-0038..0041):
rulebook loader (global rulebook.json + per-project .dochygiene-rules.json,
add-only merge, two-axis precedence, IGNORE-sentinel zero-emission prune),
scanner lifecycle signals + temporary/delete-once-served tiers, report
schema delete/extract-then-delete ops with git-state tier derivation,
promotion_candidates from conventions.json, patch-applier deletion ops with
apply-time git re-verification, and the /os-doc-hygiene:calibrate skill.

Calibration pass #1 (cc-os) PASSED: protected-set hard gate + recall floor
9/10 with all 4 mandatory rows; 4 human-approved rules persisted to
repo-root .dochygiene-rules.json. invariants.md #3 (.cc-os/dochygiene per
ADR-0027) and #9 (rulebook IGNORE as third ignore mechanism) corrected
with explicit human approval per the META-RULE.

test_no_global_index_created now runs against an isolated HOME (the real
~/.cc-os legitimately exists since os-backlog's projects registry).
Suite: 408 passed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LAw7YxP71Fk6K9AHNaYPj2
2026-07-15 07:41:59 -04:00
jared e1d22d83ba os-doc-hygiene: lifecycle-aware hygiene design locked — spec + ADR set (map #31, ticket #46)
lifecycle-spec.md consolidates wayfinder decisions #32-#48; ADR-0038
(repo-root .dochygiene-rules.json override), ADR-0039 (evidence-quality
deletion tiers), ADR-0040 (no ignore-surface propagation), ADR-0041
(determinism promotion + conventions catalog).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bvc6togVPDXvkoq8fbHj3e
2026-07-14 16:33:26 -04:00
jared 8be597838d os-backlog: reject flag-like positional board names (card #1818501985909868001)
board-ensure/activate/archive took NAME positionally with no validation, so
`os-backlog board-ensure --board apprise-api` silently created a board
literally named "--board". Add a shared validate_board_name! guard, checked
right after each command shifts its name arg and before build_client, so a
flag-like name fails loudly with no Planka API call.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MuWQ8oJbFU9uPKp7dAB1Pn
2026-07-13 16:35:40 -04:00
jared 0879ef10ae os-context: orchestration prompt — TDD loops and confirmed-defect lists are delegable units
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TUGCrg5osQMLUaSfkBdVZE
2026-07-13 13:26:28 -04:00
jared d303b957f5 os-backlog: board-ensure fails loudly when PLANKA_HUMAN_USER_ID is unset (card #1818408943538406701)
fix_visibility now raises MissingHumanUserIdError instead of silently
creating a bot-only Planka project when no human user id is available.
Existing projects still ensure without the env var. Supersedes card
#1818396164853073182.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TUGCrg5osQMLUaSfkBdVZE
2026-07-13 13:26:27 -04:00
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 3708c0099d os-backlog: wire the triage-trigger hook + arbitrary-project test coverage (cards #1818330518584820864, #1818330528525321347)
hooks/triage_check.rb and the Servers project heuristic/board-ensure
generalization already landed in f9a81a1 but the triage hook was never
registered in hooks.json, so it could never fire. This wires it in
(second SessionStart command, 8s timeout) and adds the missing test
coverage: TriageCheck's needs-triage/note-composition logic, an
arbitrary-project (Servers) BoardEnsurer case, and the ~/servers
resolver-ambiguity fix. Also reconciles session_start.py's pull-beats-push
docstring with the new hook's sanctioned exception, and fixes a stray
comment-indent bug in board_ensurer.rb. Suite 128/282/0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PLudjwx2GWw8CFdYaBzVzK
2026-07-13 11:00:26 -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 49c8f5eace os-backlog slice 8: Operations board + tracker-routing rubric + ADR-0033 (issue #17)
- ADR-0033 canonizes Planka=state / git-issues=specs, tracker key grammar,
  card-as-pointer and promotion rules (cites route/to-issues/session-start).
- os-context audit rubric: new category 8 tracker-routing (compliance only).
- BoardEnsurer label-color fallback also rescues Planka::BadRequestError
  (Planka rejects unknown colors as HTTP 400, found live) + regression test.
- os-status /os-status:fix step d: invoke /os-backlog:route directly instead
  of pre-asking forgejo-vs-planka (boundary rule uses both; cf. issue #26).
- Records updated per index+leaf convention.

Closes #17.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CLeMz48rvG3s9XpAsDxeho
2026-07-13 10:00:36 -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 90db409721 os-backlog slice 7: SessionStart injection note + /to-issues tracker routing (issue #16)
- hooks/session_start.py + hooks.json: WHEN->THEN rules for capture, routing, promotion,
  column ownership, autonomy labels — ADR-0029 semantics (issue body's contract was wrong),
  rules only, zero board state, ~447 tokens injected
- Backlog::Tracker.issues_destination routes /to-issues output by the tracker key
- /to-issues skill itself (global, ~/.agents/skills/to-issues/) updated out-of-repo:
  planka:/unset default = git issues on the repo remote + one Planka pointer card
  (spec/state boundary preserved; human gate decided 2026-07-13)

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 ef8b7e4a52 os-doc-hygiene: deterministic file_length scanner signal (issue #25 part 1)
Objective signal (line count + estimated tokens) fires when either
threshold is exceeded; defaults 400 lines / 4000 tokens, configurable via
constructor and --max-lines/--max-tokens. Injectable token estimator for
tests. Suite: 286 passed. Parts 2-3 (implementation-status distill +
index+PD convention ADR) remain human-gated.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CLeMz48rvG3s9XpAsDxeho
2026-07-13 08:06:48 -04:00
jared 1ab1bf5f8c os-context: prompt-composer plugin supersedes os-orchestration; prompt files authored (ADR-031)
Rename plugins/os-orchestration -> plugins/os-context. SessionStart hook is
now a composer: globs prompts/session-start/*.md in filename order, emits one
additionalContext block, byte-identical for the existing orchestration rules
(tested), line budgets enforced (warn 120 / refuse 240). ORCHESTRATION.md ->
prompts/session-start/10-orchestration.md. New prompt files from the
2026-07-09 audit: 20-kickoff-conventions, 30-standing-safety,
40-decision-memos (total injection 102/120 lines). os-status audit-skill and
state-path references updated (old ~/.local/state path symlinked;
OS_ORCH_AUDIT_LEDGER name kept for compatibility).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CLeMz48rvG3s9XpAsDxeho
2026-07-13 08:06:48 -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 d6f316008d os-shortcuts: new plugin + /wrap session-close skill (ADR-028)
User-invoked QOL commands plugin; domain boundary vs hook-injection
plugins recorded in ADR-028. First resident /os-shortcuts:wrap encodes
the session-close ritual (commit per repo conventions, doc sweep,
handoff) from the 2026-07-09 workflow audit.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QBAYNm4AmczQaEHfXwai5a
2026-07-12 18:53:07 -04:00
jared cf14bb33f9 os-status/os-backlog/os-doc-hygiene: snooze lifecycle + config normalization + .cc-os/<plugin> state consolidation (closes #23, #24; ADR-027)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EFjUjvdsuqjarpNTKKX7pq
2026-07-12 17:47:01 -04:00
jared 3b9c4fbd88 os-backlog: align .cc-os/config with os-status key=value contract (refs #14)
Config parsed/wrote YAML while os-status owns the file as key=value
lines, so config-write output was invisible to the tracker-configured
check. Now reads key=value (legacy 'key: value' lines still accepted)
and merge emits key=value.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EUyiRB4vHaRkhYKUdoMW2P
2026-07-12 16:04:12 -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 bfb747bd7e os-backlog: restore full snapshot card key set + record/verify 0.2.0 migration (refs #18, #19, #20)
Cards#snapshot again emits all 19 Types::Card fields (camelCase) plus
labels — 8df0cb7 had narrowed it to 8 keys, dropping listChangedAt and
silently breaking board-audit's stale-Doing check. A regression test
now pins the complete key set (35 runs green). implementation-status
records the 0.2.0 typed-returns migration and the live end-to-end
verification against the real Planka board (run on ovh-vps 2026-07-10).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BS59Nkb7fvJMFB9dZiwZ7H
2026-07-10 17:13:57 -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
jared 3c5a17c288 os-status: add tracker-configured SessionStart check (refs #11)
Reads the `tracker` key from .cc-os/config, validating the
planka:<board> | forgejo:<owner>/<repo> | github:<owner>/<repo> |
repo:<path> grammar. Present+valid is silent, malformed is a one-line
warn (never a crash), and absent-in-a-git-project is a daily-snoozed
nudge pointing at the os-backlog routing skill.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XknQRvihHDpYE47RTmUR4N
2026-07-10 13:27:42 -04:00
jared 3e42aecc13 os-orchestration: semi-automate the biweekly IRL audit (Option C)
Deterministic layer: audit/bin/audit-stats (Ruby) composes the existing
extract fact-sheets across all production transcripts since the last
run, writes per-run stats/flags/sheets to
~/.local/state/os-orchestration/audit/, and appends the metrics.tsv
trend ledger (seeded with the 2026-07-10 run: 23 sessions).
Judgment layer: new /os-orchestration:audit-sessions skill — sonnet
auditor fan-out over precomputed flagged regions only, tiered
synthesis with run-over-run trend verdicts, stops before any wording
edit. Nudge: os-status check orchestration-audit-due warns when the
ledger is >=14 days stale (missing ledger = machine not opted in).
Planka recurrence entry deferred: gem offsets are +1y/+6m/+3m/+1m by
design; +2w blocked on parked gem versioning decisions.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XknQRvihHDpYE47RTmUR4N
2026-07-10 12:00:10 -04:00
jared 242ca84744 os-orchestration: WS4 IRL re-audit + Tier 1/2 wording patch
First production IRL audit (19 transcripts post-2026-07-08, 3 parallel
auditors; run artifacts in autoresearch/improve-260710-1057/,
gitignored). Solved: model-param discipline, over-delegation. Patched
into ORCHESTRATION.md: settled-design mid-session fan-out trigger,
never-sleep-poll rule, own eval/benchmark loops named as mechanical,
unfamiliar-tree Explore trigger. SendMessage example skipped (no
violations; token budget). One-shot patch — WS4 grids contaminated;
acceptance = next IRL audit.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XknQRvihHDpYE47RTmUR4N
2026-07-10 11:24:59 -04:00
jared cc450c385b os-vault: add SessionStart git pull for multi-machine vault/memsearch freshness
Sync was push-only via SessionEnd (vault_sync.py/memsearch_sync.py); a second
machine's copies could go stale. session_start.py now runs a fast-forward-only,
10s-timeout git pull for both repos before the staleness check — silent on
success, quiet one-line stderr note on failure, never blocking session start.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018Mb3V8NNzAuns7vgX9A2jU
2026-07-10 10:06:55 -04:00
jared 397145b27b os-orchestration: WS4 wording loop shipped — ORCHESTRATION.md v3
Candidate-1 (v3 draft) accepted on iteration 1, confirmed on full grid,
validated on frozen reserve (15/16 cells, negatives 20/20, E5P reserve twin
5/5 both tiers). H3 met: E5P fable median mltok 27,372 = 43% of 62,971
baseline. Results TSVs + loop log + CLAUDE.md/plan status; eval-results vault
note written; limit-banner sweep + econ-guard lessons promoted to methodology
notes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 11:18:43 -04:00
jared ab258d5ba1 os-orchestration eval: key E3P root-cause concepts by scenario id
The reserve twin E3P-retry-storm targets gen-logs' other planted incident
(2026-07-02 auth-token-expiry 401 storm) and was authored before axis B
existed; the single concept table would have failed a compliant model.
Fixed pre-reserve-measurement without reading reserve files (incident chain
comes from gen-logs). Run-set scoring byte-identical; self-test 34/34 incl.
keying proof both directions.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 11:05:03 -04:00