Skip to content

Commit da90655

Browse files
chore: auto-commit ticket changes before merge (merge worktree-20260320-130729)
2 parents e37b219 + 163275c commit da90655

19 files changed

+740
-69
lines changed

.tickets/.index.json

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,13 @@
5959
"title": "Recurring tool error: command_exit_nonzero (56 occurrences)",
6060
"type": "bug"
6161
},
62+
"dso-2e99": {
63+
"deps": [],
64+
"priority": 2,
65+
"status": "closed",
66+
"title": "fix: ci-status.sh crashes with CFG_PYTHON_VENV unbound variable when config-paths.sh is absent",
67+
"type": "bug"
68+
},
6269
"dso-2xqd": {
6370
"deps": [],
6471
"priority": 2,
@@ -334,7 +341,7 @@
334341
"dso-lli8": {
335342
"deps": [],
336343
"priority": 2,
337-
"status": "open",
344+
"status": "closed",
338345
"title": "Bug: tk sync windowed pull uses UTC but Jira reads JQL datetimes as user-local timezone",
339346
"type": "bug"
340347
},
@@ -369,7 +376,7 @@
369376
"dso-or3g": {
370377
"deps": [],
371378
"priority": 2,
372-
"status": "open",
379+
"status": "closed",
373380
"title": "Bug: collect-discoveries.sh crashes with get_artifacts_dir not found when CLAUDE_PLUGIN_ROOT is wrong",
374381
"type": "bug"
375382
},
@@ -407,7 +414,7 @@
407414
"dso-qlgq": {
408415
"deps": [],
409416
"priority": 2,
410-
"status": "open",
417+
"status": "closed",
411418
"title": "validate-phase.sh runs tests directly without test-batched.sh \u2014 same timeout anti-pattern as w21-ae0s",
412419
"type": "bug"
413420
},
@@ -1022,7 +1029,7 @@
10221029
"w21-ouns": {
10231030
"deps": [],
10241031
"priority": 2,
1025-
"status": "open",
1032+
"status": "closed",
10261033
"title": "fix: test-isolation rule no-script-dir-write misses variable aliases like FIXTURES_DIR derived from SCRIPT_DIR",
10271034
"type": "bug"
10281035
},

.tickets/.sync-state.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -449,8 +449,8 @@
449449
"last_synced": "2026-03-19T18:38:35Z",
450450
"local_hash": "14c516947a151a3db8bdec4010e2fd6e"
451451
},
452-
"last_pull_timestamp": "2026-03-21T00:46:12Z",
453-
"last_sync_commit": "14ba17eafcaaf4b0a87c49dbbafad037f24be5fe",
452+
"last_pull_timestamp": "2026-03-21T01:19:00Z",
453+
"last_sync_commit": "0f08614b43de2ae17e7a1338dcfb3232ea9cec86",
454454
"w21-5cqr": {
455455
"jira_hash": "bce29d76f01c58613ee99cb1dd03920d",
456456
"jira_key": "DIG-61",

.tickets/dso-2e99.md

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
id: dso-2e99
3-
status: open
3+
status: closed
44
deps: []
55
links: []
66
created: 2026-03-21T00:31:14Z
@@ -19,3 +19,17 @@ assignee: Joe Oakhart
1919
<!-- sync: unsynced -->
2020

2121
Same anti-pattern as dso-tqvy (fixed in worktree-sync-from-main.sh). ci-status.sh line 212 uses $CFG_PYTHON_VENV inside ${repo_root:+$repo_root/$CFG_PYTHON_VENV} inside _find_python_with_yaml(). If config-paths.sh is not found (e.g., CLAUDE_PLUGIN_ROOT without hooks/lib/config-paths.sh), the variable is unbound. When repo_root is non-empty, the ${repo_root:+...} expansion evaluates the inner $CFG_PYTHON_VENV, triggering 'unbound variable' crash. Fix: use ${CFG_PYTHON_VENV:-app/.venv/bin/python3} at line 212.
22+
23+
<!-- note-id: lah9wfxd -->
24+
<!-- timestamp: 2026-03-21T01:05:14Z -->
25+
<!-- origin: agent -->
26+
<!-- sync: unsynced -->
27+
28+
Fixed at plugins/dso/scripts/ci-status.sh line 212: changed `${repo_root:+$repo_root/$CFG_PYTHON_VENV}` to `${repo_root:+$repo_root/${CFG_PYTHON_VENV:-app/.venv/bin/python3}}`. RED confirmed: bash -u crash reproduced before fix. GREEN confirmed: function returns python3 without error after fix. All 8 existing ci-status tests pass.
29+
30+
<!-- note-id: 87jmeqai -->
31+
<!-- timestamp: 2026-03-21T01:36:45Z -->
32+
<!-- origin: agent -->
33+
<!-- sync: unsynced -->
34+
35+
CLOSE REASON: Fixed: CFG_PYTHON_VENV default in ci-status.sh (commit 0f08614)

.tickets/dso-lli8.md

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
id: dso-lli8
3-
status: open
3+
status: closed
44
deps: []
55
links: []
66
created: 2026-03-19T18:19:56Z
@@ -21,3 +21,19 @@ Fix: convert UTC timestamp to local timezone before formatting for JQL in the Py
2121
one-liner at plugins/dso/scripts/tk lines 4252-4283.
2222

2323
Workaround: tk sync --full bypasses the windowed pull.
24+
25+
## Notes
26+
27+
<!-- note-id: f6i9h8lv -->
28+
<!-- timestamp: 2026-03-21T01:05:05Z -->
29+
<!-- origin: agent -->
30+
<!-- sync: unsynced -->
31+
32+
Classification: behavioral, Score: 2 (BASIC). Root cause confirmed: line 4353 in plugins/dso/scripts/tk — datetime.fromisoformat() parses UTC timestamp but strftime('%Y-%m-%d %H:%M') strips timezone and emits a naive string. Jira interprets it as user-local time, causing the window to be off by the TZ offset. Fix: convert UTC timestamp to local time (astimezone()) before formatting.
33+
34+
<!-- note-id: diufvexm -->
35+
<!-- timestamp: 2026-03-21T01:36:46Z -->
36+
<!-- origin: agent -->
37+
<!-- sync: unsynced -->
38+
39+
CLOSE REASON: Fixed: tk sync .astimezone() for Jira JQL (commit 0f08614)

.tickets/dso-or3g.md

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
id: dso-or3g
3-
status: open
3+
status: closed
44
deps: []
55
links: []
66
created: 2026-03-20T23:49:34Z
@@ -10,3 +10,12 @@ assignee: Joe Oakhart
1010
---
1111
# Bug: collect-discoveries.sh crashes with get_artifacts_dir not found when CLAUDE_PLUGIN_ROOT is wrong
1212

13+
14+
## Notes
15+
16+
<!-- note-id: gi8nzfol -->
17+
<!-- timestamp: 2026-03-21T01:36:45Z -->
18+
<!-- origin: agent -->
19+
<!-- sync: unsynced -->
20+
21+
CLOSE REASON: Fixed: plugin.json sentinel in collect-discoveries.sh (commit 0f08614)

.tickets/dso-qlgq.md

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
id: dso-qlgq
3-
status: open
3+
status: closed
44
deps: []
55
links: []
66
created: 2026-03-20T22:51:51Z
@@ -22,3 +22,26 @@ Integrate test-batched.sh into validate-phase.sh for the test step, similar to h
2222
## Related
2323
Discovered while fixing w21-ae0s (validate.sh timeout anti-pattern).
2424

25+
26+
## Notes
27+
28+
<!-- note-id: 4uqdd7fy -->
29+
<!-- timestamp: 2026-03-21T01:05:06Z -->
30+
<!-- origin: agent -->
31+
<!-- sync: unsynced -->
32+
33+
Classification: behavioral, Score: 2 (BASIC). Root cause: phase_auto_fix, phase_post_batch, and phase_tier_transition all run CMD_TEST_UNIT via raw eval, bypassing test-batched.sh. Fix: extract a run_test_batched() helper in validate-phase.sh that mirrors validate.sh's run_test_check() pattern — calls test-batched.sh when available, falls back to direct eval. Use VALIDATE_TEST_STATE_FILE / VALIDATE_TEST_BATCHED_SCRIPT env vars for overridability in tests.
34+
35+
<!-- note-id: puampc20 -->
36+
<!-- timestamp: 2026-03-21T01:15:52Z -->
37+
<!-- origin: agent -->
38+
<!-- sync: unsynced -->
39+
40+
CLOSE REASON: Fixed: validate-phase.sh now uses test-batched.sh via run_test_batched() helper in all three phase functions (phase_auto_fix, phase_post_batch, phase_tier_transition); falls back to direct eval when script is absent; PENDING exit code (2) propagated on NEXT: output. Tests: 21/21 pass. Committed in 0f08614.
41+
42+
<!-- note-id: 67yv85d6 -->
43+
<!-- timestamp: 2026-03-21T01:36:45Z -->
44+
<!-- origin: agent -->
45+
<!-- sync: unsynced -->
46+
47+
CLOSE REASON: Fixed: validate-phase.sh test-batched integration (commit 0f08614)

.tickets/w21-ouns.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
id: w21-ouns
3-
status: open
3+
status: closed
44
deps: []
55
links: []
66
created: 2026-03-19T18:11:59Z
@@ -17,3 +17,10 @@ parent: dso-9xnr
1717
**2026-03-19T18:12:11Z**
1818

1919
The no-script-dir-write isolation rule only checks for literal $SCRIPT_DIR/ in write commands. It misses indirect writes through derived variables like FIXTURES_DIR="$SCRIPT_DIR/fixtures/...". Also, $REPO_ROOT writes are explicitly excluded ('too many legitimate reads') but test-record-review-crossval.sh writes sentinel files to REPO_ROOT. Two fixes needed: (1) trace variable assignments that derive from SCRIPT_DIR and flag writes through those aliases, (2) consider a narrower REPO_ROOT write rule that catches touch/mkdir/redirect to REPO_ROOT but not reads.
20+
21+
<!-- note-id: uo4wsqnz -->
22+
<!-- timestamp: 2026-03-21T01:36:46Z -->
23+
<!-- origin: agent -->
24+
<!-- sync: unsynced -->
25+
26+
CLOSE REASON: Fixed: isolation rule alias detection + tests (commit c25c396)

plugins/dso/.claude-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "dso",
3-
"version": "0.12.3",
3+
"version": "0.12.7",
44
"description": "Workflow infrastructure plugin for Claude Code projects",
55
"commands": "./commands/",
66
"skills": "./skills/",

plugins/dso/scripts/ci-status.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ _find_python_with_yaml() {
209209
local candidate
210210
for candidate in \
211211
"${CLAUDE_PLUGIN_PYTHON:-}" \
212-
"${repo_root:+$repo_root/$CFG_PYTHON_VENV}" \
212+
"${repo_root:+$repo_root/${CFG_PYTHON_VENV:-app/.venv/bin/python3}}" \
213213
"${repo_root:+$repo_root/.venv/bin/python3}" \
214214
"python3"; do
215215
[[ -z "$candidate" ]] && continue

plugins/dso/scripts/collect-discoveries.sh

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,14 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
3838
REPO_ROOT="$(git rev-parse --show-toplevel)"
3939

4040
# Source deps.sh for get_artifacts_dir
41+
# Defensive plugin-root resolution: CLAUDE_PLUGIN_ROOT may point to the main repo
42+
# root instead of the plugin subdirectory (e.g., plugins/dso) when called from a
43+
# host project via the dso shim. Validate using plugin.json (always present in the
44+
# plugin dir) and fall back to $SCRIPT_DIR/.. (the plugin dir relative to this script).
4145
# shellcheck source=hooks/lib/deps.sh
42-
source "${CLAUDE_PLUGIN_ROOT:-$SCRIPT_DIR/..}/hooks/lib/deps.sh"
46+
_PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$SCRIPT_DIR/..}"
47+
[[ ! -f "${_PLUGIN_ROOT}/plugin.json" ]] && _PLUGIN_ROOT="$SCRIPT_DIR/.."
48+
source "${_PLUGIN_ROOT}/hooks/lib/deps.sh"
4349

4450
# Resolve discoveries directory
4551
DISCOVERIES_DIR="${AGENT_DISCOVERIES_DIR:-$(get_artifacts_dir)/agent-discoveries}"

0 commit comments

Comments
 (0)