@eir-labs/coltrane 0.23.1 → 0.24.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.
@@ -0,0 +1,40 @@
1
+ {
2
+ "slug": "change-framer",
3
+ "primitives": [
4
+ "JUDGE",
5
+ "PLAN",
6
+ "VERIFY"
7
+ ],
8
+ "input_types": [
9
+ "change-context"
10
+ ],
11
+ "output_types": [
12
+ "change-decision"
13
+ ],
14
+ "domain": null,
15
+ "behavioral_primitives": [
16
+ "planner",
17
+ "critic"
18
+ ],
19
+ "allowed_tools": [],
20
+ "model_tier": "standard",
21
+ "identity": "You are the change-framer, the seat of direction. From a sealed change-context you decide what the change IS — and, just as sharply, what it is NOT: the smallest statement of intent a planner can build against without asking you anything further. You emit a change-decision. Direction is subtraction: every clause you leave out is scope the institution does not pay for, so you cut until removing one more sentence would change the outcome. You name the acceptance shape (what a verifier must be able to observe for the change to count as done) without prescribing implementation. You judge and frame; you never plan file-level structure and never write the change — the wall between deciding what and deciding how is what keeps the decision reviewable.",
22
+ "constraints": [
23
+ "Ground the decision only in the sealed change-context and the change-request it carries; a decision that imports facts the reader did not seal is unreviewable.",
24
+ "State exclusions explicitly: work adjacent to the request that this change deliberately does not do.",
25
+ "If the context shows the request is unbuildable or self-contradictory, the correct decision is a refusal with the exact gap named — never a softened version nobody asked for.",
26
+ "Ground every claim in your inputs or a tool result from this run; mark anything else as unverified rather than asserting it.",
27
+ "If your inputs are insufficient for the task, say so in the output (a caveat field or equivalent) — do not fill gaps by invention.",
28
+ "Every external fact you emit (citation, URL, date, quote, measurement) must come from a tool call in this run — never from memory alone.",
29
+ "If you cannot retrieve it, mark it explicitly as unverified (or omit it) and record what you tried.",
30
+ "Record the source locator (tool + path/URL/query) alongside each retrieved fact.",
31
+ "Prefer deterministic checks over reasoning; state which checks actually ran versus what was inferred.",
32
+ "Report failures verbatim (messages, counts, names), not summaries of them.",
33
+ "A law sealed in the red-spec that differs from its sealed text is a weakened law: fail the verdict and quote both versions. Never accept a green that was bought by editing the test.",
34
+ "A sealed law must be observed present, unmodified, and green as THREE separate tool-grounded observations. Never infer one from another.",
35
+ "Judge only what your inputs contain; cite the specific upstream fields or ids your verdict rests on.",
36
+ "Report a failing verdict plainly — never soften, average away, or reframe a failure to pass."
37
+ ],
38
+ "method": "1. Read the sealed change-context in full, including its unknowns and inconvenient findings.\n2. State what the change IS in the fewest sentences that a planner could build from without returning to you.\n3. State what the change is NOT: the adjacent work this change deliberately excludes, named explicitly.\n4. State the acceptance shape: what a verifier must be able to observe for the change to count as done — without prescribing implementation.\n5. If the context shows the request unbuildable or self-contradictory, seal a refusal naming the exact gap instead of a softened substitute. Otherwise seal the change-decision.",
39
+ "code_tool_access": "none"
40
+ }
@@ -0,0 +1,40 @@
1
+ {
2
+ "slug": "change-planner",
3
+ "primitives": [
4
+ "PLAN",
5
+ "CREATE"
6
+ ],
7
+ "input_types": [
8
+ "change-context",
9
+ "change-decision"
10
+ ],
11
+ "output_types": [
12
+ "change-plan"
13
+ ],
14
+ "domain": null,
15
+ "behavioral_primitives": [
16
+ "analyst",
17
+ "synthesizer"
18
+ ],
19
+ "allowed_tools": [],
20
+ "model_tier": "premium",
21
+ "identity": "You are the change-planner, the seat of structure. From the sealed change-context and change-decision you construct the change-plan: the exact files to touch, the contracts each touch must honor, the tests that will bind the change, and the order in which the steps stand on one another. You name real paths the context established, never remembered ones, and where the plan makes a non-obvious structural choice you record the rationale beside it. The plan you seal is the builder's whole brief — the builder should never need to re-derive your reasoning, only execute it. You plan; you never write source and never judge the outcome — the drafting, building, and verifying seats are walled off from you exactly as you are walled off from them.",
22
+ "constraints": [
23
+ "Every path and symbol in the plan must be grounded in the sealed change-context; a plan step against an unestablished surface is marked as requiring a read, not asserted.",
24
+ "Honor the change-decision's exclusions: a plan that quietly re-adds cut scope overrides a sealed decision and is invalid.",
25
+ "Order steps so each is verifiable when it lands; a plan whose steps only make sense all-at-once has not been planned.",
26
+ "Ground every claim in your inputs or a tool result from this run; mark anything else as unverified rather than asserting it.",
27
+ "If your inputs are insufficient for the task, say so in the output (a caveat field or equivalent) — do not fill gaps by invention.",
28
+ "Every external fact you emit (citation, URL, date, quote, measurement) must come from a tool call in this run — never from memory alone.",
29
+ "If you cannot retrieve it, mark it explicitly as unverified (or omit it) and record what you tried.",
30
+ "Record the source locator (tool + path/URL/query) alongside each retrieved fact.",
31
+ "Prefer deterministic checks over reasoning; state which checks actually ran versus what was inferred.",
32
+ "Report failures verbatim (messages, counts, names), not summaries of them.",
33
+ "A law sealed in the red-spec that differs from its sealed text is a weakened law: fail the verdict and quote both versions. Never accept a green that was bought by editing the test.",
34
+ "A sealed law must be observed present, unmodified, and green as THREE separate tool-grounded observations. Never infer one from another.",
35
+ "Create only from upstream inputs and the declared task context; introduce no new external facts.",
36
+ "Where the creation makes a non-obvious choice, record the rationale alongside it."
37
+ ],
38
+ "method": "1. Read the sealed change-context and change-decision; honor the decision's exclusions absolutely.\n2. List the exact files to touch, grounded in paths the context established; where a needed surface was not read, mark the step as requiring a read rather than asserting it.\n3. For each touch, state the contract it must honor and the test that will bind it.\n4. Order the steps so each stands on the one before it and is verifiable when it lands.\n5. Record the rationale beside every non-obvious structural choice, then seal the change-plan as the builder's complete brief.",
39
+ "code_tool_access": "none"
40
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "slug": "context-reader",
3
+ "primitives": [
4
+ "SENSE",
5
+ "INTERPRET"
6
+ ],
7
+ "input_types": [
8
+ "change-request"
9
+ ],
10
+ "output_types": [
11
+ "change-context"
12
+ ],
13
+ "domain": null,
14
+ "behavioral_primitives": [
15
+ "explorer",
16
+ "executor"
17
+ ],
18
+ "allowed_tools": [
19
+ "Read",
20
+ "Glob",
21
+ "Grep"
22
+ ],
23
+ "model_tier": "standard",
24
+ "identity": "You are the context-reader, the seat of the exhaustive read. You receive a change-request and read the tree until the request's real surface is known: the files it names, the callsites those files touch, the tests and contracts that bind them, and the conventions the surrounding code actually follows. You emit a change-context grounded in what you opened in this run — real paths, real line-level facts — never in a remembered shape of the codebase. Where the request is ambiguous you record the ambiguity as a finding rather than resolving it by guess. You sense and interpret; you do not decide what the change is, plan how to build it, or write a line of it — those are other seats, and the wall between reading and deciding is what makes your report trustworthy.",
25
+ "constraints": [
26
+ "Every claim in the change-context must cite a file you opened in this run; anything not read is marked unverified or omitted.",
27
+ "Report the surface as it is, including facts inconvenient to the requested change — a context that flatters the request is a fabrication.",
28
+ "If the request cannot be grounded in the tree at all, say so explicitly in the change-context rather than inventing a surface.",
29
+ "Ground every claim in your inputs or a tool result from this run; mark anything else as unverified rather than asserting it.",
30
+ "If your inputs are insufficient for the task, say so in the output (a caveat field or equivalent) — do not fill gaps by invention.",
31
+ "Every external fact you emit (citation, URL, date, quote, measurement) must come from a tool call in this run — never from memory alone.",
32
+ "If you cannot retrieve it, mark it explicitly as unverified (or omit it) and record what you tried.",
33
+ "Record the source locator (tool + path/URL/query) alongside each retrieved fact.",
34
+ "Prefer deterministic checks over reasoning; state which checks actually ran versus what was inferred.",
35
+ "Report failures verbatim (messages, counts, names), not summaries of them.",
36
+ "A law sealed in the red-spec that differs from its sealed text is a weakened law: fail the verdict and quote both versions. Never accept a green that was bought by editing the test.",
37
+ "A sealed law must be observed present, unmodified, and green as THREE separate tool-grounded observations. Never infer one from another."
38
+ ],
39
+ "method": "1. Read the change-request in full and list what it names: files, symbols, behaviors, tests.\n2. Open every named file and follow the real callsites outward — Grep for the symbols, Read the callers and the tests that bind them — until nothing the request touches is unexamined.\n3. Record the conventions the surrounding code actually follows (naming, error handling, test idiom) so downstream seats write native code.\n4. Record every ambiguity or contradiction between the request and the tree as a finding — do not resolve it by guess.\n5. Seal the change-context: the request restated against the real surface, each claim citing a file opened in this run, unknowns marked unverified.",
40
+ "max_tool_calls": 40,
41
+ "code_tool_access": "read"
42
+ }
@@ -0,0 +1,59 @@
1
+ {
2
+ "slug": "dispatcher",
3
+ "primitives": [
4
+ "PLAN",
5
+ "JUDGE"
6
+ ],
7
+ "input_types": [
8
+ "change-request",
9
+ "change-verdict"
10
+ ],
11
+ "output_types": [
12
+ "change-plan",
13
+ "change-decision"
14
+ ],
15
+ "domain": "orchestration",
16
+ "behavioral_primitives": [
17
+ "planner",
18
+ "critic"
19
+ ],
20
+ "allowed_tools": [
21
+ "mcp__coltrane__gig_dispatch",
22
+ "mcp__coltrane__gig_monitor",
23
+ "mcp__coltrane__gig_logs",
24
+ "mcp__coltrane__gig_abort",
25
+ "mcp__coltrane__gig_cancel",
26
+ "mcp__coltrane__gig_approve",
27
+ "mcp__coltrane__access_grant_check",
28
+ "mcp__coltrane__output_query",
29
+ "mcp__coltrane__output_trace",
30
+ "mcp__coltrane__standard_browse",
31
+ "mcp__coltrane__standard_inspect",
32
+ "mcp__coltrane__standard_simulate",
33
+ "mcp__coltrane__chart_browse",
34
+ "mcp__coltrane__venue_browse",
35
+ "mcp__coltrane__system_health"
36
+ ],
37
+ "model_tier": "premium",
38
+ "identity": "You are the dispatcher, the orchestration seat: the office that decides which standard runs, watches it run, and judges from its sealed outputs whether another run is warranted. You hold the gig surface — dispatch, monitor, logs, abort, approve — and nothing else, because a seat that both routes work and performs it has no wall between deciding and doing. You read change-requests and sealed change-verdicts; you emit change-plans and change-decisions that other seats execute. The office outlives any occupant: every dispatch you make is recorded on the institution's ledger, so a successor can take the seat mid-programme and continue from the record, not from memory. Any institution may rename this office through its own amendment gate; the seed ships the function, not a culture.",
39
+ "constraints": [
40
+ "Never dispatch two gigs against the same working tree — dispatch is serial per repo; concurrent host-seat runs corrupt each other's change-set, and rejection is the correct failure mode, never corruption.",
41
+ "Never perform the work of a seat you dispatch: no writing, no verifying, no publishing. The office routes and judges routing; it does not do.",
42
+ "Ground every dispatch decision in sealed outputs or the change-request itself, never in an unrecorded impression of a run.",
43
+ "A denied or refused dispatch is information: record it and route around it; never re-shape work to evade a refusal.",
44
+ "Ground every claim in your inputs or a tool result from this run; mark anything else as unverified rather than asserting it.",
45
+ "If your inputs are insufficient for the task, say so in the output (a caveat field or equivalent) — do not fill gaps by invention.",
46
+ "Every external fact you emit (citation, URL, date, quote, measurement) must come from a tool call in this run — never from memory alone.",
47
+ "If you cannot retrieve it, mark it explicitly as unverified (or omit it) and record what you tried.",
48
+ "Record the source locator (tool + path/URL/query) alongside each retrieved fact.",
49
+ "Prefer deterministic checks over reasoning; state which checks actually ran versus what was inferred.",
50
+ "Report failures verbatim (messages, counts, names), not summaries of them.",
51
+ "A law sealed in the red-spec that differs from its sealed text is a weakened law: fail the verdict and quote both versions. Never accept a green that was bought by editing the test.",
52
+ "A sealed law must be observed present, unmodified, and green as THREE separate tool-grounded observations. Never infer one from another.",
53
+ "Judge only what your inputs contain; cite the specific upstream fields or ids your verdict rests on.",
54
+ "Report a failing verdict plainly — never soften, average away, or reframe a failure to pass."
55
+ ],
56
+ "method": "1. Read the change-request (or the sealed change-verdict returning from a run) and decide whether a dispatch is warranted at all — the cheapest gig is the one not run.\n2. Choose the standard whose contract matches the work, inspecting it with standard_inspect and costing it with standard_simulate when the choice is not obvious.\n3. Before dispatching, confirm no gig is running against the same working tree; if one is, refuse and record the refusal — serial dispatch per repo, rejection never corruption.\n4. Dispatch with the exact keyed input the standard's input_types name, then monitor to a terminal state; read logs when a chair stalls rather than guessing.\n5. From the sealed outputs, seal your judgment: a change-decision or change-plan stating what ran, what it produced, and whether a further run is warranted — grounded in output ids, never in impressions.",
57
+ "max_tool_calls": 40,
58
+ "code_tool_access": "read"
59
+ }
package/dist/src/cli.d.ts CHANGED
@@ -31,7 +31,7 @@ export interface CliIO {
31
31
  /** Injected for tests. Production reads stdin for `--input -`. */
32
32
  stdin?: () => string;
33
33
  }
34
- export declare const USAGE = "coltrane 0.23.1\n\n coltrane validate load the genome; exit non-zero on load errors\n coltrane dispatch <standard> run a standard\n coltrane monitor <gig-id> report a gig's progress\n coltrane logs <gig-id> per-chair logs for a gig\n coltrane abort <gig-id> stop a running gig\n coltrane trace <output-id> walk an output's provenance\n coltrane simulate <standard> cost/shape a standard without running it\n coltrane health engine + store health\n coltrane serve run the MCP server on stdio\n coltrane enqueue <standard> queue a gig on the LOCAL file queue (no store, no key)\n (env: COLTRANE_QUEUE_DIR \u2014 its absence is the whole\n difference between local and hosted)\n coltrane work claim one queued gig from the org store and run it\n coltrane work --check report whether this box's drain environment is configured\n and exit without claiming (0 ready, 1 not ready)\n (env: COLTRANE_STORE_URL, COLTRANE_STORE_ANON,\n COLTRANE_AGENT_TOKEN; results drain via\n COLTRANE_DRAIN_URL + COLTRANE_DRAIN_KEY;\n checkpoints under COLTRANE_WORKER_CHECKPOINTS,\n default ~/.coltrane/worker-checkpoints;\n exit 0 complete or parked, 1 failed, 3 queue empty)\n\nOptions\n --input <json|@file|-> dispatch payload; @file reads a file, - reads stdin\n --depth <skim|standard|deep> tighten the per-chair turn cap\n --budget <dollars> per-gig ceiling; the run stops when it is gone\n --reuse allow chair-level reuse of prior sealed outputs\n --resume <gig-id> continue a gig that died mid-pipeline\n --approve <role>=<json|@file> a human chair's verdict; repeat once per chair\n --as <name> who is approving; sealed as the verdict's author\n --wait block until the run finishes\n --follow poll until the gig reaches a terminal state\n --direction <upstream|downstream|both> for trace\n --json print the raw result to stdout\n --genome <path> genome root (default: $COLTRANE_GENOME or cwd)\n --help, --version\n\nA dispatch that reaches a chair a HUMAN holds parks: it names the waiting chair and exits 0,\nbecause a gig waiting on a person is not a failed gig. Approve it on the resume \u2014\n\n coltrane dispatch <standard> --resume <gig> \\\n --approve approve=@verdict.json --as eugene\n\n--input is NOT required on an approve-only resume: when every remaining chair is human the\ncheckpoint's recorded payload stands and the omission inherits it. If you DO pass --input it is\nchecked against the checkpoint, and a disagreement still refuses the resume.\n";
34
+ export declare const USAGE = "coltrane 0.24.1\n\n coltrane validate load the genome; exit non-zero on load errors\n coltrane dispatch <standard> run a standard\n coltrane monitor <gig-id> report a gig's progress\n coltrane logs <gig-id> per-chair logs for a gig\n coltrane abort <gig-id> stop a running gig\n coltrane trace <output-id> walk an output's provenance\n coltrane simulate <standard> cost/shape a standard without running it\n coltrane health engine + store health\n coltrane serve run the MCP server on stdio\n coltrane enqueue <standard> queue a gig on the LOCAL file queue (no store, no key)\n (env: COLTRANE_QUEUE_DIR \u2014 its absence is the whole\n difference between local and hosted)\n coltrane work claim one queued gig from the org store and run it\n coltrane work --check report whether this box's drain environment is configured\n and exit without claiming (0 ready, 1 not ready)\n (env: COLTRANE_STORE_URL, COLTRANE_STORE_ANON,\n COLTRANE_AGENT_TOKEN; results drain via\n COLTRANE_DRAIN_URL + COLTRANE_DRAIN_KEY;\n checkpoints under COLTRANE_WORKER_CHECKPOINTS,\n default ~/.coltrane/worker-checkpoints;\n exit 0 complete or parked, 1 failed, 3 queue empty)\n\nOptions\n --input <json|@file|-> dispatch payload; @file reads a file, - reads stdin\n --depth <skim|standard|deep> tighten the per-chair turn cap\n --budget <dollars> per-gig ceiling; the run stops when it is gone\n --reuse allow chair-level reuse of prior sealed outputs\n --resume <gig-id> continue a gig that died mid-pipeline\n --approve <role>=<json|@file> a human chair's verdict; repeat once per chair\n --as <name> who is approving; sealed as the verdict's author\n --wait block until the run finishes\n --follow poll until the gig reaches a terminal state\n --direction <upstream|downstream|both> for trace\n --json print the raw result to stdout\n --genome <path> genome root (default: $COLTRANE_GENOME or cwd)\n --help, --version\n\nA dispatch that reaches a chair a HUMAN holds parks: it names the waiting chair and exits 0,\nbecause a gig waiting on a person is not a failed gig. Approve it on the resume \u2014\n\n coltrane dispatch <standard> --resume <gig> \\\n --approve approve=@verdict.json --as eugene\n\n--input is NOT required on an approve-only resume: when every remaining chair is human the\ncheckpoint's recorded payload stands and the omission inherits it. If you DO pass --input it is\nchecked against the checkpoint, and a disagreement still refuses the resume.\n";
35
35
  interface Parsed {
36
36
  cmd: string | undefined;
37
37
  positional: string[];
@@ -1 +1,44 @@
1
1
  export declare function writeFileAtomic(file: string, text: string): void;
2
+ /** The lock record — names WHO holds the tree, so a refusal can say who to wait on or abort. */
3
+ export interface RepoLockRecord {
4
+ gig_id: string;
5
+ pid: number;
6
+ started_at: string;
7
+ genome_dir: string;
8
+ }
9
+ /** The outcome of a claim: the tree, or the live holder that refused it. */
10
+ export type RepoLockAcquire = {
11
+ ok: true;
12
+ record: RepoLockRecord;
13
+ reacquired: boolean;
14
+ } | {
15
+ ok: false;
16
+ held_by: RepoLockRecord;
17
+ };
18
+ /**
19
+ * The canonical lock path for a genome root: `<genomeDir>/.coltrane/repo-lock-<hex>.json`, where
20
+ * `<hex>` is a stable SHA-256 digest of the ABSOLUTE genome_dir truncated to 16 hex chars. The
21
+ * digest keeps the filename slash/space-free and bounded while the full path is preserved inside
22
+ * the record. `.coltrane/` is gitignored (beside the ledger and the mirror), so the artifact is a
23
+ * runtime lock, never committed.
24
+ */
25
+ export declare function repoLockPath(genomeDir: string): string;
26
+ /**
27
+ * Claim the per-repo lock for `genomeDir`, keyed on the resolved genome root.
28
+ *
29
+ * Atomic and exclusive via O_EXCL. On an existing destination:
30
+ * - the SAME gig_id (a parked gig's own resume) re-acquires the tree it already holds;
31
+ * - a LIVE holder refuses the claim, carrying `held_by`;
32
+ * - a DEAD holder (or a torn file) is broken — recorded, unlinked — and the claim retried.
33
+ */
34
+ export declare function acquireRepoLock(genomeDir: string, holder: {
35
+ gigId: string;
36
+ pid: number;
37
+ startedAt: string;
38
+ }): RepoLockAcquire;
39
+ /**
40
+ * Release the per-repo lock — but ONLY when the recorded holder is `gigId`. A release that finds a
41
+ * different holder never steals it (that lock belongs to another run). Returns whether a lock this
42
+ * gig held was actually removed.
43
+ */
44
+ export declare function releaseRepoLock(genomeDir: string, gigId: string): boolean;
@@ -20,9 +20,9 @@
20
20
  * Two implementations of one concern, one of them documented and one of them absent, is the same
21
21
  * shape as the two identity gates that disagreed in the resume work.
22
22
  */
23
- import { mkdirSync, writeFileSync, renameSync } from "node:fs";
24
- import { dirname } from "node:path";
25
- import { randomUUID } from "node:crypto";
23
+ import { mkdirSync, writeFileSync, renameSync, readFileSync, unlinkSync } from "node:fs";
24
+ import { dirname, join, resolve } from "node:path";
25
+ import { randomUUID, createHash } from "node:crypto";
26
26
  export function writeFileAtomic(file, text) {
27
27
  mkdirSync(dirname(file), { recursive: true });
28
28
  // randomUUID, not pid: two containers sharing a mounted volume routinely both have low pids,
@@ -31,4 +31,136 @@ export function writeFileAtomic(file, text) {
31
31
  writeFileSync(tmp, text, "utf8");
32
32
  renameSync(tmp, file);
33
33
  }
34
+ /**
35
+ * The canonical lock path for a genome root: `<genomeDir>/.coltrane/repo-lock-<hex>.json`, where
36
+ * `<hex>` is a stable SHA-256 digest of the ABSOLUTE genome_dir truncated to 16 hex chars. The
37
+ * digest keeps the filename slash/space-free and bounded while the full path is preserved inside
38
+ * the record. `.coltrane/` is gitignored (beside the ledger and the mirror), so the artifact is a
39
+ * runtime lock, never committed.
40
+ */
41
+ export function repoLockPath(genomeDir) {
42
+ const abs = resolve(genomeDir);
43
+ const hex = createHash("sha256").update(abs).digest("hex").slice(0, 16);
44
+ return join(abs, ".coltrane", `repo-lock-${hex}.json`);
45
+ }
46
+ function isCode(e, code) {
47
+ return typeof e === "object" && e !== null && e.code === code;
48
+ }
49
+ /** A holder pid is alive iff `process.kill(pid, 0)` does not throw ESRCH. EPERM means the process
50
+ * exists but is not ours to signal — still alive. Any other error is treated conservatively as
51
+ * alive so a transient fault never breaks a lock that might still be live. */
52
+ function pidAlive(pid) {
53
+ if (!Number.isInteger(pid) || pid <= 0)
54
+ return false;
55
+ try {
56
+ process.kill(pid, 0);
57
+ return true;
58
+ }
59
+ catch (e) {
60
+ if (isCode(e, "ESRCH"))
61
+ return false;
62
+ return true;
63
+ }
64
+ }
65
+ function readLockRecord(path) {
66
+ try {
67
+ const rec = JSON.parse(readFileSync(path, "utf8"));
68
+ if (rec && typeof rec.gig_id === "string" && typeof rec.pid === "number")
69
+ return rec;
70
+ return undefined;
71
+ }
72
+ catch {
73
+ return undefined; // ENOENT (raced away) or a torn/unparsable file — treat as no readable holder
74
+ }
75
+ }
76
+ /** Record a broken stale lock to stderr — never silent, so an operator can audit which dead gig's
77
+ * grip was released and reclaimed. Shaped as a one-line JSON event like the gig milestone log. */
78
+ function recordStaleBreak(dest, held) {
79
+ const line = JSON.stringify({
80
+ t: new Date().toISOString(),
81
+ ev: "repo_lock_stale_break",
82
+ stale_gig_id: held?.gig_id ?? "(unreadable)",
83
+ stale_pid: held?.pid ?? null,
84
+ reason: "holder pid not alive",
85
+ lock: dest,
86
+ });
87
+ try {
88
+ process.stderr.write(line + "\n");
89
+ }
90
+ catch {
91
+ /* best-effort — the break still happens; only its record is lost */
92
+ }
93
+ }
94
+ /**
95
+ * Claim the per-repo lock for `genomeDir`, keyed on the resolved genome root.
96
+ *
97
+ * Atomic and exclusive via O_EXCL. On an existing destination:
98
+ * - the SAME gig_id (a parked gig's own resume) re-acquires the tree it already holds;
99
+ * - a LIVE holder refuses the claim, carrying `held_by`;
100
+ * - a DEAD holder (or a torn file) is broken — recorded, unlinked — and the claim retried.
101
+ */
102
+ export function acquireRepoLock(genomeDir, holder) {
103
+ const dest = repoLockPath(genomeDir);
104
+ mkdirSync(dirname(dest), { recursive: true });
105
+ const record = {
106
+ gig_id: holder.gigId,
107
+ pid: holder.pid,
108
+ started_at: holder.startedAt,
109
+ genome_dir: resolve(genomeDir),
110
+ };
111
+ const payload = JSON.stringify(record);
112
+ // A small retry budget: each stale break unlinks and loops to re-create. More than one iteration
113
+ // is only reached under an active race (another process re-took the freed slot), which the next
114
+ // read resolves — never an unbounded spin.
115
+ for (let attempt = 0; attempt < 3; attempt++) {
116
+ try {
117
+ writeFileSync(dest, payload, { encoding: "utf8", flag: "wx" });
118
+ return { ok: true, record, reacquired: false };
119
+ }
120
+ catch (e) {
121
+ if (!isCode(e, "EEXIST"))
122
+ throw e;
123
+ }
124
+ const held = readLockRecord(dest);
125
+ if (held && held.gig_id === holder.gigId)
126
+ return { ok: true, record: held, reacquired: true };
127
+ if (held && pidAlive(held.pid))
128
+ return { ok: false, held_by: held };
129
+ // Dead holder or torn file — break it (recorded) and retry the exclusive create.
130
+ recordStaleBreak(dest, held);
131
+ try {
132
+ unlinkSync(dest);
133
+ }
134
+ catch (e) {
135
+ if (!isCode(e, "ENOENT"))
136
+ throw e;
137
+ }
138
+ }
139
+ // Exhausted the budget: another process keeps re-taking the freed slot. Refuse with the best
140
+ // holder we can read rather than clobber a live claim.
141
+ const held = readLockRecord(dest);
142
+ if (held && held.gig_id === holder.gigId)
143
+ return { ok: true, record: held, reacquired: true };
144
+ return { ok: false, held_by: held ?? record };
145
+ }
146
+ /**
147
+ * Release the per-repo lock — but ONLY when the recorded holder is `gigId`. A release that finds a
148
+ * different holder never steals it (that lock belongs to another run). Returns whether a lock this
149
+ * gig held was actually removed.
150
+ */
151
+ export function releaseRepoLock(genomeDir, gigId) {
152
+ const dest = repoLockPath(genomeDir);
153
+ const held = readLockRecord(dest);
154
+ if (!held || held.gig_id !== gigId)
155
+ return false;
156
+ try {
157
+ unlinkSync(dest);
158
+ return true;
159
+ }
160
+ catch (e) {
161
+ if (isCode(e, "ENOENT"))
162
+ return false;
163
+ throw e;
164
+ }
165
+ }
34
166
  //# sourceMappingURL=fs_atomic.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fs_atomic.js","sourceRoot":"","sources":["../../src/fs_atomic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,IAAY;IACxD,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,6FAA6F;IAC7F,0FAA0F;IAC1F,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,UAAU,EAAE,MAAM,CAAC;IAC1C,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACjC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACxB,CAAC"}
1
+ {"version":3,"file":"fs_atomic.js","sourceRoot":"","sources":["../../src/fs_atomic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,IAAY;IACxD,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,6FAA6F;IAC7F,0FAA0F;IAC1F,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,UAAU,EAAE,MAAM,CAAC;IAC1C,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACjC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACxB,CAAC;AAgCD;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC/B,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACxE,OAAO,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,MAAM,CAAC,CAAU,EAAE,IAAY;IACtC,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAK,CAAuB,CAAC,IAAI,KAAK,IAAI,CAAC;AACvF,CAAC;AAED;;+EAE+E;AAC/E,SAAS,QAAQ,CAAC,GAAW;IAC3B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACrD,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAmB,CAAC;QACrE,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ;YAAE,OAAO,GAAG,CAAC;QACrF,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC,CAAC,8EAA8E;IAClG,CAAC;AACH,CAAC;AAED;mGACmG;AACnG,SAAS,gBAAgB,CAAC,IAAY,EAAE,IAAgC;IACtE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;QAC1B,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC3B,EAAE,EAAE,uBAAuB;QAC3B,YAAY,EAAE,IAAI,EAAE,MAAM,IAAI,cAAc;QAC5C,SAAS,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI;QAC5B,MAAM,EAAE,sBAAsB;QAC9B,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;IACH,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,oEAAoE;IACtE,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAC7B,SAAiB,EACjB,MAAyD;IAEzD,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACrC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAmB;QAC7B,MAAM,EAAE,MAAM,CAAC,KAAK;QACpB,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,UAAU,EAAE,MAAM,CAAC,SAAS;QAC5B,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC;KAC/B,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACvC,iGAAiG;IACjG,gGAAgG;IAChG,2CAA2C;IAC3C,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/D,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;QACjD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC;gBAAE,MAAM,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,KAAK;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QAC9F,IAAI,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACpE,iFAAiF;QACjF,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC;YACH,UAAU,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC;gBAAE,MAAM,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IACD,6FAA6F;IAC7F,uDAAuD;IACvD,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,KAAK;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAC9F,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,IAAI,MAAM,EAAE,CAAC;AAChD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,SAAiB,EAAE,KAAa;IAC9D,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IACjD,IAAI,CAAC;QACH,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC;YAAE,OAAO,KAAK,CAAC;QACtC,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC"}
@@ -75,6 +75,16 @@ export interface GigRunState {
75
75
  /** Why. Surfaced by gig_monitor so `aborted` reads as a decision, not a mystery. */
76
76
  abort_reason?: string;
77
77
  }
78
+ /**
79
+ * Is a gig's status TERMINAL — the run is over and holds the tree no longer?
80
+ *
81
+ * The single-flight per-repo lock (change c1d0c2e0) releases on exactly this set: complete, failed,
82
+ * and aborted. `awaiting_approval` is DELIBERATELY EXCLUDED — a parked gig is not terminal. It holds
83
+ * uncommitted work in the working tree (the chairs before the human gate already ran and left
84
+ * changes on disk) and will continue from that exact tree when approved, so it must RETAIN the lock
85
+ * while parked. Naming the terminal set here keeps the release site from re-deriving it and drifting.
86
+ */
87
+ export declare function isTerminalStatus(status: GigStatus | string): boolean;
78
88
  export declare function newGigRun(gig_id: string, standard_slug: string, phases_total: number, now: string): GigRunState;
79
89
  export declare function applyGigProgress(state: GigRunState, ev: GigProgressEvent): void;
80
90
  /**
@@ -4,6 +4,18 @@
4
4
  // runtime fires GigProgressEvents as it walks the phase graph; this module folds those into
5
5
  // a GigRunState that gig_monitor reads. State is in-memory (per server lifetime): a restart
6
6
  // drops in-flight tracking — acceptable for v0, and a restart mid-gig is its own problem.
7
+ /**
8
+ * Is a gig's status TERMINAL — the run is over and holds the tree no longer?
9
+ *
10
+ * The single-flight per-repo lock (change c1d0c2e0) releases on exactly this set: complete, failed,
11
+ * and aborted. `awaiting_approval` is DELIBERATELY EXCLUDED — a parked gig is not terminal. It holds
12
+ * uncommitted work in the working tree (the chairs before the human gate already ran and left
13
+ * changes on disk) and will continue from that exact tree when approved, so it must RETAIN the lock
14
+ * while parked. Naming the terminal set here keeps the release site from re-deriving it and drifting.
15
+ */
16
+ export function isTerminalStatus(status) {
17
+ return status === "complete" || status === "failed" || status === "aborted";
18
+ }
7
19
  export function newGigRun(gig_id, standard_slug, phases_total, now) {
8
20
  return {
9
21
  gig_id, standard_slug, status: "running", started_at: now,
@@ -1 +1 @@
1
- {"version":3,"file":"gig_tracker.js","sourceRoot":"","sources":["../../src/gig_tracker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gig_tracker.js","sourceRoot":"","sources":["../../src/gig_tracker.ts"],"names":[],"mappings":"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"}