@ikon85/agent-workflow-kit 0.42.1 → 0.44.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/.agents/skills/grill-me/SKILL.md +3 -1
  2. package/.agents/skills/grill-with-docs/SKILL.md +3 -1
  3. package/.agents/skills/kit-update/SKILL.md +9 -11
  4. package/.agents/skills/orchestrate-wave/SKILL.md +8 -8
  5. package/.agents/skills/setup-workflow/SKILL.md +20 -18
  6. package/.agents/skills/setup-workflow/board-sync.md +4 -1
  7. package/.agents/skills/setup-workflow/workflow-advisories.md +3 -2
  8. package/.agents/skills/setup-workflow/worktree-lifecycle.md +36 -31
  9. package/.agents/skills/to-issues/SKILL.md +43 -0
  10. package/.agents/skills/wrapup/SKILL.md +98 -54
  11. package/.claude/skills/grill-me/SKILL.md +3 -1
  12. package/.claude/skills/grill-me-codex/SKILL.md +3 -1
  13. package/.claude/skills/grill-with-docs/SKILL.md +3 -1
  14. package/.claude/skills/grill-with-docs-codex/SKILL.md +3 -1
  15. package/.claude/skills/kit-update/SKILL.md +9 -11
  16. package/.claude/skills/orchestrate-wave/SKILL.md +8 -8
  17. package/.claude/skills/setup-workflow/SKILL.md +20 -18
  18. package/.claude/skills/setup-workflow/board-sync.md +4 -1
  19. package/.claude/skills/setup-workflow/workflow-advisories.md +3 -2
  20. package/.claude/skills/setup-workflow/worktree-lifecycle.md +36 -31
  21. package/.claude/skills/to-issues/SKILL.md +43 -0
  22. package/.claude/skills/wrapup/SKILL.md +98 -54
  23. package/README.md +268 -7
  24. package/agent-workflow-kit.package.json +42 -42
  25. package/package.json +16 -2
  26. package/scripts/marker_lib.py +3 -0
  27. package/scripts/profile_globs.py +26 -45
  28. package/scripts/release-delta-guard.mjs +29 -4
  29. package/scripts/worktree-lifecycle/README.md +57 -154
  30. package/scripts/worktree-lifecycle/capabilities.json +2 -3
  31. package/scripts/worktree-lifecycle/classify.py +480 -0
  32. package/scripts/worktree-lifecycle/cleanup.py +9 -29
  33. package/scripts/worktree-lifecycle/core.py +68 -1289
  34. package/scripts/worktree-lifecycle/ignore_seed.py +1 -1
  35. package/scripts/worktree-lifecycle/profile.py +46 -29
  36. package/scripts/worktree-lifecycle/setup.py +7 -19
  37. package/scripts/wrapup-land.py +1292 -545
  38. package/src/consumer-migrations.json +1 -16
  39. package/src/lib/bundle.mjs +31 -1
  40. package/docs/adr/0001-consumer-divergence-policy.md +0 -53
  41. package/docs/adr/0002-capability-gated-orchestration.md +0 -70
  42. package/docs/adr/0003-kit-core-and-project-extension-lifecycle.md +0 -63
  43. package/docs/adr/0004-release-intent-is-a-version-tag.md +0 -64
  44. package/docs/adr/0005-to-issues-is-the-planning-facade.md +0 -42
  45. package/docs/adr/0006-routing-knowledge-access-and-policy-are-separate.md +0 -95
  46. package/docs/adr/0007-session-teardown-requires-provenance-bound-ownership.md +0 -88
  47. package/docs/adr/0008-planning-ignore-rules-are-offered-never-installed.md +0 -84
  48. package/docs/adr/0009-teardown-authority-is-stateless-repository-classification.md +0 -101
  49. package/docs/adr/0010-model-roster-replaces-the-optimization-dial.md +0 -87
  50. package/docs/agents/board-sync.md +0 -74
  51. package/docs/agents/code-review.md +0 -14
  52. package/docs/agents/domain.md +0 -7
  53. package/docs/agents/issue-tracker.md +0 -23
  54. package/docs/agents/skills/local-ci.md +0 -90
  55. package/docs/agents/skills/orchestrate-wave.md +0 -166
  56. package/docs/agents/skills/spec-self-critique.md +0 -18
  57. package/docs/agents/triage-labels.md +0 -10
  58. package/docs/agents/workflow-capabilities.json +0 -28
  59. package/docs/conventions/spec-completeness.md +0 -23
  60. package/docs/research/agent-task-taxonomy-benchmark-coverage.md +0 -451
  61. package/docs/research/benchlm-routing-source.md +0 -198
  62. package/docs/research/consumer-owned-protocol-files.md +0 -238
  63. package/docs/research/frontend-agent-benchmarks.md +0 -282
  64. package/docs/research/model-effort-routing-benchmarks.md +0 -261
  65. package/docs/research/provider-neutral-agent-routing.md +0 -207
  66. package/docs/research/wave-152-consumer-acceptance.md +0 -98
  67. package/docs/research/wave-43-script-hook-census.md +0 -128
  68. package/scripts/build-kit.mjs +0 -117
  69. package/scripts/build-kit.test.mjs +0 -204
  70. package/scripts/census/census.test.mjs +0 -252
  71. package/scripts/census/state.test.mjs +0 -15
  72. package/scripts/census/transaction.test.mjs +0 -103
  73. package/scripts/census-contract.test.mjs +0 -227
  74. package/scripts/check-kit-staleness.mjs +0 -45
  75. package/scripts/check-kit-staleness.test.mjs +0 -19
  76. package/scripts/codex-exec-scenarios/fake-codex.mjs +0 -152
  77. package/scripts/codex-exec.test.mjs +0 -871
  78. package/scripts/grill-census-wiring-guard.mjs +0 -87
  79. package/scripts/grill-census-wiring-guard.test.mjs +0 -107
  80. package/scripts/kit-release.test.mjs +0 -273
  81. package/scripts/kit-update-pr.test.mjs +0 -151
  82. package/scripts/lib/audit-refs.mjs +0 -146
  83. package/scripts/lib/scrub.mjs +0 -113
  84. package/scripts/lib/scrub.test.mjs +0 -187
  85. package/scripts/memory-lifecycle/memory-lifecycle.test.mjs +0 -170
  86. package/scripts/portability_profile_scan.py +0 -53
  87. package/scripts/release-delta-guard.test.mjs +0 -151
  88. package/scripts/release-parity.test.mjs +0 -90
  89. package/scripts/release-state.test.mjs +0 -360
  90. package/scripts/test_anchor_table.py +0 -69
  91. package/scripts/test_board_bootstrap.py +0 -348
  92. package/scripts/test_board_sync.py +0 -208
  93. package/scripts/test_board_sync_create_idempotency.py +0 -117
  94. package/scripts/test_board_sync_wave_title.py +0 -120
  95. package/scripts/test_census_backstop.py +0 -712
  96. package/scripts/test_census_forward_contract.py +0 -91
  97. package/scripts/test_census_update_contract.test.mjs +0 -454
  98. package/scripts/test_codex_adapter_sync_contract.py +0 -169
  99. package/scripts/test_dist_kit_smoke.py +0 -220
  100. package/scripts/test_drift_guard_diagnostics.py +0 -295
  101. package/scripts/test_issue_claim_contract.py +0 -169
  102. package/scripts/test_kit_docs_language_census.py +0 -178
  103. package/scripts/test_marker_lib.py +0 -162
  104. package/scripts/test_orchestrate_wave_contract.py +0 -381
  105. package/scripts/test_pr_body_check.py +0 -264
  106. package/scripts/test_profile_globs.py +0 -280
  107. package/scripts/test_program_planning_contract.py +0 -133
  108. package/scripts/test_release_authorization_contract.py +0 -101
  109. package/scripts/test_render_anchor.py +0 -267
  110. package/scripts/test_retro_wrapup_contract.py +0 -153
  111. package/scripts/test_skill_code_review_seed.py +0 -89
  112. package/scripts/test_skill_codex_exec_lifecycle.py +0 -123
  113. package/scripts/test_skill_frontmatter_lint.py +0 -234
  114. package/scripts/test_skill_gh_lint.py +0 -124
  115. package/scripts/test_skill_language_census.py +0 -254
  116. package/scripts/test_skill_optional_readiness.py +0 -171
  117. package/scripts/test_skill_portability_lint.py +0 -866
  118. package/scripts/test_skill_precommit_template.py +0 -30
  119. package/scripts/test_skill_publish_audit.py +0 -358
  120. package/scripts/test_skill_readiness_contract.py +0 -264
  121. package/scripts/test_skill_readiness_preflight.py +0 -180
  122. package/scripts/test_skill_required_readiness.py +0 -233
  123. package/scripts/test_skill_selfcontainment_lint.py +0 -255
  124. package/scripts/test_skill_setup_workflow_seeds.py +0 -691
  125. package/scripts/test_skill_stale_name_lint.py +0 -126
  126. package/scripts/test_skill_surface_refs.py +0 -300
  127. package/scripts/test_skill_trailing_artifact_lint.py +0 -71
  128. package/scripts/test_tdd_contract.py +0 -78
  129. package/scripts/test_worktree_ignore_seed.py +0 -320
  130. package/scripts/test_worktree_setup_base_guard.py +0 -140
  131. package/scripts/test_worktree_wrapup_contract.py +0 -1648
  132. package/scripts/test_wrapup_land.py +0 -428
  133. package/scripts/worktree-lifecycle/session.py +0 -1857
@@ -1,101 +0,0 @@
1
- # Teardown authority is stateless repository classification
2
-
3
- Status: accepted (2026-07-27, #320) — supersedes
4
- [ADR-0007](./0007-session-teardown-requires-provenance-bound-ownership.md)
5
-
6
- ADR-0007 derived teardown authority from persisted lifecycle evidence:
7
- ownership-proof refs acquired in atomic git transactions, frozen
8
- landing-attempt journals, baseline digests, no-follow identity binding, and a
9
- post-merge reload of the canonical cleanup policy. Every piece was locally
10
- justified, and the aggregate failed in practice: fifteen teardown/cleanup
11
- issues in two weeks (#245–#319), ~5,600 lines of lifecycle code, two recovery
12
- flags for the machinery's own bookkeeping, a legacy receipt contract, and
13
- refusals that did not name their cause (#319: 68,856 paths, 7.4 MB, zero
14
- actionable lines). The protection was aimed at narrow races between assessment
15
- and deletion; the cost was that ordinary sessions could no longer finish.
16
-
17
- We decided that teardown authority comes from the repository's **current
18
- state**, read at the moment of action, and from nothing else:
19
-
20
- 1. **Git's own classification is the file taxonomy.** A tracked modification
21
- blocks teardown. An untracked, non-ignored file blocks with a bounded
22
- report (count plus top directories — never an unbounded path dump). An
23
- ignored file is Scratch: the repository declared it not-work, and it is
24
- deletable. "Ignored" means git's standard exclude sources
25
- (`--exclude-standard`: repository `.gitignore` files, `.git/info/exclude`,
26
- the global excludes file) — whatever the repository's own tooling treats as
27
- ignored is deletion authority here too.
28
- 2. **One hardcoded exception: `.env*` (basename glob).** Ignored yet
29
- potentially irreplaceable. Before removal each `.env*` regular file is
30
- compared byte-wise with its counterpart at the same relative path in the
31
- main checkout, both opened no-follow: identical → derived copy, deletable;
32
- divergent, absent in the main checkout, or either side not a regular file →
33
- block with the exact files named. The check is a present-state comparison,
34
- not a receipt.
35
- 3. **The platform PR record authorizes branch deletion.** Force-deletion
36
- requires exactly one PR matching the full tuple — this repository as base
37
- repo, head repository equal to the base repo (no fork heads), head ref
38
- equal to the branch name, base ref equal to the configured protected
39
- branch, state merged — whose head SHA equals the branch tip OID; the OID
40
- is re-read immediately before deletion, and zero matches, multiple
41
- matches, an open PR on the same head, or any drift retains the branch.
42
- Ancestry-merged branches (against a freshly fetched configured protected
43
- branch — stale ancestry stops rather than guesses) delete normally. A
44
- branch with neither stays and is reported. Without platform access this
45
- degrades to ancestry-only, reported honestly.
46
- 4. **Idempotency by re-check, not journal.** An interrupted landing is resumed
47
- by re-running it; every step verifies present state (PR exists? merged?
48
- worktree present?) and skips or proceeds. There is no persisted attempt
49
- state to validate, archive, or recover.
50
- 5. **A direct `/wrapup` invocation is the teardown authorization.** It lands
51
- and tears down the worktree it runs in — including worktrees created by
52
- external tools under foreign names and paths. The kit never conditions
53
- teardown on its own naming or location conventions; the four classification
54
- rules above are the only protection.
55
- 6. **Deletion policy has exactly one configuration surface: the ignore
56
- mechanism.** The consumer profile keeps structural facts only (worktree
57
- root, templates, protected branches, sweep opt-in). `scratchPatterns` and
58
- `landingGeneratedArtifactPatterns` are removed without migration —
59
- including the shipped consumer migration that seeded them; making a file
60
- deletable means ignoring it (ADR-0008's offered seeding remains the
61
- supported way; its consequence about deriving `scratchPatterns` from the
62
- seeded rules is obsolete with this decision).
63
-
64
- ## Considered options
65
-
66
- - **Keep ADR-0007's provenance machinery:** rejected on empirical grounds. The
67
- races it closes (a foreign file occupying an assessed path between
68
- assessment and deletion, a same-name branch created concurrently) are rare
69
- and low-harm next to the observed failure mode: routine teardown becoming
70
- impossible and each repair adding machinery. The branch race is additionally
71
- closed cheaper by the tip-SHA/PR comparison.
72
- - **Shipping default scratch patterns:** rejected. A default allowlist of the
73
- deletable restarts the pattern catalog and its seeding, sync, and dialect
74
- problems; `.gitignore` already encodes the same fact with universal
75
- tooling.
76
- - **Migrating existing profiles and receipts:** rejected. The green-slate cut
77
- is deliberate (#320): old keys are ignored, journaled attempts are inert
78
- files, and no code path reads either. Maintaining both models would preserve
79
- the complexity this decision removes.
80
- - **Location heuristic for externally created worktrees (land, don't tear
81
- down):** rejected by the user. `/wrapup` means tear down; splitting the
82
- outcome by worktree origin reintroduces an ownership notion.
83
-
84
- ## Consequences
85
-
86
- - A worktree whose only untracked content is ignored dependency or build
87
- output is removable with zero configuration. #319's failure class cannot
88
- occur.
89
- - Refusals are bounded and name their cause; the fix is always visible
90
- (commit the tracked change, handle the named `.env*`, ignore or remove the
91
- named untracked files).
92
- - The accepted residual risk is explicit: between assessment and deletion a
93
- file could in principle be replaced; a valuable file a consumer keeps
94
- gitignored outside `.env*` is deletable at teardown. We trade these narrow
95
- windows for a lifecycle that ordinary sessions can actually complete.
96
- - Planning sessions stop being a special case: durable content lands through
97
- wrapup's Content route as ordinary work, scratch dies with the worktree,
98
- and worktree creation binds to implementation, not planning.
99
- - The lifecycle implementation shrinks from a transaction protocol to a
100
- classification function plus plumbing; its tests shift from race
101
- choreography to classification truth tables.
@@ -1,87 +0,0 @@
1
- # A Model roster replaces the optimization dial
2
-
3
- Status: accepted (2026-07-27, Program #287, Welle 18 / #294) — supersedes the
4
- Routing-policy clause of
5
- [ADR-0006](./0006-routing-knowledge-access-and-policy-are-separate.md)
6
-
7
- ADR-0006 made "optimization goals and optional advanced overrides" inputs of
8
- the Routing policy, and setup asked the user to pick Balanced, Quality, or
9
- Cost. That dial cannot be made to work. The goal is always the right model for
10
- the job, and a cheap-but-weak model can cost more per completed task than a
11
- strong one — so a Cost dial does not express a preference the resolver can act
12
- on without knowing cost per *completed* task, which no benchmark owner
13
- publishes. Meanwhile the dial was never read: `readRoutingProfile` has zero
14
- callers and `resolveRoute` always returns `routing-infrastructure-missing`.
15
-
16
- We decided the user control is a **Model roster** — a positive list of
17
- model-and-effort pairs the user authorizes — plus three **Standard routes**
18
- that decide when no decisive evidence covers the resolved Routing intent.
19
-
20
- 1. **The optimization dial is removed everywhere it appears, not only from the
21
- Routing policy.** The Routing intent loses its optimization goal too. What a
22
- user is willing to spend is a Routing profile choice, not a property of the
23
- work; leaving the field in the intent while the resolver ignores it would
24
- leave a dead concept in the domain language. The glossary entry and the
25
- intent schema both drop it.
26
- 2. **`unreachable` and `missingInfrastructure` are kept.** They are unrelated to
27
- the dial, and the resolver's fallback semantics depend on them.
28
- 3. **Transport authorization belongs to the Routing profile.** Selecting Claude
29
- Code and Codex does not authorize either to drive the other's CLI. ADR-0006
30
- is already explicit that a detected transport is not an approved one; this
31
- ADR names where the approval is stored — the global profile document, as its
32
- own interview answer, narrowable per project by intersection only.
33
- 4. **The Routing policy is derived, not stored.** The profile is the stored
34
- personal choice and carries no revision. The policy is the constraint object
35
- derived from profile plus inventory for one dispatch, and it carries the
36
- composed revision so a Dispatch receipt can prove which constraints applied.
37
- 5. **Cost is displayed and used as a tiebreak inside a cohort of identical
38
- currency and unit — never as the ranking motor.** This is what the Cost dial
39
- was reaching for, at the only altitude where it is honest.
40
- 6. **The Kit ships no opinion about which models are good.** Excluding a model
41
- is one user's preference under one subscription, not a default truth. The
42
- inventory stays unfiltered per ADR-0006; the roster authorizes.
43
-
44
- ## `inherit` is retained, and the condition that would have removed it
45
-
46
- This ADR was drafted to remove `inherit` entirely if verify-spike 18c (#296)
47
- could not prove that the session-default model-and-effort pair is readable back
48
- and identifiable against the roster. **The spike came back positive, so
49
- `inherit` is retained** in the constrained form: inheritance is permitted only
50
- when the session-default pair is attested *and* inside the effective roster,
51
- and otherwise blocks.
52
-
53
- The condition under which `inherit` is removed entirely therefore stands as a
54
- standing test, not a settled negative: **if the session-default pair ceases to
55
- be readable back on a surface, `inherit` is removed for that surface rather
56
- than left as an unprovable path.** A receipt that cannot name the pair it
57
- inherited is not proof of anything.
58
-
59
- The spike qualifies the retention with an identification requirement. One and
60
- the same Claude Code session reports its default model under three different
61
- identifiers — `opus[1m]` in `~/.claude/settings.json`, `claude-opus-5[1m]` in
62
- the session's init event, and `claude-opus-5` in the server-returned
63
- `message.model`. The attested channel is the one that drops the context
64
- variant. Roster identification therefore requires an explicit normalization
65
- rule and a decision on whether the context variant is part of pair identity;
66
- until that rule exists, "identified against the roster" is not a check a
67
- receipt may claim to have made.
68
-
69
- ## Consequences
70
-
71
- - ADR-0006's Routing-policy clause (item 3, "optimization goals and optional
72
- advanced overrides") and its closing sentence "Model preferences and
73
- optimization overrides remain optional advanced settings" no longer describe
74
- the system. The rest of ADR-0006 — the separation of Evidence catalog, Access
75
- graph, and Routing policy; detection is not authorization; the surface
76
- adapter capability declaration; the Dispatch receipt requirement — stands
77
- unchanged and remains the foundation this ADR builds on.
78
- - `advanced.optimization` is removed from the Routing profile schema, and
79
- `optimization` from the Routing policy schema, each with a deterministic
80
- version-aware decoder that records the drop rather than silently discarding a
81
- choice the user made.
82
- - Setup's Balanced / Quality / Cost prompt is replaced by roster admission and
83
- Standard-route nomination.
84
- - Model-and-effort is pair identity. Effort domains are per model — some models
85
- support an effort level others do not, and some carry no effort axis at all —
86
- so a pair is authorized as a pair, never as a model with an effort attached
87
- afterwards.
@@ -1,74 +0,0 @@
1
- <!-- setup-workflow: state=filled; mode=github-projects-v2 -->
2
- # Board sync — GitHub Projects field IDs
3
-
4
- The workflow board is [Agent Workflow Kit](https://github.com/users/iKon85/projects/3). Board-managed skills address it through the profile below and `scripts/board-sync.py`.
5
-
6
- <!-- board-sync:profile -->
7
- ```json
8
- {
9
- "repo": "iKon85/agent-workflow-kit",
10
- "project": {
11
- "number": 3,
12
- "owner": "iKon85",
13
- "nodeId": "PVT_kwHOAuH31M4BdM5V"
14
- },
15
- "fields": {
16
- "status": {
17
- "id": "PVTSSF_lAHOAuH31M4BdM5VzhXwFOk",
18
- "options": {
19
- "Idea": "357a9b54",
20
- "Triaged": "463d3f21",
21
- "Spec": "1cd0343b",
22
- "In Progress": "35e6c509",
23
- "Review": "51f16b28",
24
- "Done": "491150b6"
25
- },
26
- "roles": {
27
- "idea": "Idea",
28
- "triaged": "Triaged",
29
- "spec": "Spec",
30
- "inProgress": "In Progress",
31
- "review": "Review",
32
- "done": "Done"
33
- }
34
- },
35
- "wave": "PVTF_lAHOAuH31M4BdM5VzhXwFWg",
36
- "cluster": "PVTF_lAHOAuH31M4BdM5VzhXwFWk",
37
- "specPath": "PVTF_lAHOAuH31M4BdM5VzhXwFWo",
38
- "planPath": "PVTF_lAHOAuH31M4BdM5VzhXwFWs",
39
- "phase": {
40
- "id": "PVTSSF_lAHOAuH31M4BdM5VzhXwFWw",
41
- "options": {
42
- "P1": "9c8c93e0",
43
- "P2": "cf741bec",
44
- "P3": "8a69a61e"
45
- }
46
- }
47
- },
48
- "labels": {
49
- "readyForAgent": "ready-for-agent",
50
- "typePrefix": "type:",
51
- "clusterType": "type:cluster",
52
- "waveStub": "wave-stub",
53
- "programType": "type:program"
54
- },
55
- "branchPrefixes": ["feat", "fix", "chore", "docs"],
56
- "prMarkers": {
57
- "partOf": "Part of",
58
- "retroMarker": "**Retro:**",
59
- "retroValues": ["ran", "skipped"]
60
- },
61
- "headings": {
62
- "vorBau": "Clarify Before Build"
63
- },
64
- "titles": {
65
- "wavePrefix": "Welle"
66
- },
67
- "wrapup": {
68
- "remoteBranchSweep": true
69
- }
70
- }
71
- ```
72
-
73
- The Program route uses phases `P1`, `P2`, and `P3`. Saved board views remain a GitHub UI concern; the machine profile above is the workflow SSOT.
74
-
@@ -1,14 +0,0 @@
1
- <!-- setup-workflow: state=filled -->
2
- # Code-review project layer
3
-
4
- ## Standards sources in this repo
5
-
6
- - `CLAUDE.md` and `AGENTS.md`
7
- - `docs/conventions/`
8
- - The originating issue or PRD for the Spec axis
9
-
10
- ## Adjacent review tooling
11
-
12
- - `spec-self-critique` reviews plans before code exists; it does not replace diff review.
13
- - Security audits and simplification passes remain narrower complementary checks.
14
-
@@ -1,7 +0,0 @@
1
- <!-- setup-workflow: state=filled -->
2
- # Domain docs
3
-
4
- This is a single-context repository. Before design work, read root `CONTEXT.md` when present and the relevant decisions under `docs/adr/`. Their absence is non-blocking: `grill-with-docs` creates them when the product language or a durable decision first needs recording.
5
-
6
- Use glossary terms consistently in issues, tests, and skill text. Surface conflicts with an existing ADR instead of silently replacing its decision.
7
-
@@ -1,23 +0,0 @@
1
- <!-- setup-workflow: state=filled -->
2
- # Issue tracker: GitHub
3
-
4
- Issues and PRDs for this repo live in `iKon85/agent-workflow-kit` as GitHub issues.
5
-
6
- ## Conventions
7
-
8
- - Use `gh` for issue reads and comments; infer the repository from the remote.
9
- - Write multi-line issue and PR bodies through a temporary file and `--body-file`.
10
- - Route board writes, status/wave/cluster field edits, dependencies, and sub-issue links through `scripts/board-sync.py`, not bare `gh project` commands.
11
- - Board state is authoritative for workflow status; GitHub issues remain the durable content source.
12
-
13
- ## Pickup claim
14
-
15
- Used by `/implement`, `/diagnose`, and `/orchestrate-wave` before the first
16
- edit. Board status `In Progress` is the human-facing signal; the claim below is
17
- the machine-readable one, and it is the only one that names the branch and
18
- worktree a colliding session would have to find.
19
-
20
- - **Check**: `gh issue view <n> --json assignees,comments --jq '{assignees: [.assignees[].login], claims: [.comments[].body | select(contains("<!-- agent-claim:"))]}'` — a foreign assignee or a marker this session did not plant is a foreign claim: stop, report the claimed branch/worktree, and leave it alone.
21
- - **Claim**: `gh issue edit <n> --add-assignee @me`, then `gh issue comment <n> --body '<!-- agent-claim: branch=<branch>; worktree=<absolute-path>; date=<YYYY-MM-DD> -->'`. Board status stays a `scripts/board-sync.py` write, never a bare `gh project` call.
22
- - **Release**: the slice PR (`closes #<n>` / `Part of #<anchor>`) supersedes the claim, so `/wrapup` needs no extra step. On abandon: `gh issue edit <n> --remove-assignee @me` plus a `claim released` comment.
23
-
@@ -1,90 +0,0 @@
1
- <!-- setup-workflow: state=filled -->
2
- <!-- agent-workflow-kit: project-extension/v1; skill=local-ci -->
3
- # Project layer — local-ci
4
-
5
- This repo is a Node + stdlib-Python repo with no database, no dev server and no
6
- typecheck step, so the two generic profiles map onto a short command set. Run the
7
- two commands below; do not infer others.
8
-
9
- Prerequisite once per clone (worktrees inherit it):
10
-
11
- ```sh
12
- git config core.hooksPath .githooks
13
- ```
14
-
15
- ## Fast static guards
16
-
17
- The skill/manifest lints, ~3s, no network, no DB. This is exactly what
18
- `.githooks/pre-commit` runs, so a normal commit already covers it:
19
-
20
- ```sh
21
- python3 -m unittest discover -s scripts -p 'test_skill_*.py' -q
22
- ```
23
-
24
- ## Full gate
25
-
26
- Mirrors the `test` job in `.github/workflows/ci.yml` step for step. Run it from
27
- the branch's worktree root before opening a PR:
28
-
29
- ```sh
30
- npm test
31
- npm run kit:staleness
32
- npm run release:guard -- --base "$(git merge-base origin/main HEAD)"
33
- npm pack --dry-run
34
- ```
35
-
36
- Notes on the individual steps:
37
-
38
- - `npm test` is `test:node` (`node --test`) plus `test:python`
39
- (`python3 -m unittest discover -s scripts -p 'test_*.py'`). Several negative-path
40
- tests print `[FAIL] …` lines by design; only the runner's own summary and exit
41
- code decide red or green.
42
- - CI runs `npm install --ignore-scripts` first. Locally that is only needed after
43
- a dependency change.
44
- - `release:guard` runs in CI on `pull_request` only, against
45
- `github.event.pull_request.base.sha`. `git merge-base origin/main HEAD` is the
46
- local equivalent; `git fetch origin main` first if `origin/main` is stale.
47
- - `npm pack --dry-run` catches packaging drift (a file added outside the
48
- published set) without publishing anything.
49
-
50
- ## Enforcement
51
-
52
- Since #220 the host **does** enforce: the `main protection` ruleset makes the CI
53
- job `test` a required status check on `main`, with no bypass actor. So the
54
- generic skill's "When the host CAN enforce" branch applies to this repo — the
55
- local gate is a pre-flight that shortens the feedback loop, not the only thing
56
- standing between a red branch and `main`.
57
-
58
- Layered, from cheapest to strongest:
59
-
60
- | Layer | Runs | Scope |
61
- | --- | --- | --- |
62
- | `pre-commit` | automatic, every commit | fast skill/manifest lints |
63
- | `pre-push` | automatic, every push | full `npm test` |
64
- | this full gate | explicit, before a PR | `npm test` + staleness + release guard + pack |
65
- | CI `test` | automatic, on the PR | the same set, machine-enforced at merge |
66
-
67
- Never bypass a hook with `--no-verify`.
68
-
69
- **Drift rule.** The full gate above and `.github/workflows/ci.yml` are two copies
70
- of one list. Change one, change the other in the same PR — otherwise the local
71
- gate goes green on a set the required check does not accept.
72
-
73
- ## Contention
74
-
75
- Not applicable here. This repo has no dev server and the suites are process-level
76
- (`node --test`, `unittest`), so the generic boot-contention false-red guidance has
77
- no target. A red is a real red until an isolated re-run of that one test proves
78
- otherwise.
79
-
80
- ## On a red
81
-
82
- 1. Read the failing assertion — the guards print the exact drift (`file:line`,
83
- the offending token, the missing manifest key).
84
- 2. Fix the source. A guard that legitimately cannot be satisfied yet gets a
85
- documented allowlist entry with a reason; never widen a guard silently.
86
- 3. Re-run the single failing suite, then the full gate for sign-off.
87
-
88
- `kit:staleness` red almost always means the generated kit artefacts lag the
89
- skill sources — run `npm run kit:build` and commit the result rather than
90
- editing the generated output by hand.
@@ -1,166 +0,0 @@
1
- <!-- setup-workflow: state=filled -->
2
- <!-- agent-workflow-kit: project-extension/v1; skill=orchestrate-wave -->
3
- # Project layer — orchestrate-wave
4
-
5
- Filled 2026-07-27 after Welle 18 (#289) ran the whole loop end-to-end — recon,
6
- build, integrate, verify, land, tag, publish — and proved the recipe below. The
7
- sections were deliberately empty until then; the generic fallback carried that
8
- run and cost it a `degraded` start plus a hand-derivation of every command here.
9
-
10
- This repo has **no database, no dev server, no typecheck step and no browser
11
- surface**, so several generic phases collapse to very little. Where that is the
12
- case the section says so rather than inventing a command.
13
-
14
- ## §Setup
15
-
16
- Nothing to start. No DB, no tunnel, no service, no dev server — Phase 0's
17
- "start what live-verify needs" is a no-op here.
18
-
19
- Two things that are *not* no-ops:
20
-
21
- - `git config core.hooksPath .githooks` once per clone (worktrees inherit it).
22
- - `npm install` in the wave worktree after fast-forwarding to `origin/main` —
23
- the lockfile is untracked, so dependencies do not travel with the branch.
24
-
25
- ## §Builder Commands
26
-
27
- Per-slice gate, run by the implementer before reporting back:
28
-
29
- ```sh
30
- npm test # test:node (node --test) + test:python (unittest)
31
- ```
32
-
33
- The fast pre-commit lints run automatically via `.githooks/pre-commit`
34
- (~3 s, skill/manifest lints). A slice is not "green" on the fast lints alone.
35
-
36
- ## §Builder Hard Rules
37
-
38
- - **Never `--no-verify`.** pre-commit and pre-push are the backstop, not an
39
- obstacle.
40
- - **English-first prose** in every published skill; the language census in the
41
- maintainer suite enforces it.
42
- - **No hardcoded board values** — labels, headings, field IDs and status names
43
- come from `docs/agents/board-sync.md`; the portability lint blocks literals.
44
- - **Dual-surface mirror in the same PR.** A changed `.claude/skills/<s>/SKILL.md`
45
- needs its `.agents/skills/<s>/SKILL.md` mirror via `codex-adapter-sync` in the
46
- same PR, never after merge.
47
- - **Shipped-file changes must preserve the manifest/reconcile contract.**
48
-
49
- ## §Integration Suites
50
-
51
- Both frameworks, every time — `npm test` runs both and a red in either is a red:
52
-
53
- ```sh
54
- npm test
55
- ```
56
-
57
- - `test:node` — `node --test` (665 tests as of 0.42.0)
58
- - `test:python` — `python3 -m unittest discover -s scripts -p 'test_*.py'`
59
- (522 tests as of 0.42.0)
60
-
61
- There is no typecheck step in this repo; do not look for one. Several
62
- negative-path tests print `[FAIL] …` lines **by design** — only the runner's own
63
- summary and exit code decide red or green.
64
-
65
- ## §Verify Recipe
66
-
67
- Central verify is the `/local-ci` full gate, run from the wave worktree root.
68
- It mirrors the CI `test` job step for step:
69
-
70
- ```sh
71
- git fetch origin main
72
- npm test
73
- npm run kit:staleness
74
- npm run release:guard -- --base "$(git merge-base origin/main HEAD)"
75
- npm pack --dry-run
76
- ```
77
-
78
- - **No branch-name-derived guard exists here**, so the generic skill's warning
79
- about an integrated verify branch blocking with no baseline does not apply.
80
- No skip or override is needed.
81
- - **No browser, no headless login, no screenshots, no console check, no DB
82
- compare, no design/brand check.** This repo ships text; "assert the AC as a
83
- user-visible outcome" means reading the artefact the slice produced (an ADR,
84
- a skill body, a script's output) and the tests that pin it.
85
- - **`release:guard` red with "shipped delta has no version bump" is not a
86
- failure of the wave** — it means the wave touched the shipped consumer set and
87
- the release metadata is missing. See §Landing.
88
- - **A flaky red is possible.** `scripts/codex-exec.test.mjs` contains
89
- timing-sensitive tests that fail under CPU contention (#345). Re-run the single
90
- test in isolation before treating it as a real red; a test that is green in
91
- isolation and red under load is contention, not the wave.
92
-
93
- ## §Headless Login
94
-
95
- Not applicable. No application, no browser surface, no authenticated session.
96
- Never invent a login recipe for this repo.
97
-
98
- ## §Landing
99
-
100
- **One PR for the whole wave**, base `main`. `main` is protected by the
101
- `main protection` ruleset: a PR is required, the CI job **`test`** (job name, not
102
- the workflow name `CI`) must be green with the branch up to date, and there are
103
- no bypass actors — `gh pr merge --admin` does not help.
104
-
105
- - `Closes #<n>` on its own line per leaf; `Part of #<anchor>` for the anchor,
106
- never `closes`.
107
- - Body via temp file + `--body-file`, and **run `gh` from the repo** (it resolves
108
- the target repo from the cwd).
109
-
110
- **Anchor reconcile, on PR create and on merge:**
111
-
112
- ```sh
113
- python3 scripts/board-sync.py anchor-sync <anchor#> --dry-run # review first
114
- python3 scripts/board-sync.py anchor-sync <anchor#>
115
- ```
116
-
117
- `anchor-sync` only works on a **promoted** anchor whose body carries a slice
118
- table between `<!-- slice-table:start -->` and `<!-- slice-table:end -->`. A
119
- stub-shaped anchor (a bullet list of slices, `wave-stub` label) makes it a no-op
120
- that exits 1 with "no slice table found — nothing to sync". That is a promotion
121
- gap, not a sync failure: install the table with the columns
122
- `| # | Status | Slice | Sub-Issue | Gate | closes/refs |`, drop the `wave-stub`
123
- label, then re-run. Do not hand-maintain the Status cells afterwards — they are
124
- regenerated from the board.
125
-
126
- **Completion, after merge:**
127
-
128
- ```sh
129
- python3 scripts/board-sync.py add --issue <anchor#> --status-role done
130
- gh issue close <anchor#> --reason completed --comment "…"
131
- python3 scripts/board-sync.py item-of --issue <anchor#> # re-read: status must be Done
132
- python3 scripts/board-sync.py parent-of <anchor#> # Program-PRD?
133
- python3 scripts/board-sync.py program-sync <prd#> # after the anchor is Done
134
- ```
135
-
136
- Closing the issue does **not** move the board field — set the field, then re-read
137
- both.
138
-
139
- **New issues** go through `python3 scripts/board-sync.py create --title … --body-file …`,
140
- never a bare `gh issue create`.
141
-
142
- ### Release lockstep
143
-
144
- There is no deploy and no migration, but there **is** a publication gate, and a
145
- wave that touches the shipped consumer set (anything in the kit manifest —
146
- including `docs/adr/*` and `docs/research/*`) drags it along.
147
-
148
- 1. `npm run release:prepare -- --base origin/main` reports the delta and a
149
- `recommendedBump` without writing anything.
150
- 2. **The confirmed Semver is the one human gate.** Ask, unless an explicit
151
- end-to-end mandate covers release preparation. That confirmed version then
152
- authorizes metadata, merge, tag *and* publish — do not ask again after merge.
153
- 3. `npm run release:prepare -- --version <x.y.z>`, commit the bump.
154
- 4. Merge the PR. Merging **integrates only**; it cannot publish.
155
- 5. Verify on canonical `main`: tip == merge commit, `package.json` version
156
- matches, no existing tag. Then `git tag -a v<x.y.z> <main-tip> -m "…"` and
157
- push. The annotated tag on the `main` tip is the sole publication intent.
158
- 6. **A red release run does not prove nothing was published.** Read
159
- `npm view @ikon85/agent-workflow-kit version` and `gh release view v<x.y.z>`
160
- directly, plus `npm run release:status` (cache-bypassing), before reacting.
161
- 7. **Recovery is `gh workflow run release.yml -f tag=v<x.y.z>` on the existing
162
- tag** — the reconciler is idempotent. **Never recover by bumping the version.**
163
-
164
- The release workflow runs the full suite *after* the tag is pushed, so a flaky
165
- test strands an already-published tag. That is the recovery path above, not a
166
- reason to re-tag.
@@ -1,18 +0,0 @@
1
- <!-- setup-workflow: state=filled -->
2
- <!-- agent-workflow-kit: project-extension/v1; skill=spec-self-critique -->
3
- # Project layer — spec-self-critique
4
-
5
- The generic checklist owns the checks; `/retro` appends project-specific incidents below these stable anchors.
6
-
7
- ## Point 1
8
- ## Point 2
9
- ## Point 3
10
- ## Point 4
11
- ## Point 5
12
- ## Point 6
13
- ## Point 7
14
- ## Point 8
15
- ## Point 9
16
- ## Point 10
17
- ## Point 11
18
- ## Point 12
@@ -1,10 +0,0 @@
1
- <!-- setup-workflow: state=filled -->
2
- # Triage labels
3
-
4
- | Canonical role | Label in this repository | Meaning |
5
- |---|---|---|
6
- | `needs-info` | `needs-info` | Waiting for information from the reporter |
7
- | `ready-for-agent` | `ready-for-agent` | Fully specified and safe for an AFK agent |
8
-
9
- The board Status field owns `Idea`, `Triaged`, `Spec`, `In Progress`, `Review`, and `Done`. Close rejected work instead of adding a separate `wontfix` workflow label.
10
-
@@ -1,28 +0,0 @@
1
- {
2
- "worktreeLifecycle": {
3
- "enabled": true,
4
- "worktreeRoot": ".worktrees",
5
- "branchTemplate": "{type}/{issue}-{slug}",
6
- "pathTemplate": "{issue}-{slug}",
7
- "branchRegex": "^(?:feat|fix|chore|docs)/(?P<issue>\\d+)-",
8
- "mainBranches": ["main"],
9
- "protectedBranches": ["main"],
10
- "scratchPatterns": [
11
- "PLAN.md",
12
- "PLAN-REVIEW-LOG.md",
13
- ".claude/logs/**"
14
- ],
15
- "setupEntry": "python3 scripts/worktree-lifecycle/setup.py",
16
- "setupSteps": [],
17
- "riskyCommandPatterns": [
18
- "\\b(?:npm|pnpm|yarn)\\s+(?:run\\s+)?(?:test|typecheck|build)\\b",
19
- "\\bgit\\s+(?:commit|push)\\b"
20
- ]
21
- },
22
- "wrapup": {
23
- "landingGeneratedArtifactPatterns": [
24
- "dist-kit/**",
25
- "**/__pycache__/**"
26
- ]
27
- }
28
- }
@@ -1,23 +0,0 @@
1
- <!-- setup-workflow: state=filled -->
2
- # Convention — Spec completeness before implementation
3
-
4
- ## Self-Critique-Check
5
-
6
- **Trigger:** A spec states a concrete count, quantity, or `N of M` claim.
7
-
8
- **Check:** Is each number freshly derived from the source rather than estimated or recalled?
9
-
10
- **Korrektur:** Recount from code and replace the claim, or mark it explicitly as an implementation-time assumption.
11
-
12
- ## Vertical-slice completeness
13
-
14
- Every user-facing slice is an outcome tracer, carries at least one acceptance criterion, names its estimated blast radius, and identifies seam ownership. Every prep slice names the omitted half and the later slice that closes it. `to-issues` must re-derive this readiness rather than trusting a pre-cut table.
15
-
16
- ## Self-Critique-Check
17
-
18
- **Trigger:** A spec contains a wave/slice table or decomposes into multiple issues.
19
-
20
- **Check:** Are rows outcomes rather than layer names, and do enablers name the outcome wave that closes them?
21
-
22
- **Korrektur:** Reword or split layer-only rows and make every deferred half explicit.
23
-