@tokenfactory/acc-runner 0.42.0 → 0.43.0

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 (68) hide show
  1. package/dist/engines/account-probe.d.ts +24 -0
  2. package/dist/engines/account-probe.d.ts.map +1 -1
  3. package/dist/engines/account-probe.js +18 -1
  4. package/dist/engines/account-probe.js.map +1 -1
  5. package/dist/machine-capabilities/index.d.ts +21 -0
  6. package/dist/machine-capabilities/index.d.ts.map +1 -0
  7. package/dist/machine-capabilities/index.js +21 -0
  8. package/dist/machine-capabilities/index.js.map +1 -0
  9. package/dist/machine-capabilities/probe.d.ts +61 -0
  10. package/dist/machine-capabilities/probe.d.ts.map +1 -0
  11. package/dist/machine-capabilities/probe.js +243 -0
  12. package/dist/machine-capabilities/probe.js.map +1 -0
  13. package/dist/machine-capabilities/redact.d.ts +42 -0
  14. package/dist/machine-capabilities/redact.d.ts.map +1 -0
  15. package/dist/machine-capabilities/redact.js +160 -0
  16. package/dist/machine-capabilities/redact.js.map +1 -0
  17. package/dist/machine-capabilities/report.d.ts +107 -0
  18. package/dist/machine-capabilities/report.d.ts.map +1 -0
  19. package/dist/machine-capabilities/report.js +211 -0
  20. package/dist/machine-capabilities/report.js.map +1 -0
  21. package/dist/machine-capabilities/types.d.ts +115 -0
  22. package/dist/machine-capabilities/types.d.ts.map +1 -0
  23. package/dist/machine-capabilities/types.js +11 -0
  24. package/dist/machine-capabilities/types.js.map +1 -0
  25. package/dist/migration-seq-guard.d.ts +78 -0
  26. package/dist/migration-seq-guard.d.ts.map +1 -0
  27. package/dist/migration-seq-guard.js +304 -0
  28. package/dist/migration-seq-guard.js.map +1 -0
  29. package/dist/node-version.d.ts +132 -0
  30. package/dist/node-version.d.ts.map +1 -0
  31. package/dist/node-version.js +318 -0
  32. package/dist/node-version.js.map +1 -0
  33. package/dist/prepr-gate.d.ts +120 -0
  34. package/dist/prepr-gate.d.ts.map +1 -1
  35. package/dist/prepr-gate.js +202 -3
  36. package/dist/prepr-gate.js.map +1 -1
  37. package/dist/program.d.ts.map +1 -1
  38. package/dist/program.js +13 -0
  39. package/dist/program.js.map +1 -1
  40. package/dist/runtime/review-chunking.d.ts +101 -0
  41. package/dist/runtime/review-chunking.d.ts.map +1 -0
  42. package/dist/runtime/review-chunking.js +192 -0
  43. package/dist/runtime/review-chunking.js.map +1 -0
  44. package/dist/runtime/review-diff.d.ts +30 -0
  45. package/dist/runtime/review-diff.d.ts.map +1 -0
  46. package/dist/runtime/review-diff.js +59 -0
  47. package/dist/runtime/review-diff.js.map +1 -0
  48. package/dist/runtime/reviewer.d.ts +40 -19
  49. package/dist/runtime/reviewer.d.ts.map +1 -1
  50. package/dist/runtime/reviewer.js +252 -51
  51. package/dist/runtime/reviewer.js.map +1 -1
  52. package/dist/serve-scope/command.d.ts +12 -0
  53. package/dist/serve-scope/command.d.ts.map +1 -0
  54. package/dist/serve-scope/command.js +89 -0
  55. package/dist/serve-scope/command.js.map +1 -0
  56. package/dist/serve-scope/index.d.ts +130 -0
  57. package/dist/serve-scope/index.d.ts.map +1 -0
  58. package/dist/serve-scope/index.js +148 -0
  59. package/dist/serve-scope/index.js.map +1 -0
  60. package/dist/task-runner.d.ts +11 -0
  61. package/dist/task-runner.d.ts.map +1 -1
  62. package/dist/task-runner.js +69 -0
  63. package/dist/task-runner.js.map +1 -1
  64. package/dist/watch.d.ts +8 -0
  65. package/dist/watch.d.ts.map +1 -1
  66. package/dist/watch.js +28 -0
  67. package/dist/watch.js.map +1 -1
  68. package/package.json +1 -1
@@ -0,0 +1,130 @@
1
+ /**
2
+ * AX-H2 (SERVE-SCOPE-CONSENT): the machine's own half of the consent.
3
+ * AUTH_APPROVAL_BRIEF.md §7.2, Phase H, gap G-18.
4
+ *
5
+ * `acc-runner serve-scope` is where the person sitting at the machine decides
6
+ * whether it serves only their work or the whole org's. That placement is the
7
+ * point, not a convenience: the thing being consented to — this laptop's gh
8
+ * credential, git identity and Claude subscription — is in front of them, and
9
+ * migration 0314 §5 will only accept the answer from the machine's bound owner
10
+ * anyway. A web form an admin could fill in on their behalf would be a checkbox,
11
+ * not a consent.
12
+ *
13
+ * THREE RULES THIS MODULE ENFORCES ON ITS CALLERS
14
+ * ----------------------------------------------------------------------------
15
+ * 1. WIDENING IS NEVER SILENT. {@link planServeScopeChange} refuses to widen to
16
+ * `org` unless the caller passed an explicit confirmation. `--yes` is
17
+ * accepted for scripted enrolment, but the DEFAULT of a bare
18
+ * `acc-runner serve-scope org` is a refusal with the consequences printed,
19
+ * not a shrug-and-apply.
20
+ * 2. NARROWING IS ALWAYS ALLOWED. Revoking needs no confirmation and no flag.
21
+ * Withdrawal must never be harder than the grant — that asymmetry is
22
+ * deliberate and it matches 0314 §5's server-side rule.
23
+ * 3. THE SERVER IS THE GATE. Everything here is a convenience over
24
+ * `acc.set_runner_serve_scope`, which re-checks ownership in the database.
25
+ * A refusal printed by this file is courtesy; a refusal from the RPC is
26
+ * security.
27
+ *
28
+ * The command is fully injectable (transport / stdout / confirm) so the whole
29
+ * decision tree is asserted with no network, no keychain and no database.
30
+ */
31
+ /** The vocabulary, mirroring `acc.runner_serve_scopes()` (0314 §2). */
32
+ export declare const SERVE_SCOPES: readonly ["owner", "org"];
33
+ export type ServeScope = (typeof SERVE_SCOPES)[number];
34
+ /** What a machine is until somebody decides otherwise. */
35
+ export declare const DEFAULT_SERVE_SCOPE: ServeScope;
36
+ /** The RPC surface this module needs — a supabase-js client satisfies it. */
37
+ export interface ServeScopeTransport {
38
+ rpc(fn: string, args: Record<string, unknown>): PromiseLike<{
39
+ data?: unknown;
40
+ error?: {
41
+ message: string;
42
+ } | null;
43
+ }>;
44
+ }
45
+ /**
46
+ * True when a PostgREST error means "migration 0314 is not applied here yet"
47
+ * rather than a genuine fault. The HALT-before-apply rule guarantees this window
48
+ * exists on every environment between merge and promotion, and the two cases
49
+ * have different remedies — "a human runs psql" versus "something is broken".
50
+ * PostgREST reports an unknown column as 42703 and an unknown relation as 42P01;
51
+ * the message check is the belt for clients that do not surface the code.
52
+ */
53
+ export declare function isMigrationPending(error: unknown): boolean;
54
+ /** The row shape `acc.runners` hands back for this machine. */
55
+ export interface ServeScopeRunnerRow {
56
+ id: string;
57
+ machine?: string | null;
58
+ bound_user_id?: string | null;
59
+ serve_scope?: unknown;
60
+ serve_scope_source?: unknown;
61
+ serve_scope_consent_at?: string | null;
62
+ }
63
+ /** Narrow an unknown to a ServeScope, or null when it is not one. */
64
+ export declare function parseServeScope(value: unknown): ServeScope | null;
65
+ /**
66
+ * The scope to treat a row as having. Anything unreadable folds to `owner`, NOT
67
+ * to `org`: an unreadable consent is an ungiven consent. The fold direction is
68
+ * the safety property — a CLI talking to a server that predates migration 0314
69
+ * (no column, `undefined`) must report owner-only rather than invent agreement.
70
+ */
71
+ export declare function serveScopeOf(value: unknown): ServeScope;
72
+ /** What one `serve-scope` invocation should do, before anything is sent. */
73
+ export type ServeScopePlan =
74
+ /** Print the current posture; no write. */
75
+ {
76
+ action: "show";
77
+ }
78
+ /** Widening was asked for without confirmation — refuse and explain. */
79
+ | {
80
+ action: "refuse";
81
+ reason: string;
82
+ }
83
+ /** Already there. Still sent, so the re-affirmation is recorded (0314 §5). */
84
+ | {
85
+ action: "reaffirm";
86
+ scope: ServeScope;
87
+ } | {
88
+ action: "grant";
89
+ scope: "org";
90
+ } | {
91
+ action: "revoke";
92
+ scope: "owner";
93
+ };
94
+ export interface ServeScopeChangeInput {
95
+ /** The scope the operator asked for. Absent ⇒ show. */
96
+ requested?: string | null;
97
+ /** The machine's current scope, as the server reports it. */
98
+ current: ServeScope;
99
+ /** The operator passed --yes (or answered an interactive prompt). */
100
+ confirmed?: boolean;
101
+ /** True when the signed-in session owns this machine. */
102
+ viewerIsOwner: boolean;
103
+ }
104
+ /**
105
+ * The whole decision tree, as a pure function. Ordered most-refusing first, so a
106
+ * case that falls through has been considered rather than defaulted into.
107
+ */
108
+ export declare function planServeScopeChange(input: ServeScopeChangeInput): ServeScopePlan;
109
+ /** What the RPC hands back (0314 §5's RETURNS TABLE). */
110
+ export interface ServeScopeResult {
111
+ runner_id: string;
112
+ serve_scope: ServeScope;
113
+ previous_scope: ServeScope | null;
114
+ decision: string;
115
+ consent_at: string | null;
116
+ }
117
+ /**
118
+ * Send one decision. Thin by design: the argument names are the RPC's, so a
119
+ * signature change is a compile-time break here rather than a runtime error on
120
+ * somebody's laptop.
121
+ */
122
+ export declare function submitServeScope(transport: ServeScopeTransport, args: {
123
+ runnerId: string;
124
+ scope: ServeScope;
125
+ reason?: string | null;
126
+ source?: string;
127
+ }): Promise<ServeScopeResult>;
128
+ /** The one-line posture a person reads at the terminal. */
129
+ export declare function describeServeScope(row: ServeScopeRunnerRow): string;
130
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/serve-scope/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,148 @@
1
+ /**
2
+ * AX-H2 (SERVE-SCOPE-CONSENT): the machine's own half of the consent.
3
+ * AUTH_APPROVAL_BRIEF.md §7.2, Phase H, gap G-18.
4
+ *
5
+ * `acc-runner serve-scope` is where the person sitting at the machine decides
6
+ * whether it serves only their work or the whole org's. That placement is the
7
+ * point, not a convenience: the thing being consented to — this laptop's gh
8
+ * credential, git identity and Claude subscription — is in front of them, and
9
+ * migration 0314 §5 will only accept the answer from the machine's bound owner
10
+ * anyway. A web form an admin could fill in on their behalf would be a checkbox,
11
+ * not a consent.
12
+ *
13
+ * THREE RULES THIS MODULE ENFORCES ON ITS CALLERS
14
+ * ----------------------------------------------------------------------------
15
+ * 1. WIDENING IS NEVER SILENT. {@link planServeScopeChange} refuses to widen to
16
+ * `org` unless the caller passed an explicit confirmation. `--yes` is
17
+ * accepted for scripted enrolment, but the DEFAULT of a bare
18
+ * `acc-runner serve-scope org` is a refusal with the consequences printed,
19
+ * not a shrug-and-apply.
20
+ * 2. NARROWING IS ALWAYS ALLOWED. Revoking needs no confirmation and no flag.
21
+ * Withdrawal must never be harder than the grant — that asymmetry is
22
+ * deliberate and it matches 0314 §5's server-side rule.
23
+ * 3. THE SERVER IS THE GATE. Everything here is a convenience over
24
+ * `acc.set_runner_serve_scope`, which re-checks ownership in the database.
25
+ * A refusal printed by this file is courtesy; a refusal from the RPC is
26
+ * security.
27
+ *
28
+ * The command is fully injectable (transport / stdout / confirm) so the whole
29
+ * decision tree is asserted with no network, no keychain and no database.
30
+ */
31
+ /** The vocabulary, mirroring `acc.runner_serve_scopes()` (0314 §2). */
32
+ export const SERVE_SCOPES = ["owner", "org"];
33
+ /** What a machine is until somebody decides otherwise. */
34
+ export const DEFAULT_SERVE_SCOPE = "owner";
35
+ /**
36
+ * True when a PostgREST error means "migration 0314 is not applied here yet"
37
+ * rather than a genuine fault. The HALT-before-apply rule guarantees this window
38
+ * exists on every environment between merge and promotion, and the two cases
39
+ * have different remedies — "a human runs psql" versus "something is broken".
40
+ * PostgREST reports an unknown column as 42703 and an unknown relation as 42P01;
41
+ * the message check is the belt for clients that do not surface the code.
42
+ */
43
+ export function isMigrationPending(error) {
44
+ if (!error || typeof error !== "object")
45
+ return false;
46
+ const e = error;
47
+ if (e.code === "42703" || e.code === "42P01" || e.code === "PGRST204")
48
+ return true;
49
+ const msg = typeof e.message === "string" ? e.message.toLowerCase() : "";
50
+ return (msg.includes("serve_scope") &&
51
+ (msg.includes("does not exist") ||
52
+ msg.includes("could not find") ||
53
+ msg.includes("schema cache")));
54
+ }
55
+ /** Narrow an unknown to a ServeScope, or null when it is not one. */
56
+ export function parseServeScope(value) {
57
+ if (typeof value !== "string")
58
+ return null;
59
+ const v = value.trim().toLowerCase();
60
+ // The two spellings a person actually types at a terminal.
61
+ if (v === "owner-only" || v === "owner_only" || v === "me")
62
+ return "owner";
63
+ if (v === "org-wide" || v === "org_wide" || v === "team")
64
+ return "org";
65
+ return SERVE_SCOPES.includes(v) ? v : null;
66
+ }
67
+ /**
68
+ * The scope to treat a row as having. Anything unreadable folds to `owner`, NOT
69
+ * to `org`: an unreadable consent is an ungiven consent. The fold direction is
70
+ * the safety property — a CLI talking to a server that predates migration 0314
71
+ * (no column, `undefined`) must report owner-only rather than invent agreement.
72
+ */
73
+ export function serveScopeOf(value) {
74
+ return parseServeScope(value) ?? DEFAULT_SERVE_SCOPE;
75
+ }
76
+ /**
77
+ * The whole decision tree, as a pure function. Ordered most-refusing first, so a
78
+ * case that falls through has been considered rather than defaulted into.
79
+ */
80
+ export function planServeScopeChange(input) {
81
+ const requested = input.requested == null ? null : parseServeScope(input.requested);
82
+ if (input.requested != null && requested == null) {
83
+ return {
84
+ action: "refuse",
85
+ reason: `unknown serve scope "${input.requested}" — expected "owner" or "org"`,
86
+ };
87
+ }
88
+ if (requested == null)
89
+ return { action: "show" };
90
+ if (requested === "org") {
91
+ if (!input.viewerIsOwner) {
92
+ return {
93
+ action: "refuse",
94
+ reason: "only this machine's owner can consent to serving the whole org — sign in as the owner on this machine (`acc-runner login`)",
95
+ };
96
+ }
97
+ if (!input.confirmed) {
98
+ return {
99
+ action: "refuse",
100
+ reason: "org-wide serving lends this machine's gh credential, git identity and Claude subscription to everyone in the org. " +
101
+ "Re-run with --yes to consent, or leave it owner-only.",
102
+ };
103
+ }
104
+ return input.current === "org" ? { action: "reaffirm", scope: "org" } : { action: "grant", scope: "org" };
105
+ }
106
+ // Narrowing. No confirmation, no flag, no owner check beyond what the server
107
+ // does — withdrawal must never be harder than the grant.
108
+ return input.current === "owner"
109
+ ? { action: "reaffirm", scope: "owner" }
110
+ : { action: "revoke", scope: "owner" };
111
+ }
112
+ /**
113
+ * Send one decision. Thin by design: the argument names are the RPC's, so a
114
+ * signature change is a compile-time break here rather than a runtime error on
115
+ * somebody's laptop.
116
+ */
117
+ export async function submitServeScope(transport, args) {
118
+ const { data, error } = await transport.rpc("set_runner_serve_scope", {
119
+ p_runner_id: args.runnerId,
120
+ p_scope: args.scope,
121
+ p_reason: args.reason ?? null,
122
+ p_source: args.source ?? "cli",
123
+ });
124
+ if (error) {
125
+ throw new Error(`serve-scope update refused: ${error.message}`);
126
+ }
127
+ const row = Array.isArray(data) ? data[0] : undefined;
128
+ return {
129
+ runner_id: typeof row?.runner_id === "string" ? row.runner_id : args.runnerId,
130
+ serve_scope: serveScopeOf(row?.serve_scope),
131
+ previous_scope: parseServeScope(row?.previous_scope),
132
+ decision: typeof row?.decision === "string" ? row.decision : "unknown",
133
+ consent_at: typeof row?.consent_at === "string" ? row.consent_at : null,
134
+ };
135
+ }
136
+ /** The one-line posture a person reads at the terminal. */
137
+ export function describeServeScope(row) {
138
+ const scope = serveScopeOf(row.serve_scope);
139
+ const machine = row.machine ?? row.id;
140
+ if (scope === "org") {
141
+ const consented = row.serve_scope_source === "owner_consent";
142
+ return consented
143
+ ? `${machine}: serving the WHOLE ORG — consented${row.serve_scope_consent_at ? ` ${row.serve_scope_consent_at.slice(0, 10)}` : ""}.`
144
+ : `${machine}: serving the WHOLE ORG — carried over from before consent was recorded, never explicitly agreed.`;
145
+ }
146
+ return `${machine}: serving its OWNER ONLY. Other people's tasks are not dispatched here.`;
147
+ }
148
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/serve-scope/index.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,7 @@ import { type ConflictResolutionDeps } from "./runtime/conflict-resolver.js";
13
13
  import { type ReconcileResult, type ReconcileReworkOptions } from "./runtime/rework.js";
14
14
  import { type AssertResolutionOptions, type ResolutionIntegrityDeps, type ResolutionIntegrityResult } from "./runtime/resolution-integrity.js";
15
15
  import { type PreprGateResult } from "./prepr-gate.js";
16
+ import { type SeqGuardOptions, type SeqGuardResult } from "./migration-seq-guard.js";
16
17
  import type { RunnerSupabaseClient } from "./supabase.js";
17
18
  export interface CostEventPayload extends NormalizedUsage {
18
19
  task_id: string;
@@ -191,6 +192,16 @@ export interface RunTaskDeps {
191
192
  * tests inject a stub so the rework path doesn't shell out to a real merge.
192
193
  */
193
194
  reconcileReworkBranch?: (opts: ReconcileReworkOptions) => Promise<ReconcileResult>;
195
+ /**
196
+ * MIG-SEQ-GUARD: re-validate this branch's NEW migration sequence against a
197
+ * FRESHLY-FETCHED integration head immediately before push, and auto-renumber
198
+ * it when a sibling migration merged and took the number since this worktree
199
+ * forked. Runs on BOTH push paths (fresh + rework). Defaults to
200
+ * `revalidateMigrationSeq`; tests inject a stub so the unit suite never
201
+ * fetches. Fail-open — it can only ever turn a PR CI would reject into one it
202
+ * accepts, never block a push.
203
+ */
204
+ revalidateMigrationSeq?: (workdir: string, opts: SeqGuardOptions) => Promise<SeqGuardResult>;
194
205
  }
195
206
  export interface RunTaskController {
196
207
  taskId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"task-runner.d.ts","sourceRoot":"","sources":["../src/task-runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"task-runner.d.ts","sourceRoot":"","sources":["../src/task-runner.ts"],"names":[],"mappings":"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"}
@@ -46,6 +46,7 @@ import { parseConflictMeta, resolveConflict, MAX_CONFLICT_ATTEMPTS, } from "./ru
46
46
  import { parseReworkMeta, renderReworkPrompt, reconcileReworkBranch as defaultReconcileReworkBranch, fetchPrHeadRef as defaultFetchPrHeadRef, } from "./runtime/rework.js";
47
47
  import { assertResolutionIntegrity, isConflictResolutionTask, summariseFailures, } from "./runtime/resolution-integrity.js";
48
48
  import { runPreprGate as defaultRunPreprGate, } from "./prepr-gate.js";
49
+ import { revalidateMigrationSeq as defaultRevalidateMigrationSeq, } from "./migration-seq-guard.js";
49
50
  import { commitGuardSkipRequested, gitConfigHooksEnv, installCommitGuardSync, } from "./commit-guard.js";
50
51
  import { readLiveAllowedGlobs } from "./locks/index.js";
51
52
  const LOG_BATCH_BYTES = 4 * 1024;
@@ -727,6 +728,8 @@ export function runTask(taskId, deps) {
727
728
  const runPreprGate = deps.runPreprGate ??
728
729
  ((workdir, baseRef) => defaultRunPreprGate(workdir, { baseRef }));
729
730
  const reconcileRework = deps.reconcileReworkBranch ?? defaultReconcileReworkBranch;
731
+ const revalidateSeq = deps.revalidateMigrationSeq ??
732
+ ((workdir, opts) => defaultRevalidateMigrationSeq(workdir, opts));
730
733
  // FU-9: default seeds the worktree from the warm parent clone (see
731
734
  // ensureWorktreeNodeModules); logs via the runner's stderr so a doctor can see it.
732
735
  const ensureWorktreeDeps = deps.ensureWorktreeDeps ??
@@ -1318,6 +1321,62 @@ export function runTask(taskId, deps) {
1318
1321
  error: `conflict-resolution integrity guardrail rejected resolution (${summary})`,
1319
1322
  };
1320
1323
  };
1324
+ /**
1325
+ * MIG-SEQ-GUARD: last thing before `git push`, re-validate this branch's
1326
+ * NEW migration seq against a FRESHLY-FETCHED integration head. The seq was
1327
+ * chosen at worktree-fork time; by push time a sibling migration may have
1328
+ * merged and taken it, and until now that only surfaced as a migration-lint
1329
+ * failure on the PR — a whole run spent on a rename the runner can do
1330
+ * itself. When the number is gone the migration is renumbered to the next
1331
+ * free contiguous seq (filename + self-record + verify messages + every
1332
+ * test that reads it by path) and committed, so the push carries the fix.
1333
+ *
1334
+ * Never blocks: the guard is fail-open by construction and this returns
1335
+ * void. A renumber emits `migration.seq_renumbered` so the move is visible
1336
+ * on the History tab rather than being a silent rewrite.
1337
+ */
1338
+ const runMigrationSeqGuard = async (rework) => {
1339
+ let result;
1340
+ try {
1341
+ result = await revalidateSeq(workdir, {
1342
+ integrationBranch,
1343
+ baseRef: resolvedBaseRef,
1344
+ remote: "origin",
1345
+ });
1346
+ }
1347
+ catch (err) {
1348
+ // The guard already fails open internally; this catches a stub/dep that
1349
+ // throws so a seq check can never be the reason a push does not happen.
1350
+ process.stderr.write(`[acc-runner] migration seq guard crashed (push proceeds): ` +
1351
+ `${err.message?.slice(0, 200)}\n`);
1352
+ return;
1353
+ }
1354
+ if (!result.renumbered || !result.move) {
1355
+ // Quiet on the no-op path — the overwhelming majority of pushes touch
1356
+ // no migration at all, and an event per push would be pure noise.
1357
+ if (result.skipped && result.skipped !== "no-new-migrations") {
1358
+ process.stderr.write(`[acc-runner] migration seq guard: ${result.detail}\n`);
1359
+ }
1360
+ return;
1361
+ }
1362
+ await appendEvent(deps.supabase, taskId, "log", {
1363
+ phase: "push",
1364
+ stream: "stdout",
1365
+ event: "migration.seq_renumbered",
1366
+ branch,
1367
+ rework,
1368
+ integration_branch: integrationBranch,
1369
+ from_seq: result.move.fromSeq,
1370
+ to_seq: result.move.toSeq,
1371
+ file: result.move.file,
1372
+ new_file: result.move.newFile,
1373
+ remote_max_seq: result.remoteMaxSeq ?? null,
1374
+ message: result.detail,
1375
+ renumber_output: result.move.output,
1376
+ runner_id: deps.session.runnerId,
1377
+ });
1378
+ process.stderr.write(`[acc-runner] migration seq guard: ${result.detail}\n`);
1379
+ };
1321
1380
  try {
1322
1381
  // POOL-P1b: clone-on-demand source provisioning. When the flag is on and
1323
1382
  // repoPath resolved to the per-repo cache path above, clone the task's
@@ -2166,6 +2225,11 @@ export function runTask(taskId, deps) {
2166
2225
  return { taskId, status: "failed", phase: "push", error: msg };
2167
2226
  }
2168
2227
  }
2228
+ // MIG-SEQ-GUARD: after the no-advance check (which compares heads) and
2229
+ // immediately before the push, so the freshest possible integration head
2230
+ // decides the seq. A renumber adds a commit, which is also what makes the
2231
+ // advance check above meaningful on a rework that only moved a number.
2232
+ await runMigrationSeqGuard(true);
2169
2233
  try {
2170
2234
  await git.push(workdir, branch);
2171
2235
  }
@@ -2325,6 +2389,11 @@ export function runTask(taskId, deps) {
2325
2389
  runner_id: deps.session.runnerId,
2326
2390
  });
2327
2391
  }
2392
+ // MIG-SEQ-GUARD: the LAST thing before the push. It deliberately runs
2393
+ // after the pre-PR gate rather than inside it — the gate's own MIGFIX-01
2394
+ // renumber reads the fork-time worktree snapshot, and only a fresh fetch
2395
+ // here can see a sibling that merged while the gate was running.
2396
+ await runMigrationSeqGuard(false);
2328
2397
  // 5. Push + open PR. Both run from the worktree so the operator's
2329
2398
  // shared clone never has the task branch checked out.
2330
2399
  let prUrl = "";