@@ -396,6 +396,26 @@ function normalizeResultState(candidate) {
396396 : 'blocked_readiness';
397397}
398398
399+ function requiresPullRequestDelivery(output, input) {
400+ const template =
401+ output?.deliveryMechanismTemplate ||
402+ output?.assetPack?.deliveryMechanismTemplate ||
403+ input?.deliveryMechanismTemplate;
404+ return template === 'pull-request';
405+ }
406+
407+ function findPullRequestUrl(output) {
408+ return (
409+ output?.deliveryMechanism?.pullRequest?.url ||
410+ output?.deliveryMechanism?.prUrl ||
411+ output?.shippables?.pullRequest?.url ||
412+ output?.shippable?.prUrl ||
413+ output?.writtenAssets?.pullRequest?.url ||
414+ output?.assetPackSynthesisArtifacts?.pullRequest?.url ||
415+ null
416+ );
417+ }
418+
399419function isUsableUuid(value) {
400420 return UUID_PATTERN.test(String(value || '')) && value !== DEFAULT_USER_ID;
401421}
@@ -1489,6 +1509,9 @@ try {
14891509
14901510 execution.store('harness', 'manifestRoot', manifestRoot);
14911511 execution.store('harness', 'sourceRevision', manifest.sourceRevision);
1512+ execution.store('harness', 'runId', runId);
1513+ execution.store('harness', 'userId', userId);
1514+ execution.store('pipeline', 'userId', userId);
14921515 execution.store('read', 'request', manifest.read);
14931516 execution.store('deposit', 'reference', manifest.deposit);
14941517
@@ -1497,6 +1520,8 @@ try {
14971520 const { supabaseAdmin } = await import('../../packages/supabase/src/index');
14981521 supabase = supabaseAdmin;
14991522 userId = await resolvePipelineUserId();
1523+ execution.store('harness', 'userId', userId);
1524+ execution.store('pipeline', 'userId', userId);
15001525 pipelineRunId = await insertPipelineRun();
15011526 record({ type: 'database-streaming-enabled', stage: 'telemetry-readback' });
15021527 }
@@ -1551,7 +1576,14 @@ try {
15511576 const pipelineResultState = normalizeResultState(
15521577 output?.resultState || output?.fitResult?.resultState || output?.fit?.resultState
15531578 );
1554- resultState = manifest.sourceOverlay ? 'blocked_readiness' : pipelineResultState;
1579+ const deliveryRequired = requiresPullRequestDelivery(output, input);
1580+ const pullRequestUrl = findPullRequestUrl(output);
1581+ const deliveryAdmissible = !deliveryRequired || Boolean(pullRequestUrl);
1582+ const settlementResultState =
1583+ pipelineResultState === 'worthy_fit' && !deliveryAdmissible
1584+ ? 'blocked_readiness'
1585+ : pipelineResultState;
1586+ resultState = manifest.sourceOverlay ? 'blocked_readiness' : settlementResultState;
15551587 const fitResult = output?.fitResult || output?.fit || null;
15561588 const depositorySearch = output?.depositorySearch || null;
15571589 const pipelineResultReasons = Array.isArray(fitResult?.resultReasons)
@@ -1570,13 +1602,22 @@ try {
15701602 : null,
15711603 pipelineResultState === 'blocked_readiness'
15721604 ? 'Pipeline output did not include an admissible result state; review remains blocked.'
1605+ : pipelineResultState === 'worthy_fit' && !deliveryAdmissible
1606+ ? 'Pipeline found a worthy fit, but required pull-request delivery is missing; settlement remains blocked.'
15731607 : resultState === 'blocked_readiness'
15741608 ? 'Pipeline produced ' + pipelineResultState + ' evidence; final settlement remains blocked by harness readiness constraints.'
15751609 : 'Review SQL must still verify durable telemetry, proof, and ledger readback before settlement.',
15761610 ...pipelineResultReasons,
15771611 ].filter(Boolean);
1612+ record({
1613+ type: 'delivery-readback',
1614+ stage: 'finish',
1615+ required: deliveryRequired,
1616+ admissible: deliveryAdmissible,
1617+ pullRequestUrl: pullRequestUrl || null,
1618+ });
15781619
1579- const ledgerSettlement = await settleAssetPackLedger(pipelineResultState );
1620+ const ledgerSettlement = await settleAssetPackLedger(settlementResultState );
15801621 output = {
15811622 ...(output || {}),
15821623 ledgerSettlement,
0 commit comments