diff --git a/src/artifacts/register-artifact.ts b/src/artifacts/register-artifact.ts index 4609a383..08918fa4 100644 --- a/src/artifacts/register-artifact.ts +++ b/src/artifacts/register-artifact.ts @@ -339,12 +339,6 @@ export async function registerArtifact( } } - const metadataInitiativeId = - typeof metadata.initiative_id === "string" && metadata.initiative_id.trim().length > 0 - ? metadata.initiative_id.trim() - : null; - const initiativeIdHint = input.entity_type === "initiative" ? input.entity_id : metadataInitiativeId; - let entity: any = null; let created = false; let usedLegacyCreate = false; @@ -363,7 +357,6 @@ export async function registerArtifact( preview_markdown: input.preview_markdown ?? undefined, status, metadata, - ...(initiativeIdHint ? { initiative_id: initiativeIdHint } : {}), ...createdBy, }); @@ -389,7 +382,6 @@ export async function registerArtifact( confidence_score: confidenceScore ?? undefined, entity_type: input.entity_type, entity_id: input.entity_id, - ...(initiativeIdHint ? { initiative_id: initiativeIdHint } : {}), artifact_url: artifactUrl, status, metadata, @@ -410,7 +402,6 @@ export async function registerArtifact( confidence_score: confidenceScore ?? undefined, entity_type: input.entity_type, entity_id: input.entity_id, - ...(initiativeIdHint ? { initiative_id: initiativeIdHint } : {}), artifact_url: artifactUrl, status, metadata, diff --git a/tests/artifacts/register-artifact-client-contract.test.mjs b/tests/artifacts/register-artifact-client-contract.test.mjs index 5f235a28..2688125f 100644 --- a/tests/artifacts/register-artifact-client-contract.test.mjs +++ b/tests/artifacts/register-artifact-client-contract.test.mjs @@ -219,6 +219,58 @@ test("registerArtifact sends confidence_score via metadata for client contract c assert.equal(createCall.body.metadata.confidence_score, 0.67); }); +test("registerArtifact keeps initiative context in metadata and off the top-level artifact payload", async () => { + const artifactId = "12121212-1212-4212-8212-121212121212"; + const entityId = "34343434-3434-4434-8434-343434343434"; + const baseUrl = "https://www.useorgx.com"; + const calls = []; + + const client = { + getUserId: () => "", + rawRequest: async (method, path, body) => { + calls.push({ method, path, body }); + if (method === "POST" && path === "/api/client/artifacts") { + return { + ok: true, + artifact: { + id: artifactId, + artifact_url: `${baseUrl}/artifacts/${artifactId}`, + entity_type: "initiative", + entity_id: entityId, + }, + }; + } + throw new Error(`Unexpected request: ${method} ${path}`); + }, + createEntity: async () => { + throw new Error("createEntity should not be called"); + }, + updateEntity: async () => { + throw new Error("updateEntity should not be called"); + }, + }; + + const result = await registerArtifact(client, baseUrl, { + entity_type: "initiative", + entity_id: entityId, + name: "Initiative Scoped Artifact", + artifact_type: "shared.project_handbook", + description: "Ensure initiative scope stays in metadata only.", + external_url: "https://example.com/artifacts/init-scope", + metadata: { + initiative_id: entityId, + workstream_id: "ws-1", + }, + }); + + assert.equal(result.ok, true); + const createCall = calls.find((call) => call.method === "POST" && call.path === "/api/client/artifacts"); + assert.ok(createCall); + assert.equal(Object.hasOwn(createCall.body, "initiative_id"), false); + assert.equal(createCall.body.metadata.initiative_id, entityId); + assert.equal(createCall.body.metadata.workstream_id, "ws-1"); +}); + test("validateRegisterArtifactInput rejects unknown entity_type values", () => { const errors = validateRegisterArtifactInput({ entity_type: "artifact", diff --git a/tests/http/autopilot-slice-lifecycle.test.mjs b/tests/http/autopilot-slice-lifecycle.test.mjs index ac89d040..1f095bb4 100644 --- a/tests/http/autopilot-slice-lifecycle.test.mjs +++ b/tests/http/autopilot-slice-lifecycle.test.mjs @@ -723,7 +723,7 @@ test("autopilot slice lifecycle: success registers artifact and completes run", assert.ok(artifactCreate, "expected artifact.create"); assert.equal(artifactCreate.payload?.entity_type, "initiative"); assert.equal(artifactCreate.payload?.entity_id, "init-1"); - assert.equal(artifactCreate.payload?.initiative_id, "init-1"); + assert.equal(Object.hasOwn(artifactCreate.payload ?? {}, "initiative_id"), false); assert.equal(artifactCreate.payload?.name, "Mock deliverable"); assert.equal(artifactCreate.payload?.artifact_type, "document"); assert.equal(artifactCreate.payload?.created_by_type, "human");