import { expect, test } from "bun:test"; import { mkdtempSync, rmSync } from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; import { migrate } from "../../src/core/migrations"; import { serve } from "../../src/runtime/bun/server"; import { createSqliteDb, openDatabase } from "../../src/runtime/bun/sqlite"; import { provisionWith } from "../contract/harness"; test("the documented golden path runs against scoped principals", async () => { const directory = mkdtempSync(join(tmpdir(), "titen-golden-")); const dbPath = join(directory, "titen.db"); const database = openDatabase(dbPath); const db = createSqliteDb(database); await migrate(db); const researcher = await provisionWith(db, { principalId: "researcher", scopes: ["projects:resolve", "projects:create", "observations:write", "claims:write"], }); const writer = await provisionWith(db, { orgId: researcher.orgId, principalId: "writer", scopes: ["projects:resolve", "context:compile"], }); const operator = await provisionWith(db, { orgId: researcher.orgId, principalId: "operator", scopes: ["checkpoints:write", "leases:write", "handoffs:write"], }); const reviewer = await provisionWith(db, { orgId: researcher.orgId, principalId: "reviewer", scopes: ["handoffs:write", "feedback:write", "evidence:read", "views:compile"], }); const workspaceId = "ws_golden_path"; const at = new Date().toISOString(); await db.batch([ { sql: `INSERT INTO workspaces (id, org_id, name, created_at) VALUES (?, ?, ?, ?)`, params: [workspaceId, researcher.orgId, "Golden path", at], }, ...[ ["researcher", "member"], ["writer", "reader"], ["operator", "admin"], ["reviewer", "reader"], ].map(([principalId, role], index) => ({ sql: `INSERT INTO memberships (id, org_id, workspace_id, principal_id, principal_kind, role, created_at) VALUES (?, ?, ?, ?, 'agent', ?, ?)`, params: [`mbr_golden_${index}`, researcher.orgId, workspaceId, principalId!, role!, at], })), ]); database.close(); const api = await serve({ dbPath, port: 0, hostname: "127.0.0.1", quiet: true }); try { const run = Bun.spawn({ cmd: [process.execPath, "examples/small-team-golden-path.ts"], env: { ...process.env, TITEN_URL: api.url, TITEN_RESEARCHER_KEY: researcher.key, TITEN_WRITER_KEY: writer.key, TITEN_OPERATOR_KEY: operator.key, TITEN_REVIEWER_KEY: reviewer.key, TITEN_WORKSPACE_ID: workspaceId, TITEN_SUBJECT_ID: "golden-path-smoke", }, stdout: "pipe", stderr: "pipe", }); const [exitCode, stdout, stderr] = await Promise.all([ run.exited, new Response(run.stdout).text(), new Response(run.stderr).text(), ]); expect(exitCode, stderr).toBe(0); const result = JSON.parse(stdout); expect(result.ok).toBe(true); expect(result.ids.observations).toHaveLength(2); expect(result.ids.claims).toHaveLength(2); expect(result.evidence).toHaveLength(2); expect(result.conflict_freshness.edges.some((edge: any) => edge.relation === "contradicts")).toBe(true); expect(result.conflict_freshness.metadata.subject_id).toBe("golden-path-smoke"); expect(result.handoff_status).toBe("accepted"); expect(result.feedback_outcome).toBe("useful"); } finally { await api.stop(); rmSync(directory, { recursive: true, force: true }); } }, 30_000);