Skip to content

chore(work-items): bind tracker seam to github, seed empty recurring schedule - #700

Merged
kyle-sexton merged 1 commit into
mainfrom
chore/bind-work-item-tracker-seam-560
Jul 20, 2026
Merged

chore(work-items): bind tracker seam to github, seed empty recurring schedule#700
kyle-sexton merged 1 commit into
mainfrom
chore/bind-work-item-tracker-seam-560

Conversation

@kyle-sexton

Copy link
Copy Markdown
Contributor

Summary

  • Binds the work-item-tracker seam for this repo: .work-item-tracker.json with provider: github, lease_ttl_hours: 24.
  • Seeds .github/recurring-schedule.json as an empty {"items":[]} skeleton so due/recheck/work stop reporting "no recurring schedule configured" instead of hard-erroring.

Fix

.work-item-tracker.json was never committed on this repo (the flagship dogfood repo for the work-items plugin family), so every seam coordination verb (list-frontier, claim, reclaim) exit-3'd here. This forced the /work-items:work loop lanes to bypass the seam entirely via direct gh label queries.

Per issue #560's decision brief (RECOMMENDED option, confirmed via a live human interview this session):

  • Provider: github — the only bundled adapter with reclaim/race-safe claim; local-markdown is never a coordination surface (reclaim: false in its manifest).
  • lease_ttl_hours: 24 — reclaim's activity check (non-lease comments, open cross-referenced PRs) means TTL never steals active work; it only bounds a crashed session's stale claim.
  • Empty recurring-schedule skeleton — stops degradation without starting any cadence clock; real recurring items deferred to a separate seeding pass.
  • No config.role_labels remap — verified against CONTRACT.md's list-frontier spec directly: --autonomous only excludes needs-human-labeled items, it never gates inclusion on the autonomous-eligible label. So this repo's status: ready (vs. the skill's agent-ready default, which is actually a medley-only GovernedRepositories.cs ExtraLabel, not part of the org _core taxonomy) is a cosmetic naming difference, not a functional gap.

Verification

  • jq . on both new files: valid JSON.
  • git check-ignore -v on both paths: not ignored (exit 1).
  • Re-ran the setup check probes against the written files: binding parses, carries schema_version/provider/config.lease_ttl_hours; schedule parses with the {"items":[]} root shape.
  • No lint/build changes — pure config addition, no code touched.

Related

Closes #560

🤖 Generated with Claude Code

…schedule

Resolves #560 — .work-item-tracker.json was never committed, so every
seam verb (list-frontier, claim, reclaim) exit-3'd on this dogfood repo.
Binds provider: github, lease_ttl_hours: 24 (only bundled adapter with
claim/reclaim; local-markdown is never a coordination surface). Seeds
.github/recurring-schedule.json as an empty {"items":[]} skeleton so
due/recheck/work stop degrading; real cadence items deferred to a
separate seeding pass. No role_labels remap: CONTRACT.md's list-frontier
only excludes needs-human under --autonomous, never gates inclusion on
autonomous-eligible, so the agent-ready/status:ready label naming
mismatch is cosmetic, not functional.

Closes #560

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@kyle-sexton kyle-sexton added the automated Opened by automation. label Jul 20, 2026
@claude

claude Bot commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 2m 17s —— View job


PR Review

  • Gather context from PR description and changed files
  • Read .work-item-tracker.json
  • Read .github/recurring-schedule.json
  • Review config values for correctness and schema alignment
  • Check security considerations
  • Post findings

Verdict: LGTM — both files are minimal, correct, and ready to merge.

.work-item-tracker.json

The committed file exactly matches the canonical example in both CONTRACT.md (Setup section) and setup/SKILL.md:

{
  "schema_version": "1.0",
  "provider": "github",
  "config": { "lease_ttl_hours": 24 }
}

Validated against lib/binding.sh wit_read_binding:

Check Value Result
schema_version matches 1.* "1.0"
provider matches ^[a-zA-Z0-9_-]+$ "github"
config.lease_ttl_hours matches ^[0-9]+$ 24
config.storage_dir required only for local-markdown omitted

lease_ttl_hours: 24 is the value the setup skill explicitly recommends. As the PR notes, reclaim's activity check (non-lease comments, open cross-referenced PRs) means the TTL only bounds a crashed session's stale claim — it won't steal active work. Sound choice.

No config.role_labels remap is correct. The PR's reasoning is verified directly against lib/frontier.sh:

and (if $auto == "true"
     then (((.labels // []) | index($human_gated)) | not)
     else true
     end)

--autonomous only excludes items labeled needs-human — it never gates inclusion on agent-ready. The default role mappings work for this repo without any remap.

.github/recurring-schedule.json

The {"items":[]} skeleton is exactly what setup/SKILL.md prescribes as the fallback:

otherwise write the empty {"items": []} skeleton so the recurring actions stop degrading

And it satisfies the check probe shape requirement (line 119 of setup/SKILL.md):

a present file parses as JSON with the root {"items": [ ... ]} shape (FAIL otherwise)

With this file present, track due will now report "All recurring items are current" (with zero due items) instead of hard-stopping with "no recurring schedule configured". Correct behavior change.

Security

Both files are pure non-secret config — no tokens, no paths, no execution surfaces. The github adapter requires no secrets in the binding (ambient gh CLI only), as CONTRACT.md explicitly documents. Nothing concerns me here.

Minor Notes (non-blocking)

  1. Zero-item edge in track due: due.md ends with "If nothing is due: 'All recurring items are current. Next due: {item} on {date}'". With zero items in the schedule, there is no {item} or {date} to interpolate. This is a pre-existing spec gap surfaced by the empty skeleton — worth a follow-up issue when the seeding pass happens, but not a blocker here.

  2. Recurring-schedule seeding deferred: The PR correctly defers seeding real items to a separate pass. Given the volume of candidates this repo would generate (CI workflows, plugin manifests, dependency files), a dedicated seeding session makes sense.

Both files check out against the contract, implementation, and recommended values. No changes needed.

@kyle-sexton
kyle-sexton marked this pull request as ready for review July 20, 2026 16:48
@claude

claude Bot commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 1m 27s —— View job


PR Review — chore(work-items): bind tracker seam to github, seed empty recurring schedule

  • Gather context from PR description and changed files
  • Read .work-item-tracker.json
  • Read .github/recurring-schedule.json
  • Verify against plugin contracts and schemas
  • Check security considerations
  • Post findings

Verdict: LGTM — both files are minimal, correct, and ready to merge.

.work-item-tracker.json

{
  "schema_version": "1.0",
  "provider": "github",
  "config": { "lease_ttl_hours": 24 }
}

Validated against lib/binding.sh wit_read_binding:

Field Constraint (from binding.sh) Value Result
schema_version [[ "$version" == 1.* ]] (line 38) "1.0"
provider ^[a-zA-Z0-9_-]+$ (line 44) "github"
config.lease_ttl_hours required (line 45, no empty) 24
config.storage_dir required only for local-markdown (line 48) omitted

lease_ttl_hours: 24 matches the value the setup skill recommends. Per CONTRACT.md, reclaim's activity check (non-lease comments, open cross-referenced PRs) means the TTL only reclaims crashed-session claims, not active work.

No config.role_labels remap is correct. CONTRACT.md lines 58–61 confirms --autonomous only excludes needs-human-labeled items from the frontier — it never gates inclusion on agent-ready. The default mappings are sufficient for this repo.

.github/recurring-schedule.json

{
  "items": []
}

The {"items":[]} skeleton exactly satisfies the check probe shape requirement from setup/SKILL.md line 119:

a present file parses as JSON with the root {"items": [ ... ]} shape (FAIL otherwise)

And it stops the degradation path documented at line 118: track due will now report "All recurring items are current" instead of hard-stopping. Correct behavior change.

Security

Both files are pure non-secret config — no tokens, credentials, paths, or execution surfaces. The github adapter requires no secrets in the binding (ambient gh CLI only), as documented in CONTRACT.md. Nothing concerns me.

Minor Note (non-blocking)

Zero-item edge in track due: With no items in the schedule, the "All recurring items are current. Next due: {item} on {date}" message template has no values to interpolate. This is a pre-existing spec gap now surfaced by the empty skeleton — worth tracking when the seeding pass lands, but not a blocker here.

Both files check out against the contract, implementation, and recommended values. No changes needed.

@kyle-sexton
kyle-sexton merged commit d08289e into main Jul 20, 2026
20 of 21 checks passed
@kyle-sexton
kyle-sexton deleted the chore/bind-work-item-tracker-seam-560 branch July 20, 2026 18:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

automated Opened by automation.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

work-items(work): tracker seam never bound in claude-code-plugins itself — .work-item-tracker.json absent, every seam verb exit-3's

1 participant