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.
- warpline-1.0.0/.agents/skills/filigree-workflow/SKILL.md +325 -0
- warpline-1.0.0/.agents/skills/filigree-workflow/examples/sprint-plan.json +30 -0
- warpline-1.0.0/.agents/skills/filigree-workflow/references/team-coordination.md +202 -0
- warpline-1.0.0/.agents/skills/filigree-workflow/references/workflow-patterns.md +178 -0
- warpline-1.0.0/.agents/skills/loomweave-workflow/.fingerprint +1 -0
- warpline-1.0.0/.agents/skills/loomweave-workflow/SKILL.md +407 -0
- warpline-1.0.0/.agents/skills/wardline-gate/SKILL.md +68 -0
- warpline-1.0.0/.agents/skills/warpline-workflow/SKILL.md +64 -0
- warpline-1.0.0/.agents/skills/warpline-workflow/examples/changed-to-reverify.json +71 -0
- warpline-1.0.0/.agents/skills/warpline-workflow/references/contract.md +54 -0
- warpline-1.0.0/.agents/skills/warpline-workflow/references/degrade-and-federation.md +53 -0
- warpline-1.0.0/.agents/skills/warpline-workflow/references/tools.md +62 -0
- warpline-1.0.0/.claude/settings.json +49 -0
- warpline-1.0.0/.claude/skills/filigree-workflow/SKILL.md +325 -0
- warpline-1.0.0/.claude/skills/filigree-workflow/examples/sprint-plan.json +30 -0
- warpline-1.0.0/.claude/skills/filigree-workflow/references/team-coordination.md +202 -0
- warpline-1.0.0/.claude/skills/filigree-workflow/references/workflow-patterns.md +178 -0
- warpline-1.0.0/.claude/skills/loomweave-workflow/.fingerprint +1 -0
- warpline-1.0.0/.claude/skills/loomweave-workflow/SKILL.md +407 -0
- warpline-1.0.0/.claude/skills/wardline-gate/SKILL.md +68 -0
- warpline-1.0.0/.claude/skills/warpline-workflow/SKILL.md +64 -0
- warpline-1.0.0/.claude/skills/warpline-workflow/examples/changed-to-reverify.json +71 -0
- warpline-1.0.0/.claude/skills/warpline-workflow/references/contract.md +54 -0
- warpline-1.0.0/.claude/skills/warpline-workflow/references/degrade-and-federation.md +53 -0
- warpline-1.0.0/.claude/skills/warpline-workflow/references/tools.md +62 -0
- warpline-1.0.0/.github/workflows/ci.yml +49 -0
- warpline-1.0.0/.github/workflows/release.yml +100 -0
- warpline-1.0.0/.gitignore +13 -0
- warpline-1.0.0/.mcp.json +35 -0
- warpline-1.0.0/AGENTS.md +180 -0
- warpline-1.0.0/CHANGELOG.md +76 -0
- warpline-1.0.0/CLAUDE.md +180 -0
- warpline-1.0.0/LICENSE +21 -0
- warpline-1.0.0/PKG-INFO +234 -0
- warpline-1.0.0/README.md +213 -0
- warpline-1.0.0/docs/evidence/2026-06-13-dogfood-readiness.md +28 -0
- warpline-1.0.0/docs/evidence/2026-06-13-mcp-smoke.md +28 -0
- warpline-1.0.0/docs/evidence/2026-06-13-source-grounding.md +28 -0
- warpline-1.0.0/docs/evidence/member-dirty-baseline.txt +22 -0
- warpline-1.0.0/docs/federation/contracts.md +63 -0
- warpline-1.0.0/docs/integration/post-admission-consumer-tickets.md +36 -0
- warpline-1.0.0/docs/plans/2026-06-12-warpline-delivery.md +3615 -0
- warpline-1.0.0/docs/plans/2026-06-13-warpline-1-0-readiness.md +211 -0
- warpline-1.0.0/docs/plans/2026-06-13-warpline-implementation-goal-prompt.md +73 -0
- warpline-1.0.0/docs/product/agentic-mcp-product-design.md +94 -0
- warpline-1.0.0/docs/product/current-state.md +93 -0
- warpline-1.0.0/docs/product/decisions/0001-product-candidate-ownership.md +67 -0
- warpline-1.0.0/docs/product/federation-value-add-and-mcp-first-audit.md +972 -0
- warpline-1.0.0/docs/product/metrics.md +45 -0
- warpline-1.0.0/docs/product/prds/PRD-0001-agent-first-mcp-productization.md +96 -0
- warpline-1.0.0/docs/product/roadmap.md +37 -0
- warpline-1.0.0/docs/product/vision.md +87 -0
- warpline-1.0.0/loomweave.yaml +53 -0
- warpline-1.0.0/pyproject.toml +64 -0
- warpline-1.0.0/scripts/check_no_member_diffs.sh +18 -0
- warpline-1.0.0/scripts/check_release_candidate.sh +14 -0
- warpline-1.0.0/scripts/check_source_grounding.py +54 -0
- warpline-1.0.0/scripts/run_spike.sh +62 -0
- warpline-1.0.0/solution-architecture/00-scope-and-context.md +65 -0
- warpline-1.0.0/solution-architecture/01-requirements.md +29 -0
- warpline-1.0.0/solution-architecture/02-nfr-specification.md +20 -0
- warpline-1.0.0/solution-architecture/03-nfr-mapping.md +13 -0
- warpline-1.0.0/solution-architecture/04-solution-overview.md +49 -0
- warpline-1.0.0/solution-architecture/05-tech-selection-rationale.md +27 -0
- warpline-1.0.0/solution-architecture/06-descoped-and-deferred.md +16 -0
- warpline-1.0.0/solution-architecture/07-c4-context.md +29 -0
- warpline-1.0.0/solution-architecture/08-c4-containers.md +33 -0
- warpline-1.0.0/solution-architecture/09-component-specifications.md +54 -0
- warpline-1.0.0/solution-architecture/10-data-model.md +56 -0
- warpline-1.0.0/solution-architecture/11-interface-contracts.md +53 -0
- warpline-1.0.0/solution-architecture/13-deployment-view.md +24 -0
- warpline-1.0.0/solution-architecture/14-requirements-traceability-matrix.md +29 -0
- warpline-1.0.0/solution-architecture/15-integration-plan.md +38 -0
- warpline-1.0.0/solution-architecture/17-risk-register.md +18 -0
- warpline-1.0.0/solution-architecture/adrs/0001-spike-first-posture.md +30 -0
- warpline-1.0.0/solution-architecture/adrs/0002-read-side-hook-fed-ingestion.md +33 -0
- warpline-1.0.0/solution-architecture/adrs/0003-sei-primary-locator-first-class.md +32 -0
- warpline-1.0.0/solution-architecture/adrs/0004-aggregator-firewall.md +41 -0
- warpline-1.0.0/spike/REPORT.md +90 -0
- warpline-1.0.0/spike/SPIKE-BRIEF.md +53 -0
- warpline-1.0.0/spike/measurements.json +7 -0
- warpline-1.0.0/src/warpline/__init__.py +2 -0
- warpline-1.0.0/src/warpline/cli.py +310 -0
- warpline-1.0.0/src/warpline/commands.py +569 -0
- warpline-1.0.0/src/warpline/dogfood.py +563 -0
- warpline-1.0.0/src/warpline/envelope.py +71 -0
- warpline-1.0.0/src/warpline/errors.py +139 -0
- warpline-1.0.0/src/warpline/git.py +168 -0
- warpline-1.0.0/src/warpline/install.py +25 -0
- warpline-1.0.0/src/warpline/install_support.py +489 -0
- warpline-1.0.0/src/warpline/locators.py +26 -0
- warpline-1.0.0/src/warpline/loomweave.py +238 -0
- warpline-1.0.0/src/warpline/mcp.py +497 -0
- warpline-1.0.0/src/warpline/mcp_smoke.py +194 -0
- warpline-1.0.0/src/warpline/productization.py +123 -0
- warpline-1.0.0/src/warpline/propagation.py +92 -0
- warpline-1.0.0/src/warpline/py.typed +1 -0
- warpline-1.0.0/src/warpline/refs.py +78 -0
- warpline-1.0.0/src/warpline/reverify.py +79 -0
- warpline-1.0.0/src/warpline/siblings.py +159 -0
- warpline-1.0.0/src/warpline/skills/warpline-workflow/SKILL.md +64 -0
- warpline-1.0.0/src/warpline/skills/warpline-workflow/examples/changed-to-reverify.json +71 -0
- warpline-1.0.0/src/warpline/skills/warpline-workflow/references/contract.md +54 -0
- warpline-1.0.0/src/warpline/skills/warpline-workflow/references/degrade-and-federation.md +53 -0
- warpline-1.0.0/src/warpline/skills/warpline-workflow/references/tools.md +62 -0
- warpline-1.0.0/src/warpline/snapshot.py +207 -0
- warpline-1.0.0/src/warpline/store.py +487 -0
- warpline-1.0.0/tests/contracts/test_golden_vectors.py +359 -0
- warpline-1.0.0/tests/contracts/test_warpline_contract_fixtures.py +90 -0
- warpline-1.0.0/tests/fixtures/contracts/warpline/golden-vectors.json +43 -0
- warpline-1.0.0/tests/fixtures/contracts/warpline/mcp-response-changed.json +71 -0
- warpline-1.0.0/tests/fixtures/contracts/warpline/mcp-response-reverify.json +52 -0
- warpline-1.0.0/tests/fixtures/contracts/warpline/mcp-tool-inventory.json +223 -0
- warpline-1.0.0/tests/install/test_install_doctor.py +125 -0
- warpline-1.0.0/tests/integration/test_hx1_live.py +46 -0
- warpline-1.0.0/tests/integration/test_loomweave_live.py +15 -0
- warpline-1.0.0/tests/spike/test_harness.py +50 -0
- warpline-1.0.0/tests/test_commands.py +134 -0
- warpline-1.0.0/tests/test_consumer_ticket_package.py +26 -0
- warpline-1.0.0/tests/test_dogfood.py +107 -0
- warpline-1.0.0/tests/test_git_backfill.py +136 -0
- warpline-1.0.0/tests/test_hooks.py +45 -0
- warpline-1.0.0/tests/test_locators.py +23 -0
- warpline-1.0.0/tests/test_loomweave_probe.py +55 -0
- warpline-1.0.0/tests/test_loomweave_snapshot_adapter.py +15 -0
- warpline-1.0.0/tests/test_mcp.py +290 -0
- warpline-1.0.0/tests/test_package.py +22 -0
- warpline-1.0.0/tests/test_product_workspace.py +60 -0
- warpline-1.0.0/tests/test_productization_gate.py +105 -0
- warpline-1.0.0/tests/test_propagation.py +71 -0
- warpline-1.0.0/tests/test_release_candidate_gate.py +23 -0
- warpline-1.0.0/tests/test_requirements_traceability.py +45 -0
- warpline-1.0.0/tests/test_reverify.py +32 -0
- warpline-1.0.0/tests/test_sei_resolution.py +108 -0
- warpline-1.0.0/tests/test_sibling_boundaries.py +34 -0
- warpline-1.0.0/tests/test_snapshots.py +200 -0
- warpline-1.0.0/tests/test_source_grounding.py +12 -0
- warpline-1.0.0/tests/test_store.py +47 -0
- warpline-1.0.0/uv.lock +285 -0
- 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.
|