warpline 1.0.0__tar.gz

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 (140) hide show
  1. warpline-1.0.0/.agents/skills/filigree-workflow/SKILL.md +325 -0
  2. warpline-1.0.0/.agents/skills/filigree-workflow/examples/sprint-plan.json +30 -0
  3. warpline-1.0.0/.agents/skills/filigree-workflow/references/team-coordination.md +202 -0
  4. warpline-1.0.0/.agents/skills/filigree-workflow/references/workflow-patterns.md +178 -0
  5. warpline-1.0.0/.agents/skills/loomweave-workflow/.fingerprint +1 -0
  6. warpline-1.0.0/.agents/skills/loomweave-workflow/SKILL.md +407 -0
  7. warpline-1.0.0/.agents/skills/wardline-gate/SKILL.md +68 -0
  8. warpline-1.0.0/.agents/skills/warpline-workflow/SKILL.md +64 -0
  9. warpline-1.0.0/.agents/skills/warpline-workflow/examples/changed-to-reverify.json +71 -0
  10. warpline-1.0.0/.agents/skills/warpline-workflow/references/contract.md +54 -0
  11. warpline-1.0.0/.agents/skills/warpline-workflow/references/degrade-and-federation.md +53 -0
  12. warpline-1.0.0/.agents/skills/warpline-workflow/references/tools.md +62 -0
  13. warpline-1.0.0/.claude/settings.json +49 -0
  14. warpline-1.0.0/.claude/skills/filigree-workflow/SKILL.md +325 -0
  15. warpline-1.0.0/.claude/skills/filigree-workflow/examples/sprint-plan.json +30 -0
  16. warpline-1.0.0/.claude/skills/filigree-workflow/references/team-coordination.md +202 -0
  17. warpline-1.0.0/.claude/skills/filigree-workflow/references/workflow-patterns.md +178 -0
  18. warpline-1.0.0/.claude/skills/loomweave-workflow/.fingerprint +1 -0
  19. warpline-1.0.0/.claude/skills/loomweave-workflow/SKILL.md +407 -0
  20. warpline-1.0.0/.claude/skills/wardline-gate/SKILL.md +68 -0
  21. warpline-1.0.0/.claude/skills/warpline-workflow/SKILL.md +64 -0
  22. warpline-1.0.0/.claude/skills/warpline-workflow/examples/changed-to-reverify.json +71 -0
  23. warpline-1.0.0/.claude/skills/warpline-workflow/references/contract.md +54 -0
  24. warpline-1.0.0/.claude/skills/warpline-workflow/references/degrade-and-federation.md +53 -0
  25. warpline-1.0.0/.claude/skills/warpline-workflow/references/tools.md +62 -0
  26. warpline-1.0.0/.github/workflows/ci.yml +49 -0
  27. warpline-1.0.0/.github/workflows/release.yml +100 -0
  28. warpline-1.0.0/.gitignore +13 -0
  29. warpline-1.0.0/.mcp.json +35 -0
  30. warpline-1.0.0/AGENTS.md +180 -0
  31. warpline-1.0.0/CHANGELOG.md +76 -0
  32. warpline-1.0.0/CLAUDE.md +180 -0
  33. warpline-1.0.0/LICENSE +21 -0
  34. warpline-1.0.0/PKG-INFO +234 -0
  35. warpline-1.0.0/README.md +213 -0
  36. warpline-1.0.0/docs/evidence/2026-06-13-dogfood-readiness.md +28 -0
  37. warpline-1.0.0/docs/evidence/2026-06-13-mcp-smoke.md +28 -0
  38. warpline-1.0.0/docs/evidence/2026-06-13-source-grounding.md +28 -0
  39. warpline-1.0.0/docs/evidence/member-dirty-baseline.txt +22 -0
  40. warpline-1.0.0/docs/federation/contracts.md +63 -0
  41. warpline-1.0.0/docs/integration/post-admission-consumer-tickets.md +36 -0
  42. warpline-1.0.0/docs/plans/2026-06-12-warpline-delivery.md +3615 -0
  43. warpline-1.0.0/docs/plans/2026-06-13-warpline-1-0-readiness.md +211 -0
  44. warpline-1.0.0/docs/plans/2026-06-13-warpline-implementation-goal-prompt.md +73 -0
  45. warpline-1.0.0/docs/product/agentic-mcp-product-design.md +94 -0
  46. warpline-1.0.0/docs/product/current-state.md +93 -0
  47. warpline-1.0.0/docs/product/decisions/0001-product-candidate-ownership.md +67 -0
  48. warpline-1.0.0/docs/product/federation-value-add-and-mcp-first-audit.md +972 -0
  49. warpline-1.0.0/docs/product/metrics.md +45 -0
  50. warpline-1.0.0/docs/product/prds/PRD-0001-agent-first-mcp-productization.md +96 -0
  51. warpline-1.0.0/docs/product/roadmap.md +37 -0
  52. warpline-1.0.0/docs/product/vision.md +87 -0
  53. warpline-1.0.0/loomweave.yaml +53 -0
  54. warpline-1.0.0/pyproject.toml +64 -0
  55. warpline-1.0.0/scripts/check_no_member_diffs.sh +18 -0
  56. warpline-1.0.0/scripts/check_release_candidate.sh +14 -0
  57. warpline-1.0.0/scripts/check_source_grounding.py +54 -0
  58. warpline-1.0.0/scripts/run_spike.sh +62 -0
  59. warpline-1.0.0/solution-architecture/00-scope-and-context.md +65 -0
  60. warpline-1.0.0/solution-architecture/01-requirements.md +29 -0
  61. warpline-1.0.0/solution-architecture/02-nfr-specification.md +20 -0
  62. warpline-1.0.0/solution-architecture/03-nfr-mapping.md +13 -0
  63. warpline-1.0.0/solution-architecture/04-solution-overview.md +49 -0
  64. warpline-1.0.0/solution-architecture/05-tech-selection-rationale.md +27 -0
  65. warpline-1.0.0/solution-architecture/06-descoped-and-deferred.md +16 -0
  66. warpline-1.0.0/solution-architecture/07-c4-context.md +29 -0
  67. warpline-1.0.0/solution-architecture/08-c4-containers.md +33 -0
  68. warpline-1.0.0/solution-architecture/09-component-specifications.md +54 -0
  69. warpline-1.0.0/solution-architecture/10-data-model.md +56 -0
  70. warpline-1.0.0/solution-architecture/11-interface-contracts.md +53 -0
  71. warpline-1.0.0/solution-architecture/13-deployment-view.md +24 -0
  72. warpline-1.0.0/solution-architecture/14-requirements-traceability-matrix.md +29 -0
  73. warpline-1.0.0/solution-architecture/15-integration-plan.md +38 -0
  74. warpline-1.0.0/solution-architecture/17-risk-register.md +18 -0
  75. warpline-1.0.0/solution-architecture/adrs/0001-spike-first-posture.md +30 -0
  76. warpline-1.0.0/solution-architecture/adrs/0002-read-side-hook-fed-ingestion.md +33 -0
  77. warpline-1.0.0/solution-architecture/adrs/0003-sei-primary-locator-first-class.md +32 -0
  78. warpline-1.0.0/solution-architecture/adrs/0004-aggregator-firewall.md +41 -0
  79. warpline-1.0.0/spike/REPORT.md +90 -0
  80. warpline-1.0.0/spike/SPIKE-BRIEF.md +53 -0
  81. warpline-1.0.0/spike/measurements.json +7 -0
  82. warpline-1.0.0/src/warpline/__init__.py +2 -0
  83. warpline-1.0.0/src/warpline/cli.py +310 -0
  84. warpline-1.0.0/src/warpline/commands.py +569 -0
  85. warpline-1.0.0/src/warpline/dogfood.py +563 -0
  86. warpline-1.0.0/src/warpline/envelope.py +71 -0
  87. warpline-1.0.0/src/warpline/errors.py +139 -0
  88. warpline-1.0.0/src/warpline/git.py +168 -0
  89. warpline-1.0.0/src/warpline/install.py +25 -0
  90. warpline-1.0.0/src/warpline/install_support.py +489 -0
  91. warpline-1.0.0/src/warpline/locators.py +26 -0
  92. warpline-1.0.0/src/warpline/loomweave.py +238 -0
  93. warpline-1.0.0/src/warpline/mcp.py +497 -0
  94. warpline-1.0.0/src/warpline/mcp_smoke.py +194 -0
  95. warpline-1.0.0/src/warpline/productization.py +123 -0
  96. warpline-1.0.0/src/warpline/propagation.py +92 -0
  97. warpline-1.0.0/src/warpline/py.typed +1 -0
  98. warpline-1.0.0/src/warpline/refs.py +78 -0
  99. warpline-1.0.0/src/warpline/reverify.py +79 -0
  100. warpline-1.0.0/src/warpline/siblings.py +159 -0
  101. warpline-1.0.0/src/warpline/skills/warpline-workflow/SKILL.md +64 -0
  102. warpline-1.0.0/src/warpline/skills/warpline-workflow/examples/changed-to-reverify.json +71 -0
  103. warpline-1.0.0/src/warpline/skills/warpline-workflow/references/contract.md +54 -0
  104. warpline-1.0.0/src/warpline/skills/warpline-workflow/references/degrade-and-federation.md +53 -0
  105. warpline-1.0.0/src/warpline/skills/warpline-workflow/references/tools.md +62 -0
  106. warpline-1.0.0/src/warpline/snapshot.py +207 -0
  107. warpline-1.0.0/src/warpline/store.py +487 -0
  108. warpline-1.0.0/tests/contracts/test_golden_vectors.py +359 -0
  109. warpline-1.0.0/tests/contracts/test_warpline_contract_fixtures.py +90 -0
  110. warpline-1.0.0/tests/fixtures/contracts/warpline/golden-vectors.json +43 -0
  111. warpline-1.0.0/tests/fixtures/contracts/warpline/mcp-response-changed.json +71 -0
  112. warpline-1.0.0/tests/fixtures/contracts/warpline/mcp-response-reverify.json +52 -0
  113. warpline-1.0.0/tests/fixtures/contracts/warpline/mcp-tool-inventory.json +223 -0
  114. warpline-1.0.0/tests/install/test_install_doctor.py +125 -0
  115. warpline-1.0.0/tests/integration/test_hx1_live.py +46 -0
  116. warpline-1.0.0/tests/integration/test_loomweave_live.py +15 -0
  117. warpline-1.0.0/tests/spike/test_harness.py +50 -0
  118. warpline-1.0.0/tests/test_commands.py +134 -0
  119. warpline-1.0.0/tests/test_consumer_ticket_package.py +26 -0
  120. warpline-1.0.0/tests/test_dogfood.py +107 -0
  121. warpline-1.0.0/tests/test_git_backfill.py +136 -0
  122. warpline-1.0.0/tests/test_hooks.py +45 -0
  123. warpline-1.0.0/tests/test_locators.py +23 -0
  124. warpline-1.0.0/tests/test_loomweave_probe.py +55 -0
  125. warpline-1.0.0/tests/test_loomweave_snapshot_adapter.py +15 -0
  126. warpline-1.0.0/tests/test_mcp.py +290 -0
  127. warpline-1.0.0/tests/test_package.py +22 -0
  128. warpline-1.0.0/tests/test_product_workspace.py +60 -0
  129. warpline-1.0.0/tests/test_productization_gate.py +105 -0
  130. warpline-1.0.0/tests/test_propagation.py +71 -0
  131. warpline-1.0.0/tests/test_release_candidate_gate.py +23 -0
  132. warpline-1.0.0/tests/test_requirements_traceability.py +45 -0
  133. warpline-1.0.0/tests/test_reverify.py +32 -0
  134. warpline-1.0.0/tests/test_sei_resolution.py +108 -0
  135. warpline-1.0.0/tests/test_sibling_boundaries.py +34 -0
  136. warpline-1.0.0/tests/test_snapshots.py +200 -0
  137. warpline-1.0.0/tests/test_source_grounding.py +12 -0
  138. warpline-1.0.0/tests/test_store.py +47 -0
  139. warpline-1.0.0/uv.lock +285 -0
  140. warpline-1.0.0/weft.toml +6 -0
@@ -0,0 +1,325 @@
1
+ ---
2
+ name: filigree-workflow
3
+ description: >
4
+ This skill should be used when the user asks to "track work", "create an issue",
5
+ "find something to work on", "what should I work on next", "triage bugs", "close
6
+ an issue", "check what's blocked", "plan a milestone", "review sprint progress",
7
+ "coordinate agents", or when working in a project that uses filigree for issue
8
+ tracking. Provides workflow patterns, team coordination protocols, and operational
9
+ guidance for the filigree issue tracker.
10
+ ---
11
+
12
+ # Filigree Workflow
13
+
14
+ Filigree is an agent-native issue tracker that stores data locally in `.filigree/`.
15
+ This skill provides procedural knowledge for using filigree effectively — as a solo
16
+ agent or in a multi-agent swarm.
17
+
18
+ ## Core Workflow
19
+
20
+ Every task follows this lifecycle:
21
+
22
+ ```
23
+ filigree ready → find available work (no blockers)
24
+ filigree show <issue-id> → read requirements and context
25
+ filigree transitions <issue-id> → check valid status transitions
26
+ filigree start-work <issue-id> --assignee <name> → atomically claim + transition into its working status
27
+ [do the work, commit code]
28
+ filigree close <issue-id> --reason="summary of what was done"
29
+ ```
30
+
31
+ Or skip steps 1–3 entirely with `filigree start-next-work --assignee <name>` to grab the highest-priority **startable** issue.
32
+
33
+ > **Ready ≠ startable.** The working status is type-specific (tasks →
34
+ > `in_progress`, features → `building`). Bugs start at `triage`, which has no
35
+ > single-hop transition into work — they walk `triage → confirmed → fixing`. So
36
+ > a triage bug is *ready* but not directly *startable*: `start-work` on one
37
+ > returns `INVALID_TRANSITION` naming the next status to move through, and
38
+ > `start-next-work` skips it. `ready` items carry a `startable` flag (and a
39
+ > `next_action` hint when false). Pass `--advance` to either command to walk the
40
+ > soft transitions automatically (`triage → confirmed → fixing`) instead of
41
+ > being blocked or skipped.
42
+
43
+ Always close with a `--reason` — it becomes audit trail for the next agent.
44
+
45
+ ## Priority Semantics
46
+
47
+ | Priority | Meaning | Action |
48
+ |----------|---------|--------|
49
+ | P0 | Critical | Drop everything. Production is broken. |
50
+ | P1 | High | Do next. Current sprint must-have. |
51
+ | P2 | Medium | Default. Normal backlog work. |
52
+ | P3 | Low | Nice to have. Do when P1/P2 are clear. |
53
+ | P4 | Backlog | Someday. Don't schedule unless promoted. |
54
+
55
+ When triaging, use `filigree batch-update <ids...> --priority=N` for bulk changes.
56
+
57
+ ## Starting Work
58
+
59
+ ### Solo or Swarm — Same Tool
60
+
61
+ Use `start-work` (or `start-next-work`) for the usual case. Both atomically
62
+ claim the issue *and* transition it into its working status in one DB
63
+ transaction — optimistic-locking on the assignee, so concurrent callers can't
64
+ both think they own the issue. The working status is type-specific (tasks →
65
+ `in_progress`, features → `building`, bugs → `fixing`).
66
+
67
+ ```bash
68
+ filigree start-work <issue-id> --assignee <agent-name> # specific issue
69
+ filigree start-next-work --assignee <agent-name> # highest-priority startable
70
+ filigree start-work <bug-id> --assignee <agent-name> --advance # walk triage → confirmed → fixing
71
+ ```
72
+
73
+ If another agent already owns the claim, the call fails with `code: CONFLICT`
74
+ (CLI exit 4). Safe to retry against a different issue.
75
+
76
+ `start-work` on a `triage` bug (or any type with no single-hop working status)
77
+ returns `INVALID_TRANSITION` naming the intermediate status to move through
78
+ first; `start-next-work` skips such issues. Pass `--advance` to walk the soft
79
+ transitions to the nearest working status automatically (missing required
80
+ fields become warnings, not blocks; hard edges are never auto-walked).
81
+
82
+ ### Niche: Claim Without Transitioning
83
+
84
+ `claim` and `claim-next` still exist for the rare case where you want to
85
+ reserve an issue but not advance its status (e.g. a coordinator earmarking
86
+ work for a worker that will pick it up later). Prefer `start-work` for
87
+ normal flow.
88
+
89
+ ```bash
90
+ filigree claim <issue-id> --assignee <agent-name> # reserve only, no transition
91
+ filigree claim-next --assignee <agent-name>
92
+ ```
93
+
94
+ ## Key Commands
95
+
96
+ ### Finding Work
97
+
98
+ ```bash
99
+ filigree ready # ready issues sorted by priority
100
+ filigree list --status=open # all open issues
101
+ filigree search "auth" # full-text search
102
+ filigree critical-path # longest dependency chain
103
+ ```
104
+
105
+ ### Creating Issues
106
+
107
+ ```bash
108
+ filigree create "Title" --type=bug --priority=1
109
+ filigree create "Title" --type=task -d "description" --dep <blocker-id>
110
+ filigree create-plan --file plan.json # milestone/phase/step hierarchy
111
+ ```
112
+
113
+ ### Managing Dependencies
114
+
115
+ ```bash
116
+ filigree add-dep <issue> <depends-on> # A depends on B
117
+ filigree remove-dep <issue> <depends-on>
118
+ filigree blocked # show all blocked issues
119
+ ```
120
+
121
+ ### Context and Handoff
122
+
123
+ ```bash
124
+ filigree add-comment <id> "what I found / what's left to do"
125
+ filigree get-comments <id> # read previous context
126
+ filigree show <id> # full details including deps
127
+ ```
128
+
129
+ Always add a comment before closing or handing off — the next agent has no memory
130
+ of the current conversation.
131
+
132
+ ## Workflow Patterns
133
+
134
+ ### Before Starting Work
135
+
136
+ 1. Run `filigree ready` to see available work
137
+ 2. Check `filigree critical-path` — unblocking the critical path has highest leverage
138
+ 3. Pick work that matches the current session's context (e.g., if code is already open)
139
+
140
+ ### When Finishing Work
141
+
142
+ 1. Add a comment summarising what was done and any follow-up needed
143
+ 2. Close with a reason: `filigree close <id> --reason="implemented X, tested Y"`
144
+ 3. Check if closing this issue unblocks anything: `filigree ready`
145
+
146
+ ### When Blocked
147
+
148
+ 1. Add a comment explaining the blocker
149
+ 2. Create the blocking issue if it doesn't exist
150
+ 3. Add the dependency: `filigree add-dep <blocked> <blocker>`
151
+ 4. Move to other available work
152
+
153
+ ## Guidance Sheets
154
+
155
+ For detailed patterns, consult these reference files:
156
+
157
+ - **`references/workflow-patterns.md`** — Triage flows, sprint planning,
158
+ dependency management, bug lifecycle patterns
159
+ - **`references/team-coordination.md`** — Multi-agent swarm protocols,
160
+ handoff conventions, claiming strategies, status update patterns
161
+ - **`examples/sprint-plan.json`** — Complete create-plan input template
162
+ with cross-phase dependencies
163
+
164
+ Load these when facing a specific workflow challenge rather than reading upfront.
165
+
166
+ ## File Records & Scan Findings
167
+
168
+ The dashboard API tracks files and scan findings across the project. Use the
169
+ schema discovery endpoint to find valid values and available endpoints:
170
+
171
+ ```
172
+ GET /api/files/_schema
173
+ ```
174
+
175
+ This returns valid severities, finding statuses, association types, sort fields,
176
+ and a full endpoint catalog. When linking issues to files, use file associations:
177
+
178
+ | Association Type | Meaning |
179
+ |-----------------|---------|
180
+ | `bug_in` | Bug reported in this file |
181
+ | `task_for` | Task related to this file |
182
+ | `scan_finding` | Automated scan finding |
183
+ | `mentioned_in` | File referenced in issue |
184
+
185
+ ## Response Shapes (2.0)
186
+
187
+ When parsing `--json` output or MCP responses, expect these unified envelopes:
188
+
189
+ - **Batch ops** → `{succeeded: [...], failed: [{id, error, code}, ...], newly_unblocked?: [...]}`.
190
+ `failed` is always present (empty list if none); `newly_unblocked` is
191
+ present only when non-empty (omitted when the op unblocked nothing). Pass `--detail=full` (CLI) or
192
+ `response_detail="full"` (MCP) to get full records back.
193
+ - **List ops** → `{items: [...], has_more: bool, next_offset?: int}`.
194
+ `next_offset` only appears when there is a next page.
195
+ - **Errors** → `{error: str, code: ErrorCode, details?: dict}`. `code` is
196
+ one of: `VALIDATION`, `NOT_FOUND`, `CONFLICT`, `INVALID_TRANSITION`,
197
+ `PERMISSION`, `NOT_INITIALIZED`, `IO`, `INVALID_API_URL`,
198
+ `FILE_REGISTRY_DISPLACED`, `REGISTRY_UNAVAILABLE`,
199
+ `LOOMWEAVE_REGISTRY_VERSION_MISMATCH`, `LOOMWEAVE_OUT_OF_SYNC`,
200
+ `BRIEFING_BLOCKED`, `STOP_FAILED`, `SCHEMA_MISMATCH`, `INTERNAL`.
201
+ Branch on `code` for retry policy
202
+ (`CONFLICT` → exit 4, retryable; everything at exit 1 needs operator
203
+ intervention).
204
+
205
+ The issue ID is always `issue_id` in 2.0 — in MCP inputs, response payloads,
206
+ and CLI JSON. Status is always `status`; "state" was retired as a
207
+ user-facing word.
208
+
209
+ ## Health and Diagnostics
210
+
211
+ ```bash
212
+ filigree doctor # check installation health
213
+ filigree stats # project-wide counts
214
+ filigree metrics # cycle time, lead time, throughput
215
+ filigree events <id> # audit trail for a specific issue
216
+ ```
217
+
218
+ ## Observations — Ambient Note-Taking
219
+
220
+ Observations are a scratchpad for things you notice *while doing other work*. They
221
+ are not issues — they're lightweight, expiring notes that let you capture a thought
222
+ without breaking flow.
223
+
224
+ ### When to Observe
225
+
226
+ Observations are for **incidental** defects — things you notice *in passing*
227
+ while working on something else, that fall *outside the scope of your current
228
+ task*. The core use case is: "I don't have time to investigate this right now,
229
+ but I want to come back to it."
230
+
231
+ Examples of good observations:
232
+
233
+ - A code smell in a neighbouring file you happened to read
234
+ - A missing test for an edge case unrelated to what you're changing
235
+ - A potential bug in a module you're not touching
236
+ - A TODO or FIXME that looks stale
237
+ - A dependency that might be outdated
238
+
239
+ **Always include `file_path` and `line`** when the observation is about specific code.
240
+ This anchors it for whoever triages it later.
241
+
242
+ ### When NOT to Observe
243
+
244
+ **You fix bugs in your currently defined scope. You do NOT use observations to
245
+ finish work prematurely.**
246
+
247
+ If you're working on task X and you notice that your implementation of X has a
248
+ gap, a missed edge case, an untested branch, a known shortcoming, or a piece of
249
+ follow-up that "should really be done too" — that is **task scope, not an
250
+ observation**. You own it. Handle it one of these ways instead:
251
+
252
+ - **Fix it now** as part of the current task. (Default.)
253
+ - **Expand the task** (or split a sub-task) and address it in this work stream.
254
+ - **File a proper issue** with a dependency on the current task, so the gap is
255
+ visible in the work record before you close.
256
+ - **Surface it to the user** if it changes the shape of what you're delivering.
257
+
258
+ Filing your own task's deficiencies as observations and closing the task is
259
+ **not** completing the task. It is shipping known-broken work and hiding the
260
+ debt in a 14-day expiring scratchpad — where it will quietly rot, get
261
+ auto-dismissed, and never be addressed. The work record must reflect what is
262
+ actually outstanding.
263
+
264
+ **The test:** *"Would I have noticed this even if I weren't working on this
265
+ task?"* If yes → observation. If no → it's part of the work, fix it.
266
+
267
+ **Don't observe things that are clearly issues either.** If you're confident
268
+ something is a bug or a needed feature, create an issue directly. Observations
269
+ are for "hmm, this might be worth looking at" — the uncertain middle ground.
270
+
271
+ ### Triage Workflow
272
+
273
+ Observations expire after 14 days. Triage them before they rot:
274
+
275
+ 1. **At session end:** run `observation_list` and quickly scan what's accumulated
276
+ 2. **For each observation, decide:**
277
+ - **Dismiss** — not actionable, already fixed, or not worth tracking. Use
278
+ `observation_dismiss` with a brief reason for the audit trail.
279
+ - **Promote** — deserves to be tracked as an issue. Use `observation_promote`
280
+ which atomically creates an issue and labels it `from-observation`. Choose
281
+ the right issue type:
282
+ - `type='bug'` — something is broken or produces wrong results
283
+ - `type='task'` (default) — cleanup, improvement, or "this works but is shitty"
284
+ - `type='feature'` — a missing capability that should exist
285
+ - `type='requirement'` — a formal requirement to be reviewed, approved, and verified, when the requirements pack is enabled
286
+ - **Leave it** — still uncertain. Let it age. If it survives a few sessions
287
+ without being promoted, it's probably a dismiss.
288
+
289
+ 3. **Batch cleanup:** use the MCP tool `observation_batch_dismiss` when several observations
290
+ have gone stale together.
291
+
292
+ ### Promote vs Dismiss
293
+
294
+ | Signal | Action |
295
+ |--------|--------|
296
+ | You noticed it twice in separate sessions | Promote |
297
+ | It's in a hot code path or critical module | Promote |
298
+ | It has a clear fix or next step | Promote |
299
+ | It was about code that's since been refactored | Dismiss |
300
+ | It's a style/taste preference, not a defect | Dismiss |
301
+ | You can't articulate what the fix would be | Leave it (or dismiss if > 7 days old) |
302
+
303
+ ### Tracking the Pipeline
304
+
305
+ Promoted observations get the `from-observation` label. To see the pipeline output:
306
+
307
+ ```bash
308
+ filigree list --label=from-observation # All promoted observations
309
+ filigree search "from-observation" # Search with context
310
+ ```
311
+
312
+ ## Quick Decision Guide
313
+
314
+ | Situation | Action |
315
+ |-----------|--------|
316
+ | "What should I work on?" | `filigree ready`, pick highest priority |
317
+ | "Is this blocked?" | `filigree show <id>`, check blocked_by |
318
+ | "Multiple agents need work" | `filigree start-next-work --assignee <name>` |
319
+ | "I found a new bug" | `filigree create "..." --type=bug --priority=1` |
320
+ | "This task is bigger than expected" | Create sub-tasks, add deps |
321
+ | "I'm done" | Comment, close with reason, check `ready` |
322
+ | "Something changed while I worked" | `filigree changes --since <timestamp>` |
323
+ | "I noticed something odd in a file I'm passing through" | `observation_create` with file_path and line — keep working |
324
+ | "I noticed a gap in the work I'm currently doing" | Fix it, expand the task, or file a proper issue — **do not** observe it |
325
+ | "These observations are piling up" | `observation_list`, then dismiss or promote each |
@@ -0,0 +1,30 @@
1
+ {
2
+ "milestone": {
3
+ "title": "Sprint 3 — Auth & Dashboard",
4
+ "priority": 1
5
+ },
6
+ "phases": [
7
+ {
8
+ "title": "Backend API",
9
+ "steps": [
10
+ {"title": "Auth endpoint (JWT token issuance)", "priority": 1},
11
+ {"title": "User CRUD endpoints", "priority": 2, "deps": [0]},
12
+ {"title": "Rate limiting middleware", "priority": 2, "deps": [0]}
13
+ ]
14
+ },
15
+ {
16
+ "title": "Frontend",
17
+ "steps": [
18
+ {"title": "Login page", "priority": 1, "deps": ["0.0"]},
19
+ {"title": "Dashboard layout", "priority": 2, "deps": ["0.1"]}
20
+ ]
21
+ },
22
+ {
23
+ "title": "Integration & QA",
24
+ "steps": [
25
+ {"title": "End-to-end auth flow test", "priority": 1, "deps": ["1.0"]},
26
+ {"title": "Load test rate limiter", "priority": 3, "deps": ["0.2"]}
27
+ ]
28
+ }
29
+ ]
30
+ }
@@ -0,0 +1,202 @@
1
+ # Team Coordination
2
+
3
+ Multi-agent swarm protocols for filigree 2.0. Load this reference when coordinating
4
+ work across multiple agents.
5
+
6
+ ## Atomic Start
7
+
8
+ ### The Race Condition Problem
9
+
10
+ When multiple agents call `filigree update <issue-id> --status=<wip>`
11
+ simultaneously, both think they own the issue. Filigree 2.0 solves this with
12
+ `start-work`, which atomically claims the issue *and* transitions it to its
13
+ type-specific working status (tasks → `in_progress`, features → `building`,
14
+ bugs → `fixing`) in a single DB transaction with optimistic locking on the
15
+ assignee.
16
+
17
+ ### Start Protocol
18
+
19
+ ```bash
20
+ # Option A: Start a specific issue
21
+ filigree start-work <issue-id> --assignee <agent-name>
22
+
23
+ # Option B: Start the highest-priority ready issue
24
+ filigree start-next-work --assignee <agent-name>
25
+ ```
26
+
27
+ If another agent already claimed the issue, the call fails with
28
+ `code: CONFLICT` (CLI exit 4). No silent overwrite, no half-claimed state —
29
+ either both the claim and the transition land, or neither does.
30
+
31
+ `start-next-work` accepts the work-scoping filters `claim-next` also
32
+ takes (`--type`, `--priority-min`, `--priority-max`) so specialised agents
33
+ can scope their work. Because `start-next-work` *transitions* (not just
34
+ reserves), it additionally accepts `--target-status` to override the wip
35
+ target and `--advance` to walk soft transitions to wip — neither of which
36
+ `claim-next` has, since `claim-next` only reserves and never changes status.
37
+
38
+ ### Niche: Claim Without Transitioning
39
+
40
+ If a coordinator wants to reserve an issue without advancing its status
41
+ (e.g. earmarking it for a downstream worker), use the atomic primitives:
42
+
43
+ ```bash
44
+ filigree claim <issue-id> --assignee <agent-name>
45
+ filigree claim-next --assignee <agent-name>
46
+ ```
47
+
48
+ These are kept for niche use; `start-work` is the default in 2.0.
49
+
50
+ ### Releasing Claims
51
+
52
+ If an agent cannot finish the work:
53
+
54
+ ```bash
55
+ filigree add-comment <issue-id> "Releasing: blocked on X, needs Y to continue"
56
+ filigree release <issue-id>
57
+ ```
58
+
59
+ Always add a comment before releasing — the next agent needs context.
60
+
61
+ ## Handoff Protocol
62
+
63
+ When passing work between agents, follow this sequence:
64
+
65
+ ### Outgoing Agent (Finishing)
66
+
67
+ 1. **Document state**: Add a comment with current progress, decisions made,
68
+ and remaining work
69
+ 2. **Update status**: Leave in its working status (`in_progress` / `building` /
70
+ `fixing`) if partially done, or close if complete
71
+ 3. **Flag blockers**: Create blocker issues and add dependencies if needed
72
+
73
+ ```bash
74
+ filigree add-comment <issue-id> "Completed: API endpoints for auth.
75
+ Remaining: frontend login page needs the /api/token response format.
76
+ Decision: used JWT not sessions — see commit abc123.
77
+ Blocker: need CORS config before frontend can call API."
78
+ ```
79
+
80
+ ### Incoming Agent (Picking Up)
81
+
82
+ 1. **Read context**: `filigree show <issue-id>` and `filigree get-comments <issue-id>`
83
+ 2. **Check dependencies**: Look at `blocked_by` in the show output
84
+ 3. **Start**: `filigree start-work <issue-id> --assignee <name>`
85
+ 4. **Continue**: Build on the previous agent's work, don't restart
86
+
87
+ ## Status Update Conventions
88
+
89
+ ### When to Update Status
90
+
91
+ | Event | Action |
92
+ |-------|--------|
93
+ | Starting work | `start-work <issue-id> --assignee <name>` (atomic claim + transition) |
94
+ | Hit a blocker | Add comment, create blocker issue, add dep |
95
+ | Completed the work | `close --reason="..."` |
96
+ | Can't finish, releasing | Comment + `release` |
97
+ | Found additional work | Create new issues, add deps if needed |
98
+
99
+ ### Comment Conventions
100
+
101
+ Prefix comments with context markers for quick scanning:
102
+
103
+ ```bash
104
+ filigree add-comment <issue-id> "PROGRESS: implemented X and Y, Z remaining"
105
+ filigree add-comment <issue-id> "BLOCKED: waiting on <blocker-id> for API schema"
106
+ filigree add-comment <issue-id> "DECISION: chose approach A because of B"
107
+ filigree add-comment <issue-id> "HANDOFF: releasing, next agent should start at Z"
108
+ ```
109
+
110
+ ## Swarm Work Distribution
111
+
112
+ ### Leader-Follower Pattern
113
+
114
+ One agent acts as coordinator:
115
+
116
+ 1. **Leader** runs `filigree ready` and assigns work (or pre-claims via `claim`)
117
+ 2. **Followers** use `filigree start-work <issue-id> --assignee <name>` to take it on
118
+ 3. **Followers** report back via comments when done
119
+ 4. **Leader** monitors `filigree stats` and `filigree list --status=in_progress`
120
+
121
+ ### Self-Organising Pattern
122
+
123
+ All agents are peers:
124
+
125
+ 1. Each agent runs `filigree start-next-work --assignee <name>`
126
+ 2. Works on the started issue independently
127
+ 3. Closes and immediately calls `start-next-work` again
128
+ 4. No central coordinator needed
129
+
130
+ This works best when:
131
+ - Issues are well-defined and independent
132
+ - Dependencies are properly wired (so `start-next-work` only returns unblocked work)
133
+ - Priority ordering reflects actual importance
134
+
135
+ Tie-break ordering for `start-next-work` (and `claim-next`):
136
+ 1. `priority` ascending (0 = critical first)
137
+ 2. `created_at` ascending (oldest first within a priority tier)
138
+ 3. `issue_id` ascending (deterministic tie-break)
139
+
140
+ ### Filtering by Type
141
+
142
+ Specialised agents can filter their start calls:
143
+
144
+ ```bash
145
+ # Backend agent
146
+ filigree start-next-work --assignee backend-1 --type task
147
+
148
+ # Bug-fixing agent
149
+ filigree start-next-work --assignee bugfix-1 --type bug --priority-max 1
150
+ ```
151
+
152
+ ## Conflict Resolution
153
+
154
+ ### Two Agents Modified the Same Code
155
+
156
+ 1. The second agent's commit will show merge conflicts
157
+ 2. Add a comment on the issue explaining the conflict
158
+ 3. The agent with the simpler change should rebase
159
+ 4. Use `filigree add-comment` to document the resolution
160
+
161
+ ### Two Agents Claimed Related Work
162
+
163
+ If agents discover their tasks overlap:
164
+
165
+ 1. One agent adds a dependency between the tasks
166
+ 2. The agent with the lower-priority task releases their claim
167
+ 3. The remaining agent completes the prerequisite first
168
+
169
+ ### Stale Claims
170
+
171
+ If an agent disappears without completing work:
172
+
173
+ ```bash
174
+ filigree list --status=in_progress --assignee <missing-agent>
175
+ filigree release <issue-id> # free the claim
176
+ filigree add-comment <issue-id> "Released: previous agent did not complete"
177
+ ```
178
+
179
+ ### CONFLICT Responses
180
+
181
+ A `start-work` (or `claim`) call that loses the race returns
182
+ `{error: ..., code: "CONFLICT", details: {current_assignee: "..."}}` and
183
+ exits with code 4. This is distinct from operational errors (exit 1) so
184
+ automated callers can retry against a different issue without escalating.
185
+
186
+ ## Session Resumption
187
+
188
+ When an agent starts a new session and needs to resume context:
189
+
190
+ ```bash
191
+ # What was I working on?
192
+ filigree list --status=in_progress --assignee <name>
193
+
194
+ # What happened since I last worked?
195
+ filigree changes --since <last-session-timestamp>
196
+
197
+ # What's ready now?
198
+ filigree ready
199
+ ```
200
+
201
+ The `filigree session-context` hook does this automatically at session start,
202
+ but these commands are useful for manual context recovery.