You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CLAUDE.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -54,7 +54,7 @@ Priority: 0-4 (0=critical, 4=backlog). Never use "high"/"medium"/"low".
54
54
55
55
## Architecture
56
56
57
-
**Ticket system v3 (event-sourced)**: Orphan git branch `tickets` mounted at `.tickets-tracker/`. JSON event files per ticket; Python reducer (`ticket-reducer.py`) compiles state on-demand. Writes are serialized with `fcntl.flock` to prevent concurrent corruption. CLI: `plugins/dso/scripts/ticket <subcommand>` (full reference: `plugins/dso/docs/ticket-cli-reference.md`). **Jira bridge**: `.claude/scripts/dso ticket sync` (incremental default, `--full` to force, `--check` for dry-run). Requires `JIRA_URL`, `JIRA_USER`, `JIRA_API_TOKEN`.
57
+
**Ticket system v3 (event-sourced)**: Orphan git branch `tickets` mounted at `.tickets-tracker/`. JSON event files per ticket; Python reducer (`ticket-reducer.py`) compiles state on-demand. Writes are serialized with `fcntl.flock` to prevent concurrent corruption. CLI: `plugins/dso/scripts/ticket <subcommand>` (full reference: `plugins/dso/docs/ticket-cli-reference.md`). **Archived-ticket exclusion**: All scan operations (`ticket list`, `ticket deps`, `ticket-graph.py` dep lookups) exclude archived tickets by default; `ticket show` always includes them. `ticket list` and `ticket deps` accept `--include-archived` to override. `ticket transition close` uses a single `batch_close_operations` scan (no repeated reducer calls). `ticket-graph.py` uses a single `reduce_all_tickets` call per invocation. **Jira bridge**: `.claude/scripts/dso ticket sync` (incremental default, `--full` to force, `--check` for dry-run). Requires `JIRA_URL`, `JIRA_USER`, `JIRA_API_TOKEN`.
58
58
**Hook architecture**: Consolidated dispatchers (`pre-bash.sh` + `post-bash.sh`). All hooks are jq-free — use `parse_json_field`, `json_build`, and `python3` for JSON parsing. See `plugins/dso/hooks/dispatchers/` and `plugins/dso/hooks/lib/`. **Review gate (two-layer defense-in-depth)**: Layer 1 — `pre-commit-review-gate.sh` (git pre-commit hook); default-deny allowlist from `review-gate-allowlist.conf`; checks review-status + diff hash; formatting-only mismatches self-heal via `ruff format`. Layer 2 — `review-gate.sh` (PreToolUse hook, wraps `review-gate-bypass-sentinel.sh`); blocks `--no-verify`, `-n`, `core.hooksPath=` override, `git commit-tree`, direct `.git/hooks/` writes, direct writes/deletions to `test-gate-status` and `test-exemptions` (only `record-test-status.sh` and `record-test-exemption.sh` are authorized writers). **Test gate (two-layer defense-in-depth)**: Layer 1 — `pre-commit-test-gate.sh` (git pre-commit hook); verifies `test-gate-status` for each staged source file with an associated test (fuzzy matching or `.test-index`). Test dirs: `test_gate.test_dirs` in `.claude/dso-config.conf` (default: `tests/`). `.test-index` format: `source/path.ext: test/path1.ext, test/path2.ext` (one per line; `#` comments ok). **RED marker format**: `source/path.ext: test/path.ext [first_red_test_name]` — `[marker]` marks boundary between GREEN (passing) and RED (not yet implemented) tests; failures at or after marker are tolerated. RED tests must be at end of test file. **TDD workflow**: Add test at end of file + `[test_name]` marker to `.test-index` — e.g., `source/foo.sh: tests/test_foo.sh [test_new_feature]`. Remove marker after implementation passes. **Epic closure**: blocked while any `[marker]` entries remain in `.test-index`. Layer 2 — `review-gate-bypass-sentinel.sh` blocks direct writes/deletions to `test-gate-status` and `test-exemptions`.
59
59
**Validation gate**: `validate.sh` writes state; hooks block sprint/epic if validation hasn't passed. `--verbose` for real-time progress.
60
60
**Agent routing**: `discover-agents.sh` resolves routing categories to agents via `agent-routing.conf`; all fall back to `general-purpose`. See `plugins/dso/docs/INSTALL.md`. **Named-agent dispatch** (via `subagent_type`, defined in `plugins/dso/agents/`):
Copy file name to clipboardExpand all lines: plugins/dso/docs/ticket-cli-reference.md
+60-3Lines changed: 60 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -222,21 +222,23 @@ $ .claude/scripts/dso ticket show --format=llm w21-a3f7
222
222
List all tickets.
223
223
224
224
```
225
-
.claude/scripts/dso ticket list [--format=llm]
225
+
.claude/scripts/dso ticket list [--format=llm] [--include-archived]
226
226
```
227
227
228
228
**Arguments:**
229
229
230
230
| Argument | Required | Description |
231
231
|---|---|---|
232
232
|`--format=llm`| No | JSONL output — one minified ticket per line (see Output Formats section) |
233
+
|`--include-archived`| No | Include archived tickets in output (default: archived tickets are excluded) |
233
234
234
235
**Output:** Default: a JSON array of compiled ticket state objects. `--format=llm`: JSONL, one object per line.
235
236
236
237
**Behavior:**
237
238
238
239
- Runs the reducer on every ticket directory in `.tickets-tracker/`
239
240
- Hidden directories (names starting with `.`) are skipped
241
+
- Archived tickets are excluded by default; pass `--include-archived` to include them
240
242
- Tickets that fail to reduce produce an error-state entry: `{"ticket_id": "...", "status": "error", "error": "reducer_failed"}`; these are included in the output array rather than causing an early exit
241
243
- Aggregate unresolved bridge alert count is emitted to stderr if non-zero
@@ -446,6 +448,7 @@ Show the dependency graph for a ticket.
446
448
|---|---|---|
447
449
|`ticket_id`| Yes | The ticket whose dependency graph to show |
448
450
|`--tickets-dir=<path>`| No | Override the tracker directory (defaults to `.tickets-tracker/`) |
451
+
|`--include-archived`| No | Include archived tickets in the dep graph (default: archived tickets are excluded) |
449
452
450
453
**Output:** JSON object with the following fields:
451
454
@@ -468,6 +471,8 @@ Show the dependency graph for a ticket.
468
471
469
472
**Behavior:**
470
473
474
+
- Archived tickets are excluded from the dep graph by default; pass `--include-archived` to include them
475
+
- If the queried ticket itself is archived, the command exits with an error unless `--include-archived` is passed: `Error: ticket '<id>' is archived. Use --include-archived to include archived tickets.`
471
476
- Uses a graph cache keyed by content hash of all ticket directories to avoid redundant reducer calls on repeated queries
472
477
- Tombstone-aware: archived/tombstoned tickets count as closed for `ready_to_work` computation
473
478
- Blockers include: tickets with a `depends_on` relation stored in this ticket's directory, and tickets with a `blocks` relation targeting this ticket stored in their own directory
@@ -477,13 +482,16 @@ Show the dependency graph for a ticket.
477
482
| Code | Meaning |
478
483
|---|---|
479
484
|`0`| JSON dep graph printed to stdout |
480
-
|`1`| Ticket not found |
485
+
|`1`| Ticket not found or ticket is archived (without `--include-archived`) |
|`-n <count>`| No | Number of tickets to seed (default: `300`; `0` = use existing repo tickets) |
730
+
|`--threshold <seconds>`| No | Max acceptable wall-clock time in seconds. Defaults: `3s` for n≤300, `10s` for n≤1000, `30s` for n>1000 (list mode); `10s` (close mode) |
731
+
|`--mode=list\|close`| No | Benchmark mode (default: `list`). `list` measures `ticket list` wall-clock time. `close` seeds a mixed population and measures `ticket transition open→closed`. |
732
+
733
+
**Behavior:**
734
+
735
+
- When run without `-n` (or with `-n 0`) inside a repo with an initialized ticket system, benchmarks the existing tickets
736
+
- Otherwise creates a temporary git repo, seeds N tickets, and benchmarks that
737
+
-`close` mode seeds a mix of open, in-progress, and archived tickets, then measures a single `ticket transition open→closed` including all `batch_close_operations` work
738
+
739
+
**Exit codes:**
740
+
741
+
| Code | Meaning |
742
+
|---|---|
743
+
|`0`| Elapsed time was below the threshold |
744
+
|`1`| Elapsed time exceeded the threshold |
745
+
|`2`| Invalid arguments |
746
+
747
+
**Output:**
748
+
749
+
```
750
+
Elapsed: X.XXs for N tickets (list mode)
751
+
Elapsed: X.XXs for closing ticket with N non-archived tickets in tracker (close mode)
0 commit comments