@dsh-enhanced/plugin-control-plane 0.1.64 → 0.1.66

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 (121) hide show
  1. package/README.md +81 -5
  2. package/lib/attestation.d.ts.map +1 -1
  3. package/lib/attestation.js +33 -1
  4. package/lib/attestation.js.map +1 -1
  5. package/lib/creation-capability-empty-handoff.d.ts +57 -0
  6. package/lib/creation-capability-empty-handoff.d.ts.map +1 -0
  7. package/lib/creation-capability-empty-handoff.js +147 -0
  8. package/lib/creation-capability-empty-handoff.js.map +1 -0
  9. package/lib/creation-capability-execution.d.ts +9 -0
  10. package/lib/creation-capability-execution.d.ts.map +1 -0
  11. package/lib/creation-capability-execution.js +70 -0
  12. package/lib/creation-capability-execution.js.map +1 -0
  13. package/lib/creation-capability-feedback.d.ts +58 -1
  14. package/lib/creation-capability-feedback.d.ts.map +1 -1
  15. package/lib/creation-capability-feedback.js +532 -50
  16. package/lib/creation-capability-feedback.js.map +1 -1
  17. package/lib/creation-capability-handoff-common.d.ts +60 -0
  18. package/lib/creation-capability-handoff-common.d.ts.map +1 -0
  19. package/lib/creation-capability-handoff-common.js +195 -0
  20. package/lib/creation-capability-handoff-common.js.map +1 -0
  21. package/lib/creation-capability-journal.d.ts +19 -0
  22. package/lib/creation-capability-journal.d.ts.map +1 -1
  23. package/lib/creation-capability-journal.js +62 -21
  24. package/lib/creation-capability-journal.js.map +1 -1
  25. package/lib/creation-capability-runtime.d.ts +18 -0
  26. package/lib/creation-capability-runtime.d.ts.map +1 -1
  27. package/lib/creation-capability-runtime.js +76 -18
  28. package/lib/creation-capability-runtime.js.map +1 -1
  29. package/lib/creation-capability-sealed-audit.d.ts +19 -0
  30. package/lib/creation-capability-sealed-audit.d.ts.map +1 -0
  31. package/lib/creation-capability-sealed-audit.js +114 -0
  32. package/lib/creation-capability-sealed-audit.js.map +1 -0
  33. package/lib/creation-capability-sealed-handoff.d.ts +160 -0
  34. package/lib/creation-capability-sealed-handoff.d.ts.map +1 -0
  35. package/lib/creation-capability-sealed-handoff.js +695 -0
  36. package/lib/creation-capability-sealed-handoff.js.map +1 -0
  37. package/lib/creation-capability-trend-snapshot.d.ts +70 -0
  38. package/lib/creation-capability-trend-snapshot.d.ts.map +1 -0
  39. package/lib/creation-capability-trend-snapshot.js +117 -0
  40. package/lib/creation-capability-trend-snapshot.js.map +1 -0
  41. package/lib/creation-capability-types.d.ts +254 -4
  42. package/lib/creation-capability-types.d.ts.map +1 -1
  43. package/lib/in-process-reload.d.ts +191 -0
  44. package/lib/in-process-reload.d.ts.map +1 -0
  45. package/lib/in-process-reload.js +284 -0
  46. package/lib/in-process-reload.js.map +1 -0
  47. package/lib/index.d.ts +12 -4
  48. package/lib/index.d.ts.map +1 -1
  49. package/lib/index.js +8 -2
  50. package/lib/index.js.map +1 -1
  51. package/lib/linux-source-build.d.ts +16 -0
  52. package/lib/linux-source-build.d.ts.map +1 -0
  53. package/lib/linux-source-build.js +268 -0
  54. package/lib/linux-source-build.js.map +1 -0
  55. package/lib/linux-source-preflight.d.ts +31 -0
  56. package/lib/linux-source-preflight.d.ts.map +1 -0
  57. package/lib/linux-source-preflight.js +101 -0
  58. package/lib/linux-source-preflight.js.map +1 -0
  59. package/lib/live-qualification-runtime.d.ts +6 -2
  60. package/lib/live-qualification-runtime.d.ts.map +1 -1
  61. package/lib/live-qualification-runtime.js +65 -11
  62. package/lib/live-qualification-runtime.js.map +1 -1
  63. package/lib/owner-task-gap-types.d.ts +23 -0
  64. package/lib/owner-task-gap-types.d.ts.map +1 -1
  65. package/lib/owner-task-gaps.d.ts +4 -0
  66. package/lib/owner-task-gaps.d.ts.map +1 -1
  67. package/lib/owner-task-gaps.js +35 -1
  68. package/lib/owner-task-gaps.js.map +1 -1
  69. package/lib/scanner-owner-runtime.d.ts +34 -0
  70. package/lib/scanner-owner-runtime.d.ts.map +1 -0
  71. package/lib/scanner-owner-runtime.js +99 -0
  72. package/lib/scanner-owner-runtime.js.map +1 -0
  73. package/lib/service.d.ts +82 -5
  74. package/lib/service.d.ts.map +1 -1
  75. package/lib/service.js +450 -45
  76. package/lib/service.js.map +1 -1
  77. package/lib/source-approval-authority.d.ts.map +1 -1
  78. package/lib/source-approval-authority.js +25 -7
  79. package/lib/source-approval-authority.js.map +1 -1
  80. package/lib/source-build-diagnostics.d.ts +31 -0
  81. package/lib/source-build-diagnostics.d.ts.map +1 -0
  82. package/lib/source-build-diagnostics.js +110 -0
  83. package/lib/source-build-diagnostics.js.map +1 -0
  84. package/lib/source-build.d.ts +25 -2
  85. package/lib/source-build.d.ts.map +1 -1
  86. package/lib/source-build.js +145 -26
  87. package/lib/source-build.js.map +1 -1
  88. package/lib/source-creation.d.ts +6 -2
  89. package/lib/source-creation.d.ts.map +1 -1
  90. package/lib/source-creation.js +11 -2
  91. package/lib/source-creation.js.map +1 -1
  92. package/lib/source-job-types.d.ts +3 -1
  93. package/lib/source-job-types.d.ts.map +1 -1
  94. package/lib/source-jobs.d.ts +28 -1
  95. package/lib/source-jobs.d.ts.map +1 -1
  96. package/lib/source-jobs.js +117 -26
  97. package/lib/source-jobs.js.map +1 -1
  98. package/lib/sqlite.d.ts +1 -1
  99. package/lib/sqlite.d.ts.map +1 -1
  100. package/lib/sqlite.js +36 -1
  101. package/lib/sqlite.js.map +1 -1
  102. package/lib/store.d.ts +21 -1
  103. package/lib/store.d.ts.map +1 -1
  104. package/lib/store.js +470 -174
  105. package/lib/store.js.map +1 -1
  106. package/lib/systemd-host-authority.d.ts.map +1 -1
  107. package/lib/systemd-host-authority.js +4 -0
  108. package/lib/systemd-host-authority.js.map +1 -1
  109. package/lib/task-observation-runtime.d.ts +6 -2
  110. package/lib/task-observation-runtime.d.ts.map +1 -1
  111. package/lib/task-observation-runtime.js +69 -11
  112. package/lib/task-observation-runtime.js.map +1 -1
  113. package/lib/types.d.ts +47 -1
  114. package/lib/types.d.ts.map +1 -1
  115. package/lib/version.d.ts +1 -1
  116. package/lib/version.js +1 -1
  117. package/lib/work-item-creation-contract.d.ts +17 -0
  118. package/lib/work-item-creation-contract.d.ts.map +1 -0
  119. package/lib/work-item-creation-contract.js +61 -0
  120. package/lib/work-item-creation-contract.js.map +1 -0
  121. package/package.json +10 -10
@@ -1 +1 @@
1
- {"version":3,"file":"source-jobs.d.ts","sourceRoot":"","sources":["../src/source-jobs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"source-jobs.d.ts","sourceRoot":"","sources":["../src/source-jobs.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,19 @@
1
+ import { normalizeSourceCreationGrant } from './source-creation.js';
1
2
  import { createHash, randomUUID } from 'node:crypto';
2
3
  import { isAbsolute, join, resolve } from 'node:path';
3
4
  import { realpath } from 'node:fs/promises';
4
- import { SourceGrowthRunUnavailableError, isSourceOwnerContinuation, validateSourceGrowthRunBinding } from '@dsh-enhanced/assistant-growth-contract';
5
+ import { SourceGrowthRunUnavailableError, isSourceOwnerContinuation, validateAnySourceGrowthRunBinding as validateSourceGrowthRunBinding } from '@dsh-enhanced/assistant-growth-contract';
5
6
  import { automationDefinitionDigest } from '@dsh-enhanced/assistant-automations';
6
7
  import { controlPlaneDigest, expectedSourceRelease } from './store.js';
7
8
  import { awaitSourceSignal, inspectSourceContext } from './source-context.js';
8
9
  import { assertPluginModificationAllowed, removeSourceJobWorktree, validateScopedPluginFiles } from './source-workspace.js';
9
10
  import { assertManagedVersionPaths } from './source-versioning.js';
10
11
  import { resolveSourceBaseline, validateSourceBaselineConfig } from './source-baseline.js';
11
- import { removeSourceJobContainer } from './source-build.js';
12
+ import { removeSourceJobContainer, validateSourceBuildConfig } from './source-build.js';
12
13
  import { inspectSourceRevisionContext, validateSourceRevisionGrant } from './source-revision.js';
13
14
  import { inspectSourceCreationContext, validateSourceCreationFiles, validateSourceCreationGrant } from './source-creation.js';
14
15
  import { inheritedEnvironment } from './trust.js';
16
+ import { SOURCE_BUILD_CHECK_FAILED } from './source-build-diagnostics.js';
15
17
  export const SOURCE_JOB_OWNER = 'plugin-control-plane-source';
16
18
  const EXECUTOR = 'plugin-control-plane-source-check';
17
19
  const CATALOG = controlPlaneDigest({ executor: EXECUTOR, version: 1, operation: 'isolated-check-pending-plan' });
@@ -34,6 +36,7 @@ export function validateSourceJobsConfig(value, build) {
34
36
  || !Number.isSafeInteger(value.budgetAmount) || value.budgetAmount < 1) {
35
37
  throw new Error('plugin-control-plane: invalid sourceJobs authority configuration');
36
38
  }
39
+ validateSourceBuildConfig(build);
37
40
  if (value.baseline !== undefined)
38
41
  validateSourceBaselineConfig(value.baseline);
39
42
  if (value.allowedModes !== undefined && (!Array.isArray(value.allowedModes) || value.allowedModes.length < 1
@@ -45,18 +48,24 @@ export function validateSourceJobsConfig(value, build) {
45
48
  validateSourceCreationGrant(value.creation);
46
49
  if (value.revision !== undefined)
47
50
  validateSourceRevisionGrant(value.revision);
48
- if (build !== undefined && 'backend' in build
51
+ if ('backend' in build && build.backend === 'macos-seatbelt'
49
52
  && (!value.allowedModes || value.allowedModes.some(mode => mode === 'modify')
50
53
  || value.creation === undefined && value.revision === undefined)) {
51
54
  throw new Error('plugin-control-plane: native source jobs require finite create/revise-created grants');
52
55
  }
53
56
  }
54
- function projection(job) {
57
+ export function normalizeSourceJobsConfig(value, build) {
58
+ validateSourceJobsConfig(value, build);
59
+ return { ...structuredClone(value), ...(value.creation ? { creation: normalizeSourceCreationGrant(value.creation) } : {}) };
60
+ }
61
+ function projection(job, diagnostics) {
55
62
  return { id: job.id, name: job.intent.name, gapId: job.intent.gapId, baseCommit: job.intent.baseCommit,
56
63
  ...(job.intent.mode === undefined ? {} : { mode: job.intent.mode }),
57
64
  status: job.status, createdAt: job.createdAt, expiresAt: job.expiresAt,
58
- ...(job.planId === undefined ? {} : { planId: job.planId }), ...(job.failureCode === undefined ? {} : { failureCode: job.failureCode }) };
65
+ ...(job.planId === undefined ? {} : { planId: job.planId }), ...(job.failureCode === undefined ? {} : { failureCode: job.failureCode }),
66
+ ...(diagnostics !== undefined && job.status === 'failed' && job.failureCode === SOURCE_BUILD_CHECK_FAILED ? { diagnostics } : {}) };
59
67
  }
68
+ const MAX_RETAINED_DIAGNOSTICS = 64;
60
69
  /** Persisted intent + native Automations execution. This class owns no scheduler. */
61
70
  export class SourceJobRuntime {
62
71
  options;
@@ -75,9 +84,15 @@ export class SourceJobRuntime {
75
84
  continuationCursor = 0;
76
85
  continuationStatus;
77
86
  continuationTransition = 0;
87
+ /** Process-local, bounded build diagnostics; the failure code itself is durable. */
88
+ diagnostics = new Map();
78
89
  constructor(options) {
79
90
  this.options = options;
80
91
  validateSourceJobsConfig(options.config, options.build);
92
+ // Preserve the live object identity used by effect-boundary drift checks.
93
+ // False has no authority and is canonically absent, just like the default.
94
+ if (options.config.creation?.workItemFailures === false)
95
+ delete options.config.creation.workItemFailures;
81
96
  this.authorityDigest = controlPlaneDigest({ config: options.config, build: options.build });
82
97
  this.continuationNonce = controlPlaneDigest({ authority: this.authorityDigest, generation: this.generation });
83
98
  }
@@ -265,6 +280,16 @@ export class SourceJobRuntime {
265
280
  await this.options.adoptReleased(job, signal, assertCurrent);
266
281
  }
267
282
  }
283
+ inspectWorkItemReadiness(owner) {
284
+ if (!this.available() || !this.modeAllowed('create') || ('expiresAt' in this.options.build && Date.now() >= this.options.build.expiresAt) || this.options.config.creation?.workItemFailures !== true || Date.now() >= this.options.config.creation.expiresAt)
285
+ return undefined;
286
+ const current = this.receipt();
287
+ if (!isSourceOwnerContinuation(current, owner))
288
+ return undefined;
289
+ const config = this.options.config;
290
+ const authority = { id: config.authorityId, digest: this.authorityDigest, expiresAt: config.expiresAt };
291
+ return { authority, creation: structuredClone(config.creation), remaining: this.options.store.inspectSourceJobQuota({ authority: { ...authority, maxSubmissions: config.maxSubmissions }, creation: config.creation }) };
292
+ }
268
293
  available() { return this.active && !this.abort.signal.aborted && Date.now() < this.options.config.expiresAt; }
269
294
  close() {
270
295
  return this.closing ??= (async () => {
@@ -313,8 +338,15 @@ export class SourceJobRuntime {
313
338
  throw new Error('source job caller scope mismatch');
314
339
  return owner;
315
340
  }
316
- withGapSource(gapId, owner, callback) {
317
- if (this.options.store.getOwnerTaskFailureReference(gapId) === undefined)
341
+ withJobSource(job, callback) { return this.withGapSource(job.intent.gapId, job.intent.owner, callback, job.intent.creation?.growthRun ?? job.intent.revision?.growthRun); }
342
+ withGapSource(gapId, owner, callback, growthRun) {
343
+ const reference = this.options.store.getOwnerTaskFailureReference(gapId);
344
+ if (reference?.schemaVersion === 2) {
345
+ if (growthRun?.protocol !== 'assistant-growth/source-run/v2' || !this.options.withWorkItemGrowthRunFence)
346
+ throw new SourceGrowthRunUnavailableError('work item growth source fence unavailable');
347
+ return this.options.withWorkItemGrowthRunFence(growthRun, gapId, owner, false, callback);
348
+ }
349
+ if (reference === undefined)
318
350
  return callback();
319
351
  if (!this.options.withGapSourceFence)
320
352
  throw new Error('source job task provenance service unavailable');
@@ -346,7 +378,7 @@ export class SourceJobRuntime {
346
378
  if (!parent || parent.name !== job.intent.name || controlPlaneDigest(parent.parent) !== controlPlaneDigest(job.intent.revision.parent))
347
379
  throw new Error('source revision parent changed');
348
380
  }
349
- this.withGapSource(job.intent.gapId, job.intent.owner, () => this.assertGrowthRun((job.intent.creation?.growthRun ?? job.intent.revision?.growthRun), job.intent.mode, job.intent.gapId, job.intent.owner, false));
381
+ this.withJobSource(job, () => this.assertGrowthRun((job.intent.creation?.growthRun ?? job.intent.revision?.growthRun), job.intent.mode, job.intent.gapId, job.intent.owner, false));
350
382
  }
351
383
  assertGrowthRun(growthRun, mode, gapId, owner, generation) {
352
384
  const taskBacked = this.options.store.getOwnerTaskFailureReference(gapId) !== undefined;
@@ -358,12 +390,16 @@ export class SourceJobRuntime {
358
390
  if (growthRun === undefined)
359
391
  throw new Error('task-backed creation requires a frozen source growth run');
360
392
  validateSourceGrowthRunBinding(growthRun);
393
+ if (growthRun.protocol === 'assistant-growth/source-run/v2' && (mode !== 'create' || this.options.config.creation?.workItemFailures !== true || this.options.store.getOwnerTaskFailureReference(gapId)?.schemaVersion !== 2))
394
+ throw new Error('work item growth requires explicit create authority');
361
395
  if (!this.options.assertGrowthRun)
362
396
  throw new SourceGrowthRunUnavailableError('source growth run producer unavailable');
363
397
  this.options.assertGrowthRun(growthRun, gapId, owner, generation);
364
398
  }
365
399
  enqueue(input) {
366
400
  this.assertMode(input.mode);
401
+ if (input.growthRun?.protocol === 'assistant-growth/source-run/v2' && input.mode !== 'create')
402
+ throw new Error('work item growth only permits create');
367
403
  if (input.mode !== 'create' && input.mode !== 'revise-created' && input.growthRun !== undefined)
368
404
  throw new Error('modify source job cannot carry a growth run');
369
405
  if (input.mode === 'create' || input.mode === 'revise-created')
@@ -382,7 +418,7 @@ export class SourceJobRuntime {
382
418
  async enqueueOwned(input) {
383
419
  this.assertMode(input.mode);
384
420
  const signal = AbortSignal.any([input.signal, this.abort.signal, AbortSignal.timeout(15_000)]);
385
- const assertCurrent = async () => { signal.throwIfAborted(); await awaitSourceSignal(signal, input.assertCurrent); this.withGapSource(input.gapId, this.assertCaller(input.owner), () => { }); if (!this.available())
421
+ const assertCurrent = async () => { signal.throwIfAborted(); await awaitSourceSignal(signal, input.assertCurrent); this.withGapSource(input.gapId, this.assertCaller(input.owner), () => { }, input.growthRun); if (!this.available())
386
422
  throw new Error('source job authority unavailable'); signal.throwIfAborted(); };
387
423
  await assertCurrent();
388
424
  if (input.mode === 'create' || input.mode === 'revise-created')
@@ -410,7 +446,7 @@ export class SourceJobRuntime {
410
446
  const owner = reference?.owner ?? currentOwner;
411
447
  if (reference && !isSourceOwnerContinuation(currentOwner, owner))
412
448
  throw new Error('source job task owner changed');
413
- this.withGapSource(input.gapId, currentOwner, () => this.assertGrowthRun(input.growthRun, input.mode, input.gapId, owner, true));
449
+ this.withGapSource(input.gapId, currentOwner, () => this.assertGrowthRun(input.growthRun, input.mode, input.gapId, owner, true), input.growthRun);
414
450
  const parent = input.mode === 'revise-created' ? this.options.inspectRevisionParent?.(input.parentPlanId) : undefined;
415
451
  if (input.mode === 'revise-created' && (!parent || parent.name !== input.name))
416
452
  throw new Error('adopted revision parent unavailable or mismatched');
@@ -464,7 +500,7 @@ export class SourceJobRuntime {
464
500
  files: structuredClone(input.files), ttlMs: input.ttlMs, build: structuredClone(this.options.build),
465
501
  worktree: join(this.options.statePath, 'source-worktrees', `worktree-job-${token}`),
466
502
  ...('backend' in this.options.build
467
- ? { nativeResource: { backend: 'macos-seatbelt', key: id } }
503
+ ? { nativeResource: { backend: this.options.build.backend, key: id } }
468
504
  : { containerName: `dsh-source-job-${token}` }),
469
505
  };
470
506
  await assertCurrent();
@@ -472,7 +508,7 @@ export class SourceJobRuntime {
472
508
  const job = this.withGapSource(gap.id, owner, () => {
473
509
  this.assertGrowthRun(input.growthRun, input.mode, gap.id, owner, true);
474
510
  return this.options.store.enqueueSourceJob({ id, automationId: id, idempotencyKey: input.idempotencyKey, intent });
475
- });
511
+ }, input.growthRun);
476
512
  if (job.status === 'queued')
477
513
  this.scheduleOrFail(job);
478
514
  return projection(this.options.store.getSourceJob(id));
@@ -487,7 +523,7 @@ export class SourceJobRuntime {
487
523
  || job.intent.owner.principalVersion !== owner.principalVersion || job.intent.owner.workspace !== owner.workspace
488
524
  || job.intent.owner.agentPreset !== owner.agentPreset)
489
525
  throw new Error('source job not found for current owner');
490
- return projection(this.refreshQueued(job));
526
+ return projection(this.refreshQueued(job), this.diagnostics.get(job.id));
491
527
  }
492
528
  /** Native runner admission can fail before our executor is invoked. */
493
529
  refreshQueued(job) {
@@ -503,10 +539,13 @@ export class SourceJobRuntime {
503
539
  code = 'source-job-growth-run-missing';
504
540
  else {
505
541
  try {
506
- this.withGapSource(job.intent.gapId, job.intent.owner, () => { providerUnavailable = this.growthProducerUnavailable(job); });
542
+ this.withJobSource(job, () => { providerUnavailable = this.growthProducerUnavailable(job); });
507
543
  }
508
- catch {
509
- code = 'source-job-task-source-changed';
544
+ catch (error) {
545
+ if (error instanceof SourceGrowthRunUnavailableError)
546
+ providerUnavailable = true;
547
+ else
548
+ code = 'source-job-task-source-changed';
510
549
  }
511
550
  }
512
551
  if (job.expiresAt <= Date.now())
@@ -534,10 +573,24 @@ export class SourceJobRuntime {
534
573
  throw error;
535
574
  }
536
575
  }
576
+ linuxRevisionReviewTimeoutMs() {
577
+ // A Linux revision can run two independently bounded reviews after its
578
+ // repository build. This outer window never changes their own budgets or
579
+ // the frozen source expiry; legacy backend definitions retain their identity.
580
+ if (!('backend' in this.options.build) || this.options.build.backend !== 'linux-native')
581
+ return 0;
582
+ return (this.options.verifyPreparedRevision ? 1_800_000 : 0)
583
+ + (this.options.verifyPreparedRevisionRegression ? 1_800_000 : 0);
584
+ }
537
585
  definition(job) {
538
586
  const config = this.options.config;
539
587
  return { name: `Source check: ${job.intent.name}`, schedule: { kind: 'at', at: new Date(job.dispatchAt ?? job.createdAt + 1000).toISOString() },
540
- workspace: config.workspace, agentPreset: config.preset, timeoutMs: job.intent.build.timeoutMs + 120_000 + (this.options.advanceReleased ? this.options.releaseTimeoutMs ?? 40_000 : 0) + (this.options.adoptReleased ? this.options.adoptionTimeoutMs ?? 60_000 : 0),
588
+ workspace: config.workspace, agentPreset: config.preset, timeoutMs: job.intent.build.timeoutMs + 120_000
589
+ + (job.intent.mode === 'revise-created' ? this.linuxRevisionReviewTimeoutMs() : 0)
590
+ + (job.intent.mode === 'create' && job.intent.creation?.growthRun?.protocol === 'assistant-growth/source-run/v2'
591
+ && 'backend' in this.options.build
592
+ && this.options.build.backend === 'linux-native' && this.options.verifyPreparedCreation ? 1_800_000 : 0)
593
+ + (this.options.advanceReleased ? this.options.releaseTimeoutMs ?? 40_000 : 0) + (this.options.adoptReleased ? this.options.adoptionTimeoutMs ?? 60_000 : 0),
541
594
  misfire: { kind: 'latest' }, overlap: 'skip', retrySafety: 'never', maxRetries: 0, principal: config.principalId,
542
595
  ...(config.budgetId === undefined ? {} : { budgetId: config.budgetId, budgetAmount: config.budgetAmount }),
543
596
  execution: { kind: 'host', executorId: EXECUTOR, executorContractVersion: 1, runbookId: EXECUTOR, runbookVersion: 1, catalogDigest: CATALOG,
@@ -556,7 +609,7 @@ export class SourceJobRuntime {
556
609
  if ((health.automationStatus === 'paused' && dueAt <= Date.now())
557
610
  || (terminal !== undefined && terminal.immutableContext.state === 'verified'
558
611
  && terminal.immutableContext.definitionHash === job.definitionHash && terminal.createdAt >= job.createdAt)) {
559
- job = this.withGapSource(job.intent.gapId, job.intent.owner, () => {
612
+ job = this.withJobSource(job, () => {
560
613
  this.assertGrowthRun(job.intent.creation?.growthRun ?? job.intent.revision?.growthRun, job.intent.mode, job.intent.gapId, job.intent.owner, false);
561
614
  return this.options.store.rearmQueuedGrowthSourceJob({ id: job.id, revision: job.revision,
562
615
  priorDefinitionHash: job.definitionHash, priorDefinitionVersion: health.definitionVersion, dispatchAt: Date.now() + 1000 });
@@ -671,7 +724,7 @@ export class SourceJobRuntime {
671
724
  return false;
672
725
  try {
673
726
  this.assertOwner(job);
674
- this.withGapSource(job.intent.gapId, job.intent.owner, () => {
727
+ this.withJobSource(job, () => {
675
728
  this.assertGrowthRun(job.intent.creation?.growthRun, job.intent.mode, job.intent.gapId, job.intent.owner, false);
676
729
  });
677
730
  }
@@ -707,7 +760,7 @@ export class SourceJobRuntime {
707
760
  continuationTimeoutMs() {
708
761
  const release = this.options.releaseTimeoutMs ?? 40_000, adoption = this.options.adoptionTimeoutMs ?? 60_000;
709
762
  const needed = (this.options.adoptReleased ? adoption : 0) + (this.options.advanceReleased ? release + 40_000 : this.options.releasePrepared ? 40_000 : 10_000);
710
- return Math.max(this.options.verifyPreparedCreation ? 1_800_000 : 10_000, needed);
763
+ return Math.max(this.linuxRevisionReviewTimeoutMs(), this.options.verifyPreparedCreation ? 1_800_000 : 10_000, needed);
711
764
  }
712
765
  continuationSignalTimeoutMs(job) {
713
766
  if (job.planId) {
@@ -812,7 +865,7 @@ export class SourceJobRuntime {
812
865
  const health = this.options.ports.automations.inspectSystemOwned({ owner: SOURCE_JOB_OWNER, automationId: job.automationId });
813
866
  if (health.definitionHash !== rebound.definitionHash)
814
867
  throw new Error('source job premature occurrence native binding changed');
815
- const pending = this.withGapSource(rebound.intent.gapId, rebound.intent.owner, () => {
868
+ const pending = this.withJobSource(rebound, () => {
816
869
  this.assertGrowthRun(rebound.intent.creation?.growthRun ?? rebound.intent.revision?.growthRun, rebound.intent.mode, rebound.intent.gapId, rebound.intent.owner, false);
817
870
  return this.options.store.rearmQueuedGrowthSourceJob({ id: rebound.id, revision: rebound.revision,
818
871
  priorDefinitionHash: rebound.definitionHash, priorDefinitionVersion: health.definitionVersion, dispatchAt: Date.now() + 1000 });
@@ -825,12 +878,15 @@ export class SourceJobRuntime {
825
878
  return failure(false);
826
879
  }
827
880
  let claimed = false;
881
+ let claimedJob;
828
882
  const growthController = (job.intent.creation?.growthRun ?? job.intent.revision?.growthRun) === undefined ? undefined : new AbortController();
829
883
  if (growthController)
830
884
  this.growthControllers.add(growthController);
831
885
  const signal = AbortSignal.any([input.signal, this.abort.signal,
832
886
  ...(growthController ? [growthController.signal] : []),
833
- AbortSignal.timeout(Math.max(1, Math.min(job.intent.build.timeoutMs + 120_000 + (this.options.verifyPreparedCreation ? 1_800_000 : 0)
887
+ AbortSignal.timeout(Math.max(1, Math.min(job.intent.build.timeoutMs + 120_000
888
+ + (job.intent.mode === 'revise-created' && this.linuxRevisionReviewTimeoutMs()
889
+ ? this.linuxRevisionReviewTimeoutMs() : this.options.verifyPreparedCreation ? 1_800_000 : 0)
834
890
  + (this.options.advanceReleased ? this.options.releaseTimeoutMs ?? 40_000 : 0) + (this.options.adoptReleased ? this.options.adoptionTimeoutMs ?? 60_000 : 0), job.expiresAt - Date.now())))]);
835
891
  try {
836
892
  this.assertOwner(job);
@@ -839,9 +895,11 @@ export class SourceJobRuntime {
839
895
  || input.ownerRouteId !== job.intent.owner.authorityId || input.principal !== job.intent.owner.principalId
840
896
  || input.targetScope.workspace !== job.intent.owner.workspace || input.targetScope.preset !== job.intent.owner.agentPreset)
841
897
  throw new Error('source job executor binding mismatch');
842
- job = this.options.store.claimSourceJob({ id: job.id, revision: job.revision, definitionHash: input.definitionHash, occurrenceId: input.occurrenceId });
898
+ const queuedJob = job;
899
+ job = this.withJobSource(queuedJob, () => this.options.store.claimSourceJob({ id: queuedJob.id, revision: queuedJob.revision, definitionHash: input.definitionHash, occurrenceId: input.occurrenceId }));
843
900
  claimed = true;
844
901
  const owned = job;
902
+ claimedJob = owned;
845
903
  const assertCurrent = async () => {
846
904
  signal.throwIfAborted();
847
905
  this.assertOwner(owned);
@@ -874,8 +932,40 @@ export class SourceJobRuntime {
874
932
  if (!claimed && current?.status === 'queued'
875
933
  && (current.revision !== job.revision || current.definitionHash !== input.definitionHash))
876
934
  return failure(false);
877
- if (current?.status === 'queued' || (current?.status === 'running' && current.occurrenceId === input.occurrenceId)) {
878
- this.options.store.settleSourceJob({ id: current.id, revision: current.revision, status: claimed ? 'unknown' : 'failed', failureCode: claimed ? 'source-job-interrupted' : 'source-job-preflight-rejected' });
935
+ if (claimed && claimedJob && current?.status === 'running' && current.revision === claimedJob.revision
936
+ && current.occurrenceId === claimedJob.occurrenceId && current.intentDigest === claimedJob.intentDigest) {
937
+ let notStarted = false;
938
+ try {
939
+ notStarted = this.options.isPreparationNotStarted?.(error, claimedJob) === true;
940
+ }
941
+ catch { /* Unavailable proof remains unknown. */ }
942
+ let diagnostics;
943
+ if (!notStarted) {
944
+ try {
945
+ diagnostics = this.options.deterministicBuildFailure?.(error, claimedJob);
946
+ }
947
+ catch { /* Unavailable proof remains unknown. */ }
948
+ }
949
+ if (diagnostics !== undefined) {
950
+ this.options.store.settleSourceJob({ id: claimedJob.id, revision: claimedJob.revision,
951
+ status: 'failed', failureCode: SOURCE_BUILD_CHECK_FAILED });
952
+ this.diagnostics.delete(claimedJob.id);
953
+ this.diagnostics.set(claimedJob.id, diagnostics);
954
+ while (this.diagnostics.size > MAX_RETAINED_DIAGNOSTICS)
955
+ this.diagnostics.delete(this.diagnostics.keys().next().value);
956
+ return { outcome: 'failed', failureClass: 'execution', failurePhase: 'host-execution',
957
+ failureCode: SOURCE_BUILD_CHECK_FAILED, sideEffectState: 'possible', retryability: 'unsafe' };
958
+ }
959
+ if (notStarted) {
960
+ this.options.store.settleSourceJob({ id: claimedJob.id, revision: claimedJob.revision,
961
+ status: 'failed', failureCode: 'source-job-preparation-not-started' });
962
+ return { outcome: 'failed', failureClass: 'configuration', failurePhase: 'host-execution',
963
+ failureCode: 'source-job-preparation-not-started', sideEffectState: 'possible', retryability: 'unsafe' };
964
+ }
965
+ }
966
+ if (!claimed && current?.status === 'queued' && current.revision === job.revision
967
+ || claimed && current?.status === 'running' && current.revision === job.revision && current.occurrenceId === input.occurrenceId) {
968
+ this.options.store.settleSourceJob({ id: job.id, revision: job.revision, status: claimed ? 'unknown' : 'failed', failureCode: claimed ? 'source-job-interrupted' : 'source-job-preflight-rejected' });
879
969
  }
880
970
  return failure(claimed);
881
971
  }
@@ -895,7 +985,8 @@ export class SourceJobRuntime {
895
985
  if (controlPlaneDigest(trust) !== job.intent.trustDigest)
896
986
  throw new Error('source job trust changed');
897
987
  if ('backend' in job.intent.build) {
898
- if (job.intent.nativeResource?.backend !== 'macos-seatbelt' || job.intent.nativeResource.key !== job.id
988
+ if (job.intent.nativeResource?.backend !== job.intent.build.backend || job.intent.nativeResource.key !== job.id
989
+ || controlPlaneDigest(this.options.build) !== controlPlaneDigest(job.intent.build)
899
990
  || await this.options.inspectNativeQuiescence?.(job.id) !== 'quiescent') {
900
991
  throw new Error('native source job has no valid durable quiescence receipt');
901
992
  }