Add rank handoff readiness gate

This commit is contained in:
OpenClaw Bot
2026-05-27 00:51:03 +02:00
parent 6cd5c52683
commit 9dbcd7770b
3 changed files with 71 additions and 3 deletions
+13 -1
View File
@@ -99,6 +99,9 @@ try {
assert.match(data.brief.summary, /nearest follow-up|strongest signal/i);
assert.ok(data.brief.whatWouldChangeRanking.some(item => /evidence fails|re-run the order/i.test(item)));
assert.ok(Array.isArray(data.brief.assumptions));
assert.equal(data.handoff.readiness.status, 'ready');
assert.equal(data.handoff.readiness.sourceComplete, true);
assert.ok(data.handoff.readiness.nextChecks.some(item => /Do first item/i.test(item)));
const messyIdeaOnlyResponse = await fetch(`${base}/api/rank-feedback`, {
method: 'POST',
@@ -119,6 +122,8 @@ try {
assert.equal(messyIdeaOnly.handoff.source.requiresSourceTrace, false);
assert.ok(!messyIdeaOnly.handoff.warnings.some(item => /missing source section|missing original prompt/.test(item)));
assert.ok(messyIdeaOnly.handoff.warnings.includes('missing source artifact id'));
assert.equal(messyIdeaOnly.handoff.readiness.status, 'usable-with-warnings');
assert.ok(messyIdeaOnly.handoff.readiness.nextChecks.some(item => /source artifact id if this came from Scattermind/i.test(item)));
const hintedResponse = await fetch(`${base}/api/rank-feedback`, {
method: 'POST',
@@ -398,6 +403,8 @@ try {
assert.equal(duplicateIds.handoff.itemTrace.find(item => item.id === 'preview-2').idNormalized, true);
assert.ok(duplicateIds.handoff.warnings.some(item => /duplicate source id preview normalized to preview-2/.test(item)));
assert.ok(Object.values(duplicateIds.buildOrder).flat().includes('preview-2'));
assert.equal(duplicateIds.handoff.readiness.status, 'usable-with-warnings');
assert.ok(duplicateIds.handoff.readiness.nextChecks.some(item => /duplicate IDs/i.test(item)));
const structuredContextResponse = await fetch(`${base}/api/rank-feedback`, {
method: 'POST',
@@ -593,6 +600,9 @@ try {
assert.equal(objectBuildOrder.ranked.find(item => item.id === 'workspace-dashboard').lane.id, 'park');
assert.equal(objectBuildOrder.ranked.find(item => item.id === 'workspace-dashboard').lane.source, 'hint');
assert.ok(objectBuildOrder.handoff.warnings.includes('missing evidence needed for active item feature-1'));
assert.equal(objectBuildOrder.handoff.readiness.status, 'needs-source-context');
assert.ok(objectBuildOrder.handoff.readiness.blockers.includes('missing evidence needed for active item feature-1'));
assert.ok(objectBuildOrder.handoff.readiness.nextChecks.some(item => /evidenceNeeded/i.test(item)));
const embeddedJsonResponse = await fetch(`${base}/api/rank-feedback`, {
method: 'POST',
@@ -680,8 +690,10 @@ try {
assert.equal(sourceExcerpt.handoff.itemTrace.find(item => item.id === 'copyable-brief').sourceTitle, 'Build Order');
assert.match(sourceExcerpt.handoff.itemTrace.find(item => item.id === 'saved-workspace').sourceQuote, /Probably noise/);
assert.deepEqual(sourceExcerpt.handoff.warnings, []);
assert.equal(sourceExcerpt.handoff.readiness.status, 'ready');
assert.equal(sourceExcerpt.handoff.readiness.activeItemCount, 2);
console.log(JSON.stringify({ ok: true, top: data.ranked[0].id, hintedTop: hinted.ranked[0].id, actionTop: actions.ranked[0].id, nestedConceptTop: nestedConcept.ranked[0].id, nonGoalTop: nonGoal.ranked[0].id, structuredContextTop: structuredContext.ranked[0].id, lensOnlyTop: lensOnly.ranked[0].id, scattermindPaidShapeTop: scattermindPaidShape.ranked[0].id, mergedContextTop: mergedContext.ranked[0].id, embeddedJsonTop: embeddedJson.ranked[0].id, fencedJsonTop: fencedJson.ranked[0].id, sourceExcerptTop: sourceExcerpt.ranked[0].id, duplicateIds: duplicateIds.ranked.map(item => item.id), provenance: data.input.provenance, buildOrder: data.buildOrder }, null, 2));
console.log(JSON.stringify({ ok: true, top: data.ranked[0].id, hintedTop: hinted.ranked[0].id, actionTop: actions.ranked[0].id, nestedConceptTop: nestedConcept.ranked[0].id, nonGoalTop: nonGoal.ranked[0].id, structuredContextTop: structuredContext.ranked[0].id, lensOnlyTop: lensOnly.ranked[0].id, scattermindPaidShapeTop: scattermindPaidShape.ranked[0].id, mergedContextTop: mergedContext.ranked[0].id, embeddedJsonTop: embeddedJson.ranked[0].id, fencedJsonTop: fencedJson.ranked[0].id, sourceExcerptTop: sourceExcerpt.ranked[0].id, duplicateIds: duplicateIds.ranked.map(item => item.id), readiness: data.handoff.readiness.status, provenance: data.input.provenance, buildOrder: data.buildOrder }, null, 2));
} finally {
server.kill('SIGTERM');
}