Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ Please choose versions by [Semantic Versioning](http://semver.org/).

## Unreleased

- fix: `/vault-cli:sync-progress` § Phase 2 reaches its `already synced — no writes this run` short-circuit for an `in_progress` anchor, instead of reporting failure for a record it can verify as present. The short-circuit added in `v0.168.6` was gated *"When a completion was established above"*, so the state the command is most often run in — an anchor that is still open — fell past it to `No task completion or PR detected. Use /update instead for in-progress work.` and STOP. Measured 2026-10-15: the operator ran the command **four times in one session** against an `in_progress` anchor whose daily-note entry already existed; all four stopped at the same line, each costing a full Phase 1–2 sweep (vault config read, session-transcript scan, git probes) and producing an identical report. The gate now reads *"whenever a completion was established above **or** the anchor is `in_progress`"*, and an explicit `in_progress` arm precedes the STOP bullet so the representation check runs first. Still keyed on the representation check rather than on the status alone: an `in_progress` anchor with **no** daily-note entry falls through to the STOP line unchanged. Out of scope: the Phase 1–2 sweep itself (the short-circuit still runs after the completion analysis, so the sweep is not removed — the false failure report and the operator's reason to re-run are) and the close-family loop in `/vault-cli:session-close`.
- fix: `/vault-cli:create-task` and its `task-creator` agent no longer fall back silently to the configured default vault. `commands/create-task.md` documented `--vault` as optional with an implicit default, and `agents/task-creator.md` stated it outright (`Defaults: MODE = interactive, VAULT = configured default vault`) — so a task belonging to one vault was placed in another by inference, and the silent fallback is a **third** vault again, wrong for work belonging to any other. Both now resolve the vault from `--vault` or from the cwd, and **ask** when neither determines it — the convention `commands/reflect.md` (*"If cwd is not inside any vault path, ask the user which vault to write to"*) and `agents/graph-auditor.md` (*"ask user which vault to audit; do not guess"*) already carry, so this brings the pair in line with their siblings rather than adding a new rule. Observed 2026-10-15: a task belonging to `seibert-personal` was created in `seibert-brogrammers` by inference and had to be deleted and re-created, costing two `task-creator` runs (~105k tokens).

## v0.169.1
Expand Down
3 changes: 2 additions & 1 deletion commands/sync-progress.md
Original file line number Diff line number Diff line change
Expand Up @@ -128,9 +128,10 @@ If no candidate passes both, continue to the PR check below.
If NO completion detected, check whether a PR was created (Phase 3.3 detection rules):
- PR present, no completion → proceed but only run Phase 3.3 (PR-only sync). Report as "PR-only sync." This arm deliberately wins over the terminal-non-completion arm below: a session that both opened a PR and was aborted records the PR, and the outcome is not duplicated.
- Anchor ended in a **terminal non-completion** (`status: aborted` or `hold`) → proceed with Phase 3.1 (daily note) only, heading the entry with the outcome — `### [[Task Name]] — Aborted (superseded)`, wikilink mandatory per Phase 3.1's entry shape — and skipping Phase 4, since there is no completion to mark. **Resolve the status by probe, never from the conversation:** run `vault-cli task get "<anchor task>" status --output json` and branch on the parsed `value`, exactly as `session-close` Phase 4.5 does. A non-zero exit or an unparseable result means *not established* — fall through to the STOP gate below rather than guessing. The conversation is not a sufficient source: the case this arm exists for is an anchor that already ended `aborted` in an earlier session or on another branch, where the transcript carries no signal at all.
- Anchor is **`in_progress`** → **do not stop here.** Apply the short-circuit below first: run the representation check, and when it passes report `already synced — no writes this run` and STOP. When it fails, fall through to the line below. An `in_progress` anchor is the state this command is most often run in, and stopping on it reports failure for a record the command can itself verify as present.
- Neither PR nor completion → `No task completion or PR detected. Use /update instead for in-progress work.` and STOP.

**Short-circuit when the record already exists.** When a completion was established above, apply `session-close` § Phase 2's *route 1* exception — its Phase 7 representation check, plus that route's "no vault-tracked work since" conjunct — before Phase 3. Resolve the script the way Phase 7 does, under the **plugin root** and never the cwd: this command runs from a vault, and a vault has no `scripts/`, so a bare `bash scripts/…` resolves to nothing and the check silently never runs.
**Short-circuit when the record already exists.** Apply this whenever a completion was established above **or** the anchor is `in_progress`, using `session-close` § Phase 2's *route 1* exception — its Phase 7 representation check, plus that route's "no vault-tracked work since" conjunct — before Phase 3. Resolve the script the way Phase 7 does, under the **plugin root** and never the cwd: this command runs from a vault, and a vault has no `scripts/`, so a bare `bash scripts/…` resolves to nothing and the check silently never runs.

```bash
VAULT_CLI_SCRIPTS="$(ls -d ~/.claude/plugins/cache/vault-cli/vault-cli/*/scripts 2>/dev/null | sort -V | tail -1)"
Expand Down
Loading