@miller-tech/uap 1.60.0 → 1.61.1

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 (81) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/benchmarks/paired/adapter.d.ts.map +1 -1
  3. package/dist/benchmarks/paired/adapter.js +14 -1
  4. package/dist/benchmarks/paired/adapter.js.map +1 -1
  5. package/dist/benchmarks/paired/scaffold.d.ts.map +1 -1
  6. package/dist/benchmarks/paired/scaffold.js +6 -1
  7. package/dist/benchmarks/paired/scaffold.js.map +1 -1
  8. package/dist/bin/cli.js +58 -0
  9. package/dist/bin/cli.js.map +1 -1
  10. package/dist/cli/self-harness.d.ts +36 -0
  11. package/dist/cli/self-harness.d.ts.map +1 -0
  12. package/dist/cli/self-harness.js +213 -0
  13. package/dist/cli/self-harness.js.map +1 -0
  14. package/dist/mcp-router/executor/client.d.ts.map +1 -1
  15. package/dist/mcp-router/executor/client.js +16 -2
  16. package/dist/mcp-router/executor/client.js.map +1 -1
  17. package/dist/mcp-router/output-compressor.d.ts.map +1 -1
  18. package/dist/mcp-router/output-compressor.js +51 -0
  19. package/dist/mcp-router/output-compressor.js.map +1 -1
  20. package/dist/self-harness/decide.d.ts +41 -0
  21. package/dist/self-harness/decide.d.ts.map +1 -0
  22. package/dist/self-harness/decide.js +69 -0
  23. package/dist/self-harness/decide.js.map +1 -0
  24. package/dist/self-harness/index.d.ts +23 -0
  25. package/dist/self-harness/index.d.ts.map +1 -0
  26. package/dist/self-harness/index.js +23 -0
  27. package/dist/self-harness/index.js.map +1 -0
  28. package/dist/self-harness/middleware/path-normalizer.d.ts +53 -0
  29. package/dist/self-harness/middleware/path-normalizer.d.ts.map +1 -0
  30. package/dist/self-harness/middleware/path-normalizer.js +136 -0
  31. package/dist/self-harness/middleware/path-normalizer.js.map +1 -0
  32. package/dist/self-harness/mine.d.ts +25 -0
  33. package/dist/self-harness/mine.d.ts.map +1 -0
  34. package/dist/self-harness/mine.js +78 -0
  35. package/dist/self-harness/mine.js.map +1 -0
  36. package/dist/self-harness/mods.d.ts +136 -0
  37. package/dist/self-harness/mods.d.ts.map +1 -0
  38. package/dist/self-harness/mods.js +152 -0
  39. package/dist/self-harness/mods.js.map +1 -0
  40. package/dist/self-harness/orchestrator.d.ts +61 -0
  41. package/dist/self-harness/orchestrator.d.ts.map +1 -0
  42. package/dist/self-harness/orchestrator.js +110 -0
  43. package/dist/self-harness/orchestrator.js.map +1 -0
  44. package/dist/self-harness/pending.d.ts +57 -0
  45. package/dist/self-harness/pending.d.ts.map +1 -0
  46. package/dist/self-harness/pending.js +86 -0
  47. package/dist/self-harness/pending.js.map +1 -0
  48. package/dist/self-harness/profile.d.ts +38 -0
  49. package/dist/self-harness/profile.d.ts.map +1 -0
  50. package/dist/self-harness/profile.js +80 -0
  51. package/dist/self-harness/profile.js.map +1 -0
  52. package/dist/self-harness/propose.d.ts +25 -0
  53. package/dist/self-harness/propose.d.ts.map +1 -0
  54. package/dist/self-harness/propose.js +86 -0
  55. package/dist/self-harness/propose.js.map +1 -0
  56. package/dist/self-harness/trace-mine.d.ts +39 -0
  57. package/dist/self-harness/trace-mine.d.ts.map +1 -0
  58. package/dist/self-harness/trace-mine.js +109 -0
  59. package/dist/self-harness/trace-mine.js.map +1 -0
  60. package/dist/self-harness/transfer.d.ts +99 -0
  61. package/dist/self-harness/transfer.d.ts.map +1 -0
  62. package/dist/self-harness/transfer.js +140 -0
  63. package/dist/self-harness/transfer.js.map +1 -0
  64. package/dist/self-harness/weakness.d.ts +56 -0
  65. package/dist/self-harness/weakness.d.ts.map +1 -0
  66. package/dist/self-harness/weakness.js +0 -0
  67. package/dist/self-harness/weakness.js.map +1 -0
  68. package/dist/tasks/coordination.d.ts.map +1 -1
  69. package/dist/tasks/coordination.js +9 -7
  70. package/dist/tasks/coordination.js.map +1 -1
  71. package/dist/tasks/service.d.ts +10 -0
  72. package/dist/tasks/service.d.ts.map +1 -1
  73. package/dist/tasks/service.js +41 -5
  74. package/dist/tasks/service.js.map +1 -1
  75. package/docs/INDEX.md +1 -0
  76. package/docs/design/SELF_HARNESS.md +206 -0
  77. package/package.json +1 -1
  78. package/src/policies/enforcers/__pycache__/_common.cpython-312.pyc +0 -0
  79. package/tools/agents/scripts/anthropic_proxy.py +160 -18
  80. package/tools/agents/scripts/toolcall_path_normalizer.py +159 -0
  81. package/tools/agents/tests/test_anthropic_proxy_streaming.py +93 -2
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Self-Harness — online weakness mining from PRODUCTION traces (P3).
3
+ *
4
+ * The records-miner (mine.ts) needs a paired bench. Online mining works on real
5
+ * traffic from two sources:
6
+ * - HALO spans (.uap/halo/traces.jsonl) — the `uap deliver` pipeline.
7
+ * - Proxy log signals (journald) — the claude-local proxy path, where
8
+ * toolcall.path.garbled actually surfaces (records can't distinguish it from a
9
+ * logic error; the proxy's TOOLCALL PATH NORMALIZER line proves it occurred).
10
+ *
11
+ * Both produce the same ranked WeaknessReport[] keyed by stable signature.
12
+ * Mining is READ-ONLY; prod-mined proposals are enqueued for gated validation,
13
+ * never auto-applied (see pending.ts). docs/design/SELF_HARNESS.md §9.
14
+ */
15
+ import { signatureHash, rankWeaknesses, } from './weakness.js';
16
+ /** Classify one HALO span into a FailureKind, or null if it's not a failure. */
17
+ export function classifyHaloSpan(span) {
18
+ const attrs = span.attributes ?? {};
19
+ const isError = (span.status?.code ?? '').toUpperCase().includes('ERROR');
20
+ const execErr = String(attrs['delivery.executor_error'] ?? '').toLowerCase();
21
+ const applyErr = String(attrs['delivery.apply_error'] ?? '').toLowerCase();
22
+ const err = `${execErr} ${applyErr}`.trim();
23
+ if (err.includes('timed out') || err.includes('timeout'))
24
+ return 'agent.timeout';
25
+ // An apply error mentioning a path/file that could not be located → garbled path.
26
+ if (applyErr && /(no such file|not found|does not exist|invalid path|outside)/.test(applyErr)) {
27
+ return 'toolcall.path.garbled';
28
+ }
29
+ if (err.includes('exit') || err.includes('spawn') || err.includes('killed'))
30
+ return 'agent.error';
31
+ // Gates failed but the turn produced output → a wrong/insufficient deliverable.
32
+ const gatesFailed = attrs['delivery.gates_failed'];
33
+ if (isError || (typeof gatesFailed === 'string' && gatesFailed) || (Array.isArray(gatesFailed) && gatesFailed.length)) {
34
+ return 'verify.fail';
35
+ }
36
+ return null;
37
+ }
38
+ /**
39
+ * Classify one proxy journal line. The proxy already logs the structured signals
40
+ * we care about; this turns them into FailureKinds for online mining.
41
+ */
42
+ export function classifyProxyLogLine(line) {
43
+ if (line.includes('TOOLCALL PATH NORMALIZER'))
44
+ return 'toolcall.path.garbled';
45
+ if (line.includes('TURN-COUNT FINALIZE BREAKER'))
46
+ return 'loop.nonterminate';
47
+ if (line.includes('RECON CONVERGENCE') && line.includes('hard-escalated'))
48
+ return 'guardrail.poison.recon';
49
+ if (line.includes('exceeds the available context size'))
50
+ return 'gen.runaway.npredict';
51
+ if (line.includes('should_stop condition'))
52
+ return 'agent.timeout';
53
+ return null;
54
+ }
55
+ function aggregate(kinds, model, minFrequency) {
56
+ const byKind = new Map();
57
+ for (const { kind, task, evidence } of kinds) {
58
+ let a = byKind.get(kind);
59
+ if (!a) {
60
+ a = { count: 0, tasks: new Set(), evidence: [] };
61
+ byKind.set(kind, a);
62
+ }
63
+ a.count += 1;
64
+ a.tasks.add(task);
65
+ if (a.evidence.length < 5)
66
+ a.evidence.push(evidence);
67
+ }
68
+ const reports = [];
69
+ for (const [kind, a] of byKind) {
70
+ if (a.count < minFrequency)
71
+ continue;
72
+ reports.push({
73
+ signature: signatureHash({ kind, model }),
74
+ kind,
75
+ model,
76
+ frequency: a.count,
77
+ affectedTasks: [...a.tasks],
78
+ hypothesis: `Observed in production traces (${a.count}×).`,
79
+ evidence: a.evidence,
80
+ });
81
+ }
82
+ return rankWeaknesses(reports);
83
+ }
84
+ /** Mine weaknesses from HALO spans (the deliver pipeline). */
85
+ export function mineFromHaloSpans(spans, opts) {
86
+ const hits = [];
87
+ for (const span of spans) {
88
+ const kind = classifyHaloSpan(span);
89
+ if (!kind)
90
+ continue;
91
+ const task = String(span.attributes?.['inference.project_id'] ?? span.name ?? 'unknown');
92
+ hits.push({ kind, task, evidence: `${span.name}: ${kind}` });
93
+ }
94
+ return aggregate(hits, opts.model, opts.minFrequency ?? 1);
95
+ }
96
+ /** Mine weaknesses from proxy journal lines (the claude-local proxy path). */
97
+ export function mineFromProxyLogLines(lines, opts) {
98
+ const hits = [];
99
+ for (const line of lines) {
100
+ const kind = classifyProxyLogLine(line);
101
+ if (!kind)
102
+ continue;
103
+ // Sessions aren't tasks; use the proxy session fingerprint if present.
104
+ const m = /fp:[0-9a-f]+/.exec(line);
105
+ hits.push({ kind, task: m ? m[0] : 'proxy', evidence: line.slice(0, 160) });
106
+ }
107
+ return aggregate(hits, opts.model, opts.minFrequency ?? 1);
108
+ }
109
+ //# sourceMappingURL=trace-mine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-mine.js","sourceRoot":"","sources":["../../src/self-harness/trace-mine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Self-Harness — cross-model transfer store (P3).
3
+ *
4
+ * Addresses the paper's stated limitation (fixes stay model-specific). Every
5
+ * accepted Mod is recorded keyed by (model family, failure kind, signature) with
6
+ * its measured delta + provenance. When a NEW model hits the same failure KIND,
7
+ * the proposer seeds from Mods that already worked for that kind on OTHER models
8
+ * — those still go through full validation (transfer is a prior, not a shortcut),
9
+ * and negative results are recorded so known-bad Mods are not re-proposed.
10
+ *
11
+ * See docs/design/SELF_HARNESS.md §8, §11 (P3).
12
+ */
13
+ import { Mod } from './mods.js';
14
+ import { FailureKind } from './weakness.js';
15
+ import type { Proposer } from './propose.js';
16
+ export interface TransferEntry {
17
+ /** Full (model-specific) signature the Mod was mined against. */
18
+ signature: string;
19
+ kind: FailureKind;
20
+ /** Normalized model family the Mod was validated on. */
21
+ model: string;
22
+ mod: Mod;
23
+ /** Measured validation correctness delta when accepted (or rejected: <=0). */
24
+ delta: number;
25
+ /** Whether this entry was an acceptance (true) or a recorded rejection (false). */
26
+ accepted: boolean;
27
+ /** ISO timestamp; provenance string (suite, n, stats). */
28
+ validatedAt: string;
29
+ provenance: string;
30
+ }
31
+ /** Structural identity of a Mod, for de-duplication across sources. */
32
+ export declare function modKey(mod: Mod): string;
33
+ export declare function dedupeMods(mods: Mod[]): Mod[];
34
+ export interface TransferQueryOptions {
35
+ /** Exclude entries already validated on this (normalized) model family. */
36
+ excludeModel?: string;
37
+ /** Only entries that were ACCEPTED (positive). Default true. */
38
+ acceptedOnly?: boolean;
39
+ }
40
+ export interface PruneOptions {
41
+ /** Drop ACCEPTED entries whose measured delta is <= this (no longer worth
42
+ * transferring — the ablation idea: stop carrying a Mod that stopped paying
43
+ * off). Default 0 (keep only strictly-positive accepted). */
44
+ minDelta?: number;
45
+ /** Drop ANY entry older than this many days. Default 90. */
46
+ maxAgeDays?: number;
47
+ /** Override "now" (ms epoch) for deterministic tests. */
48
+ now?: number;
49
+ }
50
+ export interface PruneResult {
51
+ removed: TransferEntry[];
52
+ kept: number;
53
+ }
54
+ export interface TransferStore {
55
+ record(entry: TransferEntry): void;
56
+ /** Cross-model lookup by failure kind, ranked by measured delta (desc). */
57
+ query(kind: FailureKind, opts?: TransferQueryOptions): TransferEntry[];
58
+ all(): TransferEntry[];
59
+ /** Ablation-prune: drop stale / no-longer-paying-off entries. */
60
+ prune(opts?: PruneOptions): PruneResult;
61
+ }
62
+ /** In-memory store (tests, ephemeral runs). */
63
+ export declare class MemoryTransferStore implements TransferStore {
64
+ protected entries: TransferEntry[];
65
+ record(entry: TransferEntry): void;
66
+ query(kind: FailureKind, opts?: TransferQueryOptions): TransferEntry[];
67
+ all(): TransferEntry[];
68
+ prune(opts?: PruneOptions): PruneResult;
69
+ }
70
+ /** JSON-file-backed store (persisted across runs; default under .uap/self-harness). */
71
+ export declare class JsonTransferStore extends MemoryTransferStore {
72
+ private readonly path;
73
+ constructor(path: string);
74
+ record(entry: TransferEntry): void;
75
+ prune(opts?: PruneOptions): PruneResult;
76
+ private persist;
77
+ }
78
+ /** Build a TransferEntry from an accepted/rejected Mod + measured delta. */
79
+ export declare function makeEntry(args: {
80
+ signature: string;
81
+ kind: FailureKind;
82
+ model: string;
83
+ mod: Mod;
84
+ delta: number;
85
+ accepted: boolean;
86
+ validatedAt: string;
87
+ provenance: string;
88
+ }): TransferEntry;
89
+ /** One-line description of a transfer entry, for `uap self-harness transfer` output. */
90
+ export declare function describeEntry(e: TransferEntry): string;
91
+ /**
92
+ * Wrap a base proposer so it SEEDS candidates from the transfer store: for each
93
+ * weakness, Mods that worked for the same failure kind on OTHER model families
94
+ * are proposed first (as priors that still get fully validated), then the base
95
+ * proposer's candidates. De-duped so a transferred Mod the base would also emit
96
+ * isn't validated twice.
97
+ */
98
+ export declare function makeTransferProposer(store: TransferStore, base: Proposer): Proposer;
99
+ //# sourceMappingURL=transfer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../../src/self-harness/transfer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Self-Harness — cross-model transfer store (P3).
3
+ *
4
+ * Addresses the paper's stated limitation (fixes stay model-specific). Every
5
+ * accepted Mod is recorded keyed by (model family, failure kind, signature) with
6
+ * its measured delta + provenance. When a NEW model hits the same failure KIND,
7
+ * the proposer seeds from Mods that already worked for that kind on OTHER models
8
+ * — those still go through full validation (transfer is a prior, not a shortcut),
9
+ * and negative results are recorded so known-bad Mods are not re-proposed.
10
+ *
11
+ * See docs/design/SELF_HARNESS.md §8, §11 (P3).
12
+ */
13
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
14
+ import { dirname } from 'path';
15
+ import { describeMod, validateMod } from './mods.js';
16
+ import { normalizeModel } from './weakness.js';
17
+ /** Structural identity of a Mod, for de-duplication across sources. */
18
+ export function modKey(mod) {
19
+ switch (mod.kind) {
20
+ case 'env':
21
+ return `env:${mod.key}=${mod.to}`;
22
+ case 'scaffold':
23
+ return `scaffold:${mod.component}:${mod.op}:${mod.text}`;
24
+ case 'middleware':
25
+ return `mw:${mod.id}:${JSON.stringify(mod.params)}`;
26
+ }
27
+ }
28
+ export function dedupeMods(mods) {
29
+ const seen = new Set();
30
+ const out = [];
31
+ for (const m of mods) {
32
+ const k = modKey(m);
33
+ if (!seen.has(k)) {
34
+ seen.add(k);
35
+ out.push(m);
36
+ }
37
+ }
38
+ return out;
39
+ }
40
+ /** In-memory store (tests, ephemeral runs). */
41
+ export class MemoryTransferStore {
42
+ entries = [];
43
+ record(entry) {
44
+ // Replace a prior entry for the same (model, modKey) so the latest delta wins.
45
+ const k = `${entry.model}|${modKey(entry.mod)}`;
46
+ this.entries = this.entries.filter((e) => `${e.model}|${modKey(e.mod)}` !== k);
47
+ this.entries.push(entry);
48
+ }
49
+ query(kind, opts = {}) {
50
+ const acceptedOnly = opts.acceptedOnly ?? true;
51
+ const exclude = opts.excludeModel ? normalizeModel(opts.excludeModel) : null;
52
+ return this.entries
53
+ .filter((e) => e.kind === kind)
54
+ .filter((e) => (acceptedOnly ? e.accepted : true))
55
+ .filter((e) => (exclude ? normalizeModel(e.model) !== exclude : true))
56
+ .sort((a, b) => b.delta - a.delta);
57
+ }
58
+ all() {
59
+ return [...this.entries];
60
+ }
61
+ prune(opts = {}) {
62
+ const minDelta = opts.minDelta ?? 0;
63
+ const maxAgeMs = (opts.maxAgeDays ?? 90) * 86_400_000;
64
+ const now = opts.now ?? Date.now();
65
+ const removed = [];
66
+ this.entries = this.entries.filter((e) => {
67
+ const age = now - (Date.parse(e.validatedAt) || 0);
68
+ const stale = age > maxAgeMs;
69
+ const noLongerPays = e.accepted && e.delta <= minDelta;
70
+ if (stale || noLongerPays) {
71
+ removed.push(e);
72
+ return false;
73
+ }
74
+ return true;
75
+ });
76
+ return { removed, kept: this.entries.length };
77
+ }
78
+ }
79
+ /** JSON-file-backed store (persisted across runs; default under .uap/self-harness). */
80
+ export class JsonTransferStore extends MemoryTransferStore {
81
+ path;
82
+ constructor(path) {
83
+ super();
84
+ this.path = path;
85
+ if (existsSync(path)) {
86
+ try {
87
+ this.entries = JSON.parse(readFileSync(path, 'utf-8'));
88
+ }
89
+ catch {
90
+ this.entries = [];
91
+ }
92
+ }
93
+ }
94
+ record(entry) {
95
+ super.record(entry);
96
+ this.persist();
97
+ }
98
+ prune(opts = {}) {
99
+ const res = super.prune(opts);
100
+ if (res.removed.length)
101
+ this.persist();
102
+ return res;
103
+ }
104
+ persist() {
105
+ mkdirSync(dirname(this.path), { recursive: true });
106
+ writeFileSync(this.path, JSON.stringify(this.entries, null, 2), 'utf-8');
107
+ }
108
+ }
109
+ /** Build a TransferEntry from an accepted/rejected Mod + measured delta. */
110
+ export function makeEntry(args) {
111
+ return { ...args, model: args.model };
112
+ }
113
+ /** One-line description of a transfer entry, for `uap self-harness transfer` output. */
114
+ export function describeEntry(e) {
115
+ const tag = e.accepted ? `+${e.delta.toFixed(3)}` : `rejected`;
116
+ return `[${e.kind}] ${describeMod(e.mod)} (${tag} on ${e.model}; ${e.provenance})`;
117
+ }
118
+ /**
119
+ * Wrap a base proposer so it SEEDS candidates from the transfer store: for each
120
+ * weakness, Mods that worked for the same failure kind on OTHER model families
121
+ * are proposed first (as priors that still get fully validated), then the base
122
+ * proposer's candidates. De-duped so a transferred Mod the base would also emit
123
+ * isn't validated twice.
124
+ */
125
+ export function makeTransferProposer(store, base) {
126
+ return {
127
+ id: `transfer+${base.id}`,
128
+ propose(weaknesses, profile) {
129
+ const seeds = [];
130
+ for (const w of weaknesses) {
131
+ for (const e of store.query(w.kind, { excludeModel: w.model })) {
132
+ if (validateMod(e.mod).ok)
133
+ seeds.push(e.mod);
134
+ }
135
+ }
136
+ return dedupeMods([...seeds, ...base.propose(weaknesses, profile)]);
137
+ },
138
+ };
139
+ }
140
+ //# sourceMappingURL=transfer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../src/self-harness/transfer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Self-Harness — Weakness Mining types and stable failure-signature hashing.
3
+ *
4
+ * Stage 1 of the loop turns execution traces (HALO spans) + paired-bench run
5
+ * records into a ranked `WeaknessReport[]`. A failure's `signature` must be
6
+ * STABLE across runs so the proposer and the cross-model transfer store can key
7
+ * off it (a fix mined for `toolcall.path.garbled` on one model is retrievable
8
+ * for the same signature on another). See docs/design/SELF_HARNESS.md §5, §8.
9
+ */
10
+ /**
11
+ * The catalogue of known failure kinds, derived from observed Qwen3.6-A3B
12
+ * failure modes (see project memory project_uap_paired_bench). Kinds are a
13
+ * stable, extensible vocabulary — new kinds append here; existing ones never
14
+ * change string, so historical signatures stay valid.
15
+ */
16
+ export declare const FAILURE_KINDS: readonly ["toolcall.path.garbled", "toolcall.args.truncated", "gen.runaway.npredict", "loop.nonterminate", "guardrail.poison.recon", "verify.fail", "agent.timeout", "agent.error"];
17
+ export type FailureKind = (typeof FAILURE_KINDS)[number];
18
+ export declare function isFailureKind(s: string): s is FailureKind;
19
+ /**
20
+ * The minimal, canonical descriptor of a failure that the signature hash is
21
+ * computed from. `detail` narrows within a kind (e.g. the tool name or the knob
22
+ * involved) and participates in the hash so distinct sub-failures get distinct
23
+ * signatures; `model` keys signatures per family for transfer.
24
+ */
25
+ export interface FailureSignatureInput {
26
+ kind: FailureKind;
27
+ /** Model family the failure was observed on, e.g. 'qwen3.6-35b-a3b'. */
28
+ model: string;
29
+ /** Optional narrowing detail; normalized (trimmed, lowercased) before hashing. */
30
+ detail?: string;
31
+ }
32
+ /**
33
+ * Deterministic, stable signature hash. Canonicalizes the input so the same
34
+ * failure always hashes identically regardless of incidental formatting.
35
+ */
36
+ export declare function signatureHash(input: FailureSignatureInput): string;
37
+ /** Normalize a model id to a family key (drop quant/format suffixes, lowercase). */
38
+ export declare function normalizeModel(model: string): string;
39
+ export interface WeaknessReport {
40
+ /** Stable signature = signatureHash(...) — the transfer/proposer key. */
41
+ signature: string;
42
+ kind: FailureKind;
43
+ /** Model family the weakness was mined on. */
44
+ model: string;
45
+ /** Number of occurrences across the mined window. */
46
+ frequency: number;
47
+ /** Tasks/sessions where it appeared. */
48
+ affectedTasks: string[];
49
+ /** A short natural-language hypothesis of the cause (proposer context). */
50
+ hypothesis: string;
51
+ /** Span ids or short evidence excerpts. */
52
+ evidence: string[];
53
+ }
54
+ /** Rank reports by frequency × estimated impact (impact = #affected tasks). */
55
+ export declare function rankWeaknesses(reports: WeaknessReport[]): WeaknessReport[];
56
+ //# sourceMappingURL=weakness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"weakness.d.ts","sourceRoot":"","sources":["../../src/self-harness/weakness.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;;;;GAKG;AACH,eAAO,MAAM,aAAa,qLAShB,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,IAAI,WAAW,CAEzD;AAED;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,WAAW,CAAC;IAClB,wEAAwE;IACxE,KAAK,EAAE,MAAM,CAAC;IACd,kFAAkF;IAClF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,qBAAqB,GAAG,MAAM,CAOlE;AAED,oFAAoF;AACpF,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED,MAAM,WAAW,cAAc;IAC7B,yEAAyE;IACzE,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,WAAW,CAAC;IAClB,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,2EAA2E;IAC3E,UAAU,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAM1E"}
Binary file
@@ -0,0 +1 @@
1
+ {"version":3,"file":"weakness.js","sourceRoot":"","sources":["../../src/self-harness/weakness.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,uBAAuB,EAAE,yDAAyD;IAClF,yBAAyB,EAAE,wCAAwC;IACnE,sBAAsB,EAAE,kDAAkD;IAC1E,mBAAmB,EAAE,iDAAiD;IACtE,wBAAwB,EAAE,4DAA4D;IACtF,aAAa,EAAE,6CAA6C;IAC5D,eAAe,EAAE,2BAA2B;IAC5C,aAAa,EAAE,oCAAoC;CAC3C,CAAC;AAIX,MAAM,UAAU,aAAa,CAAC,CAAS;IACrC,OAAQ,aAAmC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC;AAgBD;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAA4B;IACxD,MAAM,SAAS,GAAG;QAChB,KAAK,CAAC,IAAI;QACV,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC;QAC3B,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;KAC1C,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACZ,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACzE,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAO,KAAK;SACT,WAAW,EAAE;SACb,OAAO,CAAC,uDAAuD,EAAE,EAAE,CAAC;SACpE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;SACnB,IAAI,EAAE,CAAC;AACZ,CAAC;AAkBD,+EAA+E;AAC/E,MAAM,UAAU,cAAc,CAAC,OAAyB;IACtD,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CACtB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC;QACjD,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CACpD,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"coordination.d.ts","sourceRoot":"","sources":["../../src/tasks/coordination.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAKjE,OAAO,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,KAAK,EACV,gBAAgB,EAChB,WAAW,EACX,uBAAuB,EACxB,MAAM,0BAA0B,CAAC;AAGlC,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,WAAW,CAAC;IACzB,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,iBAAiB,CAAC;IACxB,YAAY,EAAE,gBAAgB,CAAC;IAC/B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,WAAW,EAAE,uBAAuB,EAAE,CAAC;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE;QACR,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,oBAAoB,EAAE,MAAM,EAAE,CAAC;KAChC,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,IAAI,CAAC;IACX,sBAAsB,EAAE,MAAM,CAAC;IAC/B,oEAAoE;IACpE,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,cAAc,CAAC,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,gBAAgB,CAAC,CAAa;gBAE1B,MAAM,EAAE,sBAAsB;IAQ1C;;;;;;;;;OASG;IACH,iBAAiB,CACf,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,KAAK,OAAO,CAAC,OAAO,CAAC,GACrE,MAAM,IAAI;IA8Bb;;;;;;OAMG;IACG,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAqFjF;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IA+E7E;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,EAAE;IAU5C;;OAEG;IACH,qBAAqB,CACnB,MAAM,EAAE,MAAM,GACb,KAAK,CAAC;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,WAAW,CAAA;KAAE,CAAC;IAmC7D;;OAEG;IACH,eAAe,IAAI,iBAAiB,GAAG,IAAI;IA0C3C;;OAEG;IACH,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAqCpD;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;OAEG;IACH,OAAO,CAAC,eAAe;CAyBxB"}
1
+ {"version":3,"file":"coordination.d.ts","sourceRoot":"","sources":["../../src/tasks/coordination.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAKjE,OAAO,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,KAAK,EACV,gBAAgB,EAChB,WAAW,EACX,uBAAuB,EACxB,MAAM,0BAA0B,CAAC;AAGlC,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,WAAW,CAAC;IACzB,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,iBAAiB,CAAC;IACxB,YAAY,EAAE,gBAAgB,CAAC;IAC/B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,WAAW,EAAE,uBAAuB,EAAE,CAAC;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE;QACR,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,oBAAoB,EAAE,MAAM,EAAE,CAAC;KAChC,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,IAAI,CAAC;IACX,sBAAsB,EAAE,MAAM,CAAC;IAC/B,oEAAoE;IACpE,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,cAAc,CAAC,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,gBAAgB,CAAC,CAAa;gBAE1B,MAAM,EAAE,sBAAsB;IAQ1C;;;;;;;;;OASG;IACH,iBAAiB,CACf,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,KAAK,OAAO,CAAC,OAAO,CAAC,GACrE,MAAM,IAAI;IA8Bb;;;;;;OAMG;IACG,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAyFjF;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IA+E7E;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,EAAE;IAU5C;;OAEG;IACH,qBAAqB,CACnB,MAAM,EAAE,MAAM,GACb,KAAK,CAAC;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,WAAW,CAAA;KAAE,CAAC;IAmC7D;;OAEG;IACH,eAAe,IAAI,iBAAiB,GAAG,IAAI;IA0C3C;;OAEG;IACH,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAqCpD;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;OAEG;IACH,OAAO,CAAC,eAAe;CAyBxB"}
@@ -74,7 +74,7 @@ export class TaskCoordinator {
74
74
  if (!task) {
75
75
  return null;
76
76
  }
77
- // Check if already assigned to another agent
77
+ // Fast-path read rejection (cheap) still atomically re-checked below.
78
78
  if (task.assignee && task.assignee !== this.agentId) {
79
79
  throw new Error(`Task already assigned to agent: ${task.assignee}`);
80
80
  }
@@ -83,12 +83,14 @@ export class TaskCoordinator {
83
83
  throw new Error(`Task is blocked by: ${task.blockedBy.join(', ')}`);
84
84
  }
85
85
  const branch = worktreeBranch || this.worktreeBranch || `feature/task-${taskId}`;
86
- // Update task
87
- this.taskService.update(taskId, {
88
- status: 'in_progress',
89
- assignee: this.agentId,
90
- worktreeBranch: branch,
91
- });
86
+ // Atomically claim — guards against two agent processes racing on the same
87
+ // task (both reading assignee=null, both assigning themselves). tryClaim is a
88
+ // single conditional UPDATE; false means another agent won the race.
89
+ const claimed = this.taskService.tryClaim(taskId, this.agentId, branch);
90
+ if (!claimed) {
91
+ const current = this.taskService.getWithRelations(taskId);
92
+ throw new Error(`Task already assigned to agent: ${current?.assignee ?? 'unknown'}`);
93
+ }
92
94
  // Determine files/resources affected by this task
93
95
  const resource = this.taskToResource(task);
94
96
  // Announce work
@@ -1 +1 @@
1
- {"version":3,"file":"coordination.js","sourceRoot":"","sources":["../../src/tasks/coordination.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"coordination.js","sourceRoot":"","sources":["../../src/tasks/coordination.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAOpE,OAAO,EAAE,eAAe,EAAqB,MAAM,gBAAgB,CAAC;AAkCpE;;;;;;GAMG;AACH,MAAM,OAAO,eAAe;IAClB,WAAW,CAAc;IACzB,YAAY,CAAsB;IAClC,OAAO,CAAS;IAChB,cAAc,CAAU;IACxB,QAAQ,CAAe;IACvB,gBAAgB,CAAc;IAEtC,YAAY,MAA8B;QACxC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACtC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,mBAAmB,CAAC;QAC/C,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;QAC5C,IAAI,CAAC,QAAQ,GAAG,eAAe,EAAE,CAAC;IACpC,CAAC;IAED;;;;;;;;;OASG;IACH,iBAAiB,CACf,OAAsE;QAEtE,wCAAwC;QACxC,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;QAE1B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,gBAAgB,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YACzE,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB;gBAAE,OAAO;YAE5C,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC7D,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,OAAO;YAEnC,4CAA4C;YAC5C,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,OAAO;gBAAE,OAAO;YAE5D,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACtD,IAAI,WAAW,EAAE,CAAC;gBAChB,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACjC,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,0CAA0C;oBAC1C,KAAK,GAAG,CAAC;gBACX,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;YAC1B,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;QACpC,CAAC,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,KAAK,CAAC,MAAc,EAAE,cAAuB;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,CAAC;QACd,CAAC;QAED,wEAAwE;QACxE,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,mCAAmC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,2BAA2B;QAC3B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,MAAM,GAAG,cAAc,IAAI,IAAI,CAAC,cAAc,IAAI,gBAAgB,MAAM,EAAE,CAAC;QAEjF,2EAA2E;QAC3E,8EAA8E;QAC9E,qEAAqE;QACrE,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACxE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAC1D,MAAM,IAAI,KAAK,CACb,mCAAmC,OAAO,EAAE,QAAQ,IAAI,SAAS,EAAE,CACpE,CAAC;QACJ,CAAC;QAED,kDAAkD;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAE3C,gBAAgB;QAChB,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAC5E,IAAI,CAAC,OAAO,EACZ,QAAQ,EACR,SAAS,EACT;YACE,WAAW,EAAE,oBAAoB,IAAI,CAAC,KAAK,EAAE;YAC7C,gBAAgB,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;SAC7C,CACF,CAAC;QAEF,mBAAmB;QACnB,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,MAAM,CAAE,CAAC;QAE/D,kEAAkE;QAClE,IAAI,OAA+B,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,mBAAmB,EAAE,CAAC;YACxC,MAAM,aAAa,GAAG,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YACvD,IAAI,aAAa,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/C,OAAO,GAAG;oBACR,cAAc,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC,CAAC;oBAClD,YAAY,EAAE,aAAa,CAAC,mBAAmB;oBAC/C,UAAU,EAAE,aAAa,CAAC,UAAU;iBACrC,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,0CAA0C;QAC5C,CAAC;QAED,8CAA8C;QAC9C,IAAI,QAAiC,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,aAAa,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAC/D,MAAM,SAAS,GAAG,aAAa,CAAC,uBAAuB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAC3E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/C,QAAQ,GAAG;oBACT,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;oBAClD,oBAAoB,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;iBAClE,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,uCAAuC;QACzC,CAAC;QAED,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,YAAY;YACZ,QAAQ;YACR,WAAW;YACX,cAAc,EAAE,MAAM;YACtB,OAAO;YACP,QAAQ;SACT,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,MAAe;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,CAAC;QACd,CAAC;QAED,wEAAwE;QACxE,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1D,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,6BAA6B;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAEvD,4BAA4B;QAC5B,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE;YACxD,MAAM,EAAE,gBAAgB;YACxB,QAAQ,EAAE,MAAM;YAChB,IAAI,EAAE;gBACJ,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM;aACP;SACF,CAAC,CAAC;QAEH,2CAA2C;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;QACzE,MAAM,cAAc,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAEjD,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE;gBACxD,MAAM,EAAE,iBAAiB;gBACzB,QAAQ,EAAE,MAAM;gBAChB,IAAI,EAAE;oBACJ,cAAc,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;oBACnE,KAAK,EAAE,cAAc,CAAC,MAAM;iBAC7B;aACF,CAAC,CAAC;QACL,CAAC;QAED,gEAAgE;QAChE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,wBAAwB,EAAE,CAAC;YAC1C,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACxD,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,KAAK,MAAM,CAAC;YAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC;YAE7C,KAAK,MAAM,OAAO,IAAI,OAAO,EAAE,CAAC;gBAC9B,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACrF,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,+CAA+C;QACjD,CAAC;QAED,yFAAyF;QACzF,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,KAAK,MAAM,CAAC;YAC/C,MAAM,UAAU,GAAG,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,SAAS;gBAC5D,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE;gBACpF,CAAC,CAAC,CAAC,CAAC;YACN,kBAAkB,CAAC;gBACjB,WAAW,EAAE,IAAI,CAAC,KAAK;gBACvB,OAAO,EAAE,SAAS;gBAClB,UAAU;gBACV,WAAW,EAAE,OAAO,CAAC,GAAG,EAAE;aAC3B,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,kCAAkC;QACpC,CAAC;QAED,OAAO;YACL,IAAI,EAAE,UAAU;YAChB,sBAAsB,EAAE,CAAC;YACzB,cAAc;SACf,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,MAAc;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAClE,CAAC;IAED;;OAEG;IACH,qBAAqB,CACnB,MAAc;QAEd,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC;QACrD,MAAM,OAAO,GAA+D,EAAE,CAAC;QAE/E,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO;gBAAE,SAAS;YAE5C,4CAA4C;YAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7E,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;oBACtD,yCAAyC;oBACzC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;wBACvC,QAAQ,EAAE,IAAI,CAAC,OAAO;wBACtB,MAAM,EAAE,aAAa;qBACtB,CAAC,CAAC;oBACH,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;wBACnC,OAAO,CAAC,IAAI,CAAC;4BACX,IAAI,EAAE,SAAS;4BACf,KAAK,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO;4BACrC,OAAO;yBACR,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,eAAe;QACb,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QAC5C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,+CAA+C;QAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC;QACrD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEnE,kBAAkB;QAClB,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACrC,IAAI,KAAK,GAAG,CAAC,CAAC;YAEd,mCAAmC;YACnC,KAAK,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;YAElC,gCAAgC;YAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAC3C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACnC,KAAK,IAAI,EAAE,CAAC;YACd,CAAC;YAED,8CAA8C;YAC9C,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAChC,KAAK,IAAI,CAAC,CAAC;YACb,CAAC;YAED,mCAAmC;YACnC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YAClC,CAAC;YAED,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,2BAA2B;QAC3B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAEzC,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,uBAAuB,CAAC,OAAiB;QACvC,MAAM,KAAK,GAAG,OAAO;aAClB,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;aACrC,MAAM,CAAC,CAAC,CAAC,EAAa,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAExC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,iFAAiF;QACjF,MAAM,SAAS,GAA2B;YACxC,GAAG,EAAE,CAAC;YACN,IAAI,EAAE,CAAC;YACP,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,CAAC;YACV,KAAK,EAAE,CAAC;YACR,IAAI,EAAE,CAAC;SACR,CAAC;QAEF,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAClB,iBAAiB;YACjB,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;gBAC9B,OAAO,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;YACjC,CAAC;YACD,YAAY;YACZ,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC3C,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC3C,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;gBAC9B,OAAO,UAAU,GAAG,UAAU,CAAC;YACjC,CAAC;YACD,qBAAqB;YACrB,OAAO,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,IAAU;QAC/B,+DAA+D;QAC/D,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,QAAQ,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;QAC7C,CAAC;QACD,OAAO,QAAQ,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;IACxC,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,IAA8B;QACpD,wBAAwB;QACxB,MAAM,WAAW,GAA2B;YAC1C,GAAG,EAAE,EAAE;YACP,IAAI,EAAE,EAAE;YACR,KAAK,EAAE,EAAE;YACT,OAAO,EAAE,GAAG;YACZ,KAAK,EAAE,GAAG;YACV,IAAI,EAAE,GAAG;SACV,CAAC;QAEF,IAAI,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5C,iDAAiD;QACjD,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YACxB,QAAQ,IAAI,GAAG,CAAC;QAClB,CAAC;QAED,yCAAyC;QACzC,IAAI,UAAU,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnD,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC;QACxC,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;CACF"}
@@ -20,6 +20,16 @@ export declare class TaskService {
20
20
  * Transitions them from 'blocked' to 'open' and emits events.
21
21
  */
22
22
  private notifyUnblockedDependents;
23
+ /**
24
+ * Atomically claim a task for an agent. Returns true if the claim succeeded,
25
+ * false if the task is already assigned to a DIFFERENT agent (or does not
26
+ * exist). Replaces the check-then-act in coordination.claim(), which had a
27
+ * TOCTOU race: two agent processes could each read assignee=null and both
28
+ * assign themselves. The single conditional UPDATE makes the claim atomic
29
+ * (SQLite serializes the write), and the WHERE guard is idempotent for
30
+ * re-claims by the same agent.
31
+ */
32
+ tryClaim(taskId: string, agentId: string, worktreeBranch: string): boolean;
23
33
  delete(id: string): boolean;
24
34
  private _hasDueDateColumn;
25
35
  private hasDueDateColumn;
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/tasks/service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,IAAI,EACJ,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,SAAS,EACT,eAAe,EACf,eAAe,EACf,UAAU,EAIV,cAAc,EAGd,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAKpB,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAC,CAAS;gBAEb,MAAM,GAAE,iBAAsB;IAS1C,OAAO,CAAC,UAAU;IAiBlB,MAAM,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAkDpC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAiB5B,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAsCtD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,IAAI,GAAG,IAAI;IAkIvD,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IA4B/C;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IAiEjC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAiB3B,OAAO,CAAC,iBAAiB,CAAwB;IACjD,OAAO,CAAC,gBAAgB;IAWxB,IAAI,CAAC,MAAM,GAAE,UAAe,GAAG,IAAI,EAAE;IAqFrC,KAAK,IAAI,iBAAiB,EAAE;IAK5B,OAAO,IAAI,iBAAiB,EAAE;IAK9B;;;OAGG;IACH,qBAAqB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,iBAAiB,EAAE;IA2FzD,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE;IAMrC,aAAa,CACX,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,cAAyB,GACjC,mBAAmB;IAyCtB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAW3D,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,EAAE;IASjD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE;IAanC,OAAO,CAAC,gBAAgB;IA8BxB,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,cAAc;IAUtB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAW9C,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,EAAE;IAY3C,QAAQ,IAAI,SAAS;IAwErB,aAAa,IAAI,MAAM;IAmCvB,WAAW,IAAI,IAAI;IAUnB,eAAe,IAAI,MAAM;IA0FzB,OAAO,CAAC,aAAa,SAAK,GAAG,WAAW,GAAG,IAAI;IA6E/C,YAAY,IAAI,WAAW,EAAE;CAa9B"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/tasks/service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,IAAI,EACJ,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,SAAS,EACT,eAAe,EACf,eAAe,EACf,UAAU,EAIV,cAAc,EAGd,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAKpB,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAC,CAAS;gBAEb,MAAM,GAAE,iBAAsB;IAS1C,OAAO,CAAC,UAAU;IAiBlB,MAAM,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAkDpC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAiB5B,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAsCtD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,IAAI,GAAG,IAAI;IAuIvD,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IA4B/C;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IAiEjC;;;;;;;;OAQG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO;IAa1E,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAiB3B,OAAO,CAAC,iBAAiB,CAAwB;IACjD,OAAO,CAAC,gBAAgB;IAWxB,IAAI,CAAC,MAAM,GAAE,UAAe,GAAG,IAAI,EAAE;IAqFrC,KAAK,IAAI,iBAAiB,EAAE;IAK5B,OAAO,IAAI,iBAAiB,EAAE;IAK9B;;;OAGG;IACH,qBAAqB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,iBAAiB,EAAE;IA2FzD,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE;IAMrC,aAAa,CACX,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,cAAyB,GACjC,mBAAmB;IAyCtB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAW3D,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,EAAE;IASjD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE;IAanC,OAAO,CAAC,gBAAgB;IA8BxB,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,cAAc;IAUtB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAW9C,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,EAAE;IAY3C,QAAQ,IAAI,SAAS;IAwErB,aAAa,IAAI,MAAM;IAmCvB,WAAW,IAAI,IAAI;IAUnB,eAAe,IAAI,MAAM;IA0FzB,OAAO,CAAC,aAAa,SAAK,GAAG,WAAW,GAAG,IAAI;IA0F/C,YAAY,IAAI,WAAW,EAAE;CAa9B"}
@@ -140,11 +140,17 @@ export class TaskService {
140
140
  updates.push('status = ?');
141
141
  params.push(input.status);
142
142
  changes.push({ field: 'status', oldValue: existing.status, newValue: input.status });
143
- // Set closed_at if closing
143
+ // Set closed_at if closing; CLEAR it if reopening. Previously closed_at was
144
+ // only ever set (never cleared), so a done→open/in_progress transition left
145
+ // a stale close timestamp, corrupting duration/overdue calculations.
144
146
  if (input.status === 'done' || input.status === 'wont_do') {
145
147
  updates.push('closed_at = ?');
146
148
  params.push(now);
147
149
  }
150
+ else {
151
+ updates.push('closed_at = ?');
152
+ params.push(null);
153
+ }
148
154
  }
149
155
  if (input.priority !== undefined && input.priority !== existing.priority) {
150
156
  updates.push('priority = ?');
@@ -297,6 +303,25 @@ export class TaskService {
297
303
  });
298
304
  }
299
305
  }
306
+ /**
307
+ * Atomically claim a task for an agent. Returns true if the claim succeeded,
308
+ * false if the task is already assigned to a DIFFERENT agent (or does not
309
+ * exist). Replaces the check-then-act in coordination.claim(), which had a
310
+ * TOCTOU race: two agent processes could each read assignee=null and both
311
+ * assign themselves. The single conditional UPDATE makes the claim atomic
312
+ * (SQLite serializes the write), and the WHERE guard is idempotent for
313
+ * re-claims by the same agent.
314
+ */
315
+ tryClaim(taskId, agentId, worktreeBranch) {
316
+ const now = new Date().toISOString();
317
+ const result = this.db
318
+ .prepare(`UPDATE tasks
319
+ SET assignee = ?, status = 'in_progress', worktree_branch = ?, updated_at = ?
320
+ WHERE id = ?
321
+ AND (assignee IS NULL OR assignee = '' OR assignee = ?)`)
322
+ .run(agentId, worktreeBranch, now, taskId, agentId);
323
+ return result.changes > 0;
324
+ }
300
325
  delete(id) {
301
326
  // Delete dependencies first
302
327
  this.db.prepare('DELETE FROM task_dependencies WHERE from_task = ? OR to_task = ?').run(id, id);
@@ -799,11 +824,22 @@ export class TaskService {
799
824
  closedPeriod: period,
800
825
  createdAt: new Date().toISOString(),
801
826
  });
802
- // Delete compacted tasks
827
+ // Delete compacted tasks AND their related rows (dependencies, history,
828
+ // activity) atomically — mirrors delete(). The previous code dropped only
829
+ // the `tasks` rows, orphaning FK rows in task_dependencies/task_history/
830
+ // task_activity, so getWithRelations()/wouldCreateCycle() later read ghost
831
+ // dependencies (e.g. a live task appearing permanently blocked by a task
832
+ // that no longer exists).
803
833
  const ids = tasks.map((t) => t.id);
804
- this.db
805
- .prepare(`DELETE FROM tasks WHERE id IN (${ids.map(() => '?').join(',')})`)
806
- .run(...ids);
834
+ const ph = ids.map(() => '?').join(',');
835
+ this.db.transaction(() => {
836
+ this.db
837
+ .prepare(`DELETE FROM task_dependencies WHERE from_task IN (${ph}) OR to_task IN (${ph})`)
838
+ .run(...ids, ...ids);
839
+ this.db.prepare(`DELETE FROM task_history WHERE task_id IN (${ph})`).run(...ids);
840
+ this.db.prepare(`DELETE FROM task_activity WHERE task_id IN (${ph})`).run(...ids);
841
+ this.db.prepare(`DELETE FROM tasks WHERE id IN (${ph})`).run(...ids);
842
+ })();
807
843
  }
808
844
  return summaries[0] || null;
809
845
  }