Implement Scene 7 evidence goal flow

This commit is contained in:
2026-08-22 16:02:42 +02:00
parent 34aa23237e
commit a7f99a2a39
31 changed files with 1620 additions and 52 deletions
+38 -4
View File
@@ -13,6 +13,7 @@ export async function clearBoard(client: PoolClient, boardId: string) {
await client.query('DELETE FROM osint.board_views WHERE board_id=$1', [boardId])
await client.query('DELETE FROM osint.brief_concepts WHERE board_id=$1', [boardId])
await client.query('DELETE FROM osint.level_briefs WHERE board_id=$1', [boardId])
await client.query('DELETE FROM osint.level_goals WHERE board_id=$1', [boardId])
await client.query('DELETE FROM osint.evidence_match_rules WHERE board_id=$1', [boardId])
await client.query('DELETE FROM osint.metadata_fields WHERE board_id=$1', [boardId])
await client.query('DELETE FROM osint.exhibits WHERE board_id=$1', [boardId])
@@ -77,13 +78,13 @@ export async function cloneBoard(client: PoolClient, sourceBoardId: string, targ
const ruleIds: IdMap = new Map()
const matchRules = await client.query<{
id: string; name: string; flag_key: string; matcher_version: string; minimum_anchor_matches: number; enabled: boolean
}>('SELECT id,name,flag_key,matcher_version,minimum_anchor_matches,enabled FROM osint.evidence_match_rules WHERE board_id=$1 ORDER BY created_at,id', [sourceBoardId])
id: string; name: string; source_label:string | null; source_uri:string | null; flag_key: string; matcher_version: string; minimum_anchor_matches: number; enabled: boolean
}>('SELECT id,name,source_label,source_uri,flag_key,matcher_version,minimum_anchor_matches,enabled FROM osint.evidence_match_rules WHERE board_id=$1 ORDER BY created_at,id', [sourceBoardId])
for (const row of matchRules.rows) {
const id = randomUUID(); ruleIds.set(row.id, id)
await client.query(`INSERT INTO osint.evidence_match_rules
(id,board_id,origin_rule_id,name,flag_key,matcher_version,minimum_anchor_matches,enabled)
VALUES ($1,$2,$3,$4,$5,$6,$7,$8)`, [id,targetBoardId,row.id,row.name,row.flag_key,row.matcher_version,row.minimum_anchor_matches,row.enabled])
(id,board_id,origin_rule_id,name,source_label,source_uri,flag_key,matcher_version,minimum_anchor_matches,enabled)
VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10)`, [id,targetBoardId,row.id,row.name,row.source_label,row.source_uri,row.flag_key,row.matcher_version,row.minimum_anchor_matches,row.enabled])
}
const matchAnchors = await client.query<{ rule_id: string; phrase_text: string; minimum_similarity: string; sort_order: number }>(
`SELECT a.rule_id,a.phrase_text,a.minimum_similarity::text,a.sort_order FROM osint.evidence_match_anchors a
@@ -92,6 +93,39 @@ export async function cloneBoard(client: PoolClient, sourceBoardId: string, targ
(id,rule_id,phrase_text,minimum_similarity,sort_order) VALUES ($1,$2,$3,$4,$5)`,
[randomUUID(), mapped(ruleIds, row.rule_id, 'evidence match rule'), row.phrase_text, row.minimum_similarity, row.sort_order])
const goalIds: IdMap = new Map()
const goals = await client.query<{
id: string; goal_key: string; title: string; instructions: string; completion_message: string; enabled: boolean
}>(`SELECT id,goal_key,title,instructions,completion_message,enabled FROM osint.level_goals
WHERE board_id=$1 ORDER BY created_at,id`, [sourceBoardId])
for (const row of goals.rows) {
const id = randomUUID(); goalIds.set(row.id, id)
await client.query(`INSERT INTO osint.level_goals
(id,board_id,origin_goal_id,goal_key,title,instructions,completion_message,enabled)
VALUES ($1,$2,$3,$4,$5,$6,$7,$8)`,
[id,targetBoardId,row.id,row.goal_key,row.title,row.instructions,row.completion_message,row.enabled])
}
const goalRequirements = await client.query<{ goal_id: string; flag_key: string }>(
`SELECT requirement.goal_id,requirement.flag_key FROM osint.level_goal_flag_requirements requirement
JOIN osint.level_goals goal ON goal.id=requirement.goal_id
WHERE goal.board_id=$1 ORDER BY requirement.goal_id,requirement.flag_key`, [sourceBoardId])
for (const row of goalRequirements.rows) await client.query(
'INSERT INTO osint.level_goal_flag_requirements (board_id,goal_id,flag_key) VALUES ($1,$2,$3)',
[targetBoardId, mapped(goalIds, row.goal_id, 'level goal'), row.flag_key])
const semanticRules = await client.query<{
id: string; goal_id: string; name: string; target_subject: string; related_subject: string | null; assertion_text: string
success_flag_key: string; related_flag_key: string | null; minimum_confidence: string; evaluator_version: string; enabled: boolean
}>(`SELECT id,goal_id,name,target_subject,related_subject,assertion_text,success_flag_key,related_flag_key,
minimum_confidence::text,evaluator_version,enabled FROM osint.evidence_semantic_rules
WHERE board_id=$1 ORDER BY created_at,id`, [sourceBoardId])
for (const row of semanticRules.rows) await client.query(`INSERT INTO osint.evidence_semantic_rules
(id,board_id,origin_rule_id,goal_id,name,target_subject,related_subject,assertion_text,success_flag_key,
related_flag_key,minimum_confidence,evaluator_version,enabled)
VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13)`,
[randomUUID(),targetBoardId,row.id,mapped(goalIds,row.goal_id,'semantic evidence goal'),row.name,row.target_subject,row.related_subject,
row.assertion_text,row.success_flag_key,row.related_flag_key,row.minimum_confidence,row.evaluator_version,row.enabled])
const images = await client.query<{ exhibit_id: string; pixel_width: number | null; pixel_height: number | null; alt_text: string }>(
`SELECT i.* FROM osint.image_documents i JOIN osint.exhibits e ON e.id=i.exhibit_id WHERE e.board_id=$1`, [sourceBoardId])
for (const row of images.rows) await client.query(