Restore qualified task identities and finish transport protocol types
Assistant: codex Assistant-Model: gpt-5.6-luna Assistant-Session: 01a07ff8-19d0-7820-b4d0-1353833cb7fc
This commit is contained in:
parent
4055986c98
commit
68ffe9ef76
9 changed files with 899 additions and 157 deletions
697
docs/evidence/2026-09-09-legacy-task-qualification.json
Normal file
697
docs/evidence/2026-09-09-legacy-task-qualification.json
Normal file
|
|
@ -0,0 +1,697 @@
|
|||
[
|
||||
{
|
||||
"source_file": "workplans/llm-connect-WP-0001-foundation-gaaf-baseline.md",
|
||||
"workplan_id": "LLM-WP-0001",
|
||||
"workplan_uuid": "f7f08327-753f-4175-8591-ffa1c3188ebc",
|
||||
"workplan_status": "completed",
|
||||
"hub_status": "finished",
|
||||
"tasks": [
|
||||
{
|
||||
"source_id": "T01",
|
||||
"uuid": "c38c5a79-4ce5-4088-9a21-ac65e09b12ba",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0001-T01",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "f7f08327-753f-4175-8591-ffa1c3188ebc",
|
||||
"source_id_original": "T01",
|
||||
"source_id_qualified": "LLM-WP-0001-T01"
|
||||
},
|
||||
{
|
||||
"source_id": "T02",
|
||||
"uuid": "6a15c794-d0f7-4d9c-a3ac-850f8c5bd5e9",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0001-T02",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "f7f08327-753f-4175-8591-ffa1c3188ebc",
|
||||
"source_id_original": "T02",
|
||||
"source_id_qualified": "LLM-WP-0001-T02"
|
||||
},
|
||||
{
|
||||
"source_id": "T03",
|
||||
"uuid": "af1c63ac-e4be-495a-9fdb-68eddebfcb75",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0001-T03",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "f7f08327-753f-4175-8591-ffa1c3188ebc",
|
||||
"source_id_original": "T03",
|
||||
"source_id_qualified": "LLM-WP-0001-T03"
|
||||
},
|
||||
{
|
||||
"source_id": "T04",
|
||||
"uuid": "da5a7986-5c47-4c4c-a8f6-a58956127535",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0001-T04",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "f7f08327-753f-4175-8591-ffa1c3188ebc",
|
||||
"source_id_original": "T04",
|
||||
"source_id_qualified": "LLM-WP-0001-T04"
|
||||
},
|
||||
{
|
||||
"source_id": "T05",
|
||||
"uuid": "01237203-0582-4bc4-a308-075e991e8e99",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0001-T05",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "f7f08327-753f-4175-8591-ffa1c3188ebc",
|
||||
"source_id_original": "T05",
|
||||
"source_id_qualified": "LLM-WP-0001-T05"
|
||||
},
|
||||
{
|
||||
"source_id": "T06",
|
||||
"uuid": "2bee5174-d3d7-4267-9cee-6e0e9b5cc731",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0001-T06",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "f7f08327-753f-4175-8591-ffa1c3188ebc",
|
||||
"source_id_original": "T06",
|
||||
"source_id_qualified": "LLM-WP-0001-T06"
|
||||
},
|
||||
{
|
||||
"source_id": "T07",
|
||||
"uuid": "b6dccf3e-8742-486e-a6a7-82577866a3bc",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0001-T07",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "f7f08327-753f-4175-8591-ffa1c3188ebc",
|
||||
"source_id_original": "T07",
|
||||
"source_id_qualified": "LLM-WP-0001-T07"
|
||||
},
|
||||
{
|
||||
"source_id": "T08",
|
||||
"uuid": "cc05b67d-f956-458a-908f-2ff58b1d33d3",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0001-T08",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "f7f08327-753f-4175-8591-ffa1c3188ebc",
|
||||
"source_id_original": "T08",
|
||||
"source_id_qualified": "LLM-WP-0001-T08"
|
||||
},
|
||||
{
|
||||
"source_id": "T09",
|
||||
"uuid": "8f9ec054-79ab-411d-8204-9d764bbbed98",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0001-T09",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "f7f08327-753f-4175-8591-ffa1c3188ebc",
|
||||
"source_id_original": "T09",
|
||||
"source_id_qualified": "LLM-WP-0001-T09"
|
||||
},
|
||||
{
|
||||
"source_id": "T10",
|
||||
"uuid": "044ee879-6baa-42fd-a0a4-a43dac0eacbb",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0001-T10",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "f7f08327-753f-4175-8591-ffa1c3188ebc",
|
||||
"source_id_original": "T10",
|
||||
"source_id_qualified": "LLM-WP-0001-T10"
|
||||
},
|
||||
{
|
||||
"source_id": "T11",
|
||||
"uuid": "699eef00-e9df-4de0-b7e6-61cfaace9617",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0001-T11",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "f7f08327-753f-4175-8591-ffa1c3188ebc",
|
||||
"source_id_original": "T11",
|
||||
"source_id_qualified": "LLM-WP-0001-T11"
|
||||
},
|
||||
{
|
||||
"source_id": "T12",
|
||||
"uuid": "c0853a23-52ae-499e-9a49-e7b65749b508",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0001-T12",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "f7f08327-753f-4175-8591-ffa1c3188ebc",
|
||||
"source_id_original": "T12",
|
||||
"source_id_qualified": "LLM-WP-0001-T12"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"source_file": "workplans/llm-connect-WP-0002-core-extensions.md",
|
||||
"workplan_id": "LLM-WP-0002",
|
||||
"workplan_uuid": "448fa379-eb9e-4808-b3fa-0078f1e4eaba",
|
||||
"workplan_status": "completed",
|
||||
"hub_status": "finished",
|
||||
"tasks": [
|
||||
{
|
||||
"source_id": "T01",
|
||||
"uuid": "ae27c363-339a-4f78-9737-cf872698f6d8",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0002-T01",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "448fa379-eb9e-4808-b3fa-0078f1e4eaba",
|
||||
"source_id_original": "T01",
|
||||
"source_id_qualified": "LLM-WP-0002-T01"
|
||||
},
|
||||
{
|
||||
"source_id": "T02",
|
||||
"uuid": "ea6f6ef7-2cb2-48e2-b9c9-f2b84a1a242b",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0002-T02",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "448fa379-eb9e-4808-b3fa-0078f1e4eaba",
|
||||
"source_id_original": "T02",
|
||||
"source_id_qualified": "LLM-WP-0002-T02"
|
||||
},
|
||||
{
|
||||
"source_id": "T03",
|
||||
"uuid": "fe6dbb73-5d04-45e6-aa91-5eff79aae7ee",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0002-T03",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "448fa379-eb9e-4808-b3fa-0078f1e4eaba",
|
||||
"source_id_original": "T03",
|
||||
"source_id_qualified": "LLM-WP-0002-T03"
|
||||
},
|
||||
{
|
||||
"source_id": "T04",
|
||||
"uuid": "8fd21bc2-598e-4449-8c86-eacde760e23f",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0002-T04",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "448fa379-eb9e-4808-b3fa-0078f1e4eaba",
|
||||
"source_id_original": "T04",
|
||||
"source_id_qualified": "LLM-WP-0002-T04"
|
||||
},
|
||||
{
|
||||
"source_id": "T05",
|
||||
"uuid": "e15745f5-9bb7-45d6-a36b-3a345fb0e9f1",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0002-T05",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "448fa379-eb9e-4808-b3fa-0078f1e4eaba",
|
||||
"source_id_original": "T05",
|
||||
"source_id_qualified": "LLM-WP-0002-T05"
|
||||
},
|
||||
{
|
||||
"source_id": "T06",
|
||||
"uuid": "5af37ade-3dd0-4ce9-8ead-be9887913bab",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0002-T06",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "448fa379-eb9e-4808-b3fa-0078f1e4eaba",
|
||||
"source_id_original": "T06",
|
||||
"source_id_qualified": "LLM-WP-0002-T06"
|
||||
},
|
||||
{
|
||||
"source_id": "T07",
|
||||
"uuid": "e221e630-658f-4adb-9f00-7b7df7ab8cb4",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0002-T07",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "448fa379-eb9e-4808-b3fa-0078f1e4eaba",
|
||||
"source_id_original": "T07",
|
||||
"source_id_qualified": "LLM-WP-0002-T07"
|
||||
},
|
||||
{
|
||||
"source_id": "T08",
|
||||
"uuid": "a75c2b2a-e4ef-4cbd-9c5f-7e98c8d3d7e8",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0002-T08",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "448fa379-eb9e-4808-b3fa-0078f1e4eaba",
|
||||
"source_id_original": "T08",
|
||||
"source_id_qualified": "LLM-WP-0002-T08"
|
||||
},
|
||||
{
|
||||
"source_id": "T09",
|
||||
"uuid": "1c50889f-28ed-4c6e-a788-1fc7dcc5a2c3",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0002-T09",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "448fa379-eb9e-4808-b3fa-0078f1e4eaba",
|
||||
"source_id_original": "T09",
|
||||
"source_id_qualified": "LLM-WP-0002-T09"
|
||||
},
|
||||
{
|
||||
"source_id": "T10",
|
||||
"uuid": "fa4f9e80-ddee-4d05-a239-fe09e633b0cb",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0002-T10",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "448fa379-eb9e-4808-b3fa-0078f1e4eaba",
|
||||
"source_id_original": "T10",
|
||||
"source_id_qualified": "LLM-WP-0002-T10"
|
||||
},
|
||||
{
|
||||
"source_id": "T11",
|
||||
"uuid": "bca78609-7f7c-4548-8857-a72e4c760dc6",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0002-T11",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "448fa379-eb9e-4808-b3fa-0078f1e4eaba",
|
||||
"source_id_original": "T11",
|
||||
"source_id_qualified": "LLM-WP-0002-T11"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"source_file": "workplans/llm-connect-WP-0003-functional-extensions.md",
|
||||
"workplan_id": "LLM-WP-0003",
|
||||
"workplan_uuid": "7b463cdc-40a2-4cc5-8b55-b59cc5ae3443",
|
||||
"workplan_status": "completed",
|
||||
"hub_status": "finished",
|
||||
"tasks": [
|
||||
{
|
||||
"source_id": "T01",
|
||||
"uuid": "85cf92fd-cddd-4e19-8782-970f6480a37f",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0003-T01",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "7b463cdc-40a2-4cc5-8b55-b59cc5ae3443",
|
||||
"source_id_original": "T01",
|
||||
"source_id_qualified": "LLM-WP-0003-T01"
|
||||
},
|
||||
{
|
||||
"source_id": "T02",
|
||||
"uuid": "352701ce-4b21-4f5d-a22e-462136e58fd2",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0003-T02",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "7b463cdc-40a2-4cc5-8b55-b59cc5ae3443",
|
||||
"source_id_original": "T02",
|
||||
"source_id_qualified": "LLM-WP-0003-T02"
|
||||
},
|
||||
{
|
||||
"source_id": "T03",
|
||||
"uuid": "baeb9b39-7fee-4f2b-86cc-ce64ff9e9b95",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0003-T03",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "7b463cdc-40a2-4cc5-8b55-b59cc5ae3443",
|
||||
"source_id_original": "T03",
|
||||
"source_id_qualified": "LLM-WP-0003-T03"
|
||||
},
|
||||
{
|
||||
"source_id": "T04",
|
||||
"uuid": "aa4488c6-950e-4cea-99b1-89defa4677ce",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0003-T04",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "7b463cdc-40a2-4cc5-8b55-b59cc5ae3443",
|
||||
"source_id_original": "T04",
|
||||
"source_id_qualified": "LLM-WP-0003-T04"
|
||||
},
|
||||
{
|
||||
"source_id": "T05",
|
||||
"uuid": "a4ad9c9e-64a4-44f0-85f3-b9cfe9ef59f7",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0003-T05",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "7b463cdc-40a2-4cc5-8b55-b59cc5ae3443",
|
||||
"source_id_original": "T05",
|
||||
"source_id_qualified": "LLM-WP-0003-T05"
|
||||
},
|
||||
{
|
||||
"source_id": "T06",
|
||||
"uuid": "cf79bce2-8d1a-4708-90b2-5e6569908b14",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0003-T06",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "7b463cdc-40a2-4cc5-8b55-b59cc5ae3443",
|
||||
"source_id_original": "T06",
|
||||
"source_id_qualified": "LLM-WP-0003-T06"
|
||||
},
|
||||
{
|
||||
"source_id": "T07",
|
||||
"uuid": "c91964ab-7366-4b34-acd4-1ee12f96881e",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0003-T07",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "7b463cdc-40a2-4cc5-8b55-b59cc5ae3443",
|
||||
"source_id_original": "T07",
|
||||
"source_id_qualified": "LLM-WP-0003-T07"
|
||||
},
|
||||
{
|
||||
"source_id": "T08",
|
||||
"uuid": "e3115bb4-cf3b-4ca0-9992-136e317068ac",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0003-T08",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "7b463cdc-40a2-4cc5-8b55-b59cc5ae3443",
|
||||
"source_id_original": "T08",
|
||||
"source_id_qualified": "LLM-WP-0003-T08"
|
||||
},
|
||||
{
|
||||
"source_id": "T09",
|
||||
"uuid": "2caf5531-8e10-40e9-a595-8652882a10e0",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0003-T09",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "7b463cdc-40a2-4cc5-8b55-b59cc5ae3443",
|
||||
"source_id_original": "T09",
|
||||
"source_id_qualified": "LLM-WP-0003-T09"
|
||||
},
|
||||
{
|
||||
"source_id": "T10",
|
||||
"uuid": "dc3c81c2-698d-4fee-b1dd-1af156a4276f",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0003-T10",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "7b463cdc-40a2-4cc5-8b55-b59cc5ae3443",
|
||||
"source_id_original": "T10",
|
||||
"source_id_qualified": "LLM-WP-0003-T10"
|
||||
},
|
||||
{
|
||||
"source_id": "T11",
|
||||
"uuid": "848a1622-abdd-4938-8bb4-3da27f5f9867",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0003-T11",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "7b463cdc-40a2-4cc5-8b55-b59cc5ae3443",
|
||||
"source_id_original": "T11",
|
||||
"source_id_qualified": "LLM-WP-0003-T11"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"source_file": "workplans/llm-connect-WP-0004-adaptive-cost-quality-routing.md",
|
||||
"workplan_id": "LLM-WP-0004",
|
||||
"workplan_uuid": "e1807fab-e29e-4517-b362-95737a96582d",
|
||||
"workplan_status": "completed",
|
||||
"hub_status": "finished",
|
||||
"tasks": [
|
||||
{
|
||||
"source_id": "T01",
|
||||
"uuid": "1c285bec-c30b-45a8-a408-3f91d810a078",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0004-T01",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "e1807fab-e29e-4517-b362-95737a96582d",
|
||||
"source_id_original": "T01",
|
||||
"source_id_qualified": "LLM-WP-0004-T01"
|
||||
},
|
||||
{
|
||||
"source_id": "T02",
|
||||
"uuid": "5249f171-a047-499f-9ec4-cb50e1477765",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0004-T02",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "e1807fab-e29e-4517-b362-95737a96582d",
|
||||
"source_id_original": "T02",
|
||||
"source_id_qualified": "LLM-WP-0004-T02"
|
||||
},
|
||||
{
|
||||
"source_id": "T03",
|
||||
"uuid": "adb255cf-7e89-4fea-b822-6be437d99789",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0004-T03",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "e1807fab-e29e-4517-b362-95737a96582d",
|
||||
"source_id_original": "T03",
|
||||
"source_id_qualified": "LLM-WP-0004-T03"
|
||||
},
|
||||
{
|
||||
"source_id": "T04",
|
||||
"uuid": "51a33180-a99d-4aa4-96be-2fcee15bfbc3",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0004-T04",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "e1807fab-e29e-4517-b362-95737a96582d",
|
||||
"source_id_original": "T04",
|
||||
"source_id_qualified": "LLM-WP-0004-T04"
|
||||
},
|
||||
{
|
||||
"source_id": "T05",
|
||||
"uuid": "458610c5-c903-4b42-9602-cd511999c9ba",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0004-T05",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "e1807fab-e29e-4517-b362-95737a96582d",
|
||||
"source_id_original": "T05",
|
||||
"source_id_qualified": "LLM-WP-0004-T05"
|
||||
},
|
||||
{
|
||||
"source_id": "T06",
|
||||
"uuid": "c12a595b-90fc-4a80-8394-549edbda2031",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0004-T06",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "e1807fab-e29e-4517-b362-95737a96582d",
|
||||
"source_id_original": "T06",
|
||||
"source_id_qualified": "LLM-WP-0004-T06"
|
||||
},
|
||||
{
|
||||
"source_id": "T07",
|
||||
"uuid": "80b98e31-06fc-4462-b030-a12881095f93",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0004-T07",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "e1807fab-e29e-4517-b362-95737a96582d",
|
||||
"source_id_original": "T07",
|
||||
"source_id_qualified": "LLM-WP-0004-T07"
|
||||
},
|
||||
{
|
||||
"source_id": "T08",
|
||||
"uuid": "c2887fe3-bae6-4298-8c26-f9a519264dcf",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0004-T08",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "e1807fab-e29e-4517-b362-95737a96582d",
|
||||
"source_id_original": "T08",
|
||||
"source_id_qualified": "LLM-WP-0004-T08"
|
||||
},
|
||||
{
|
||||
"source_id": "T09",
|
||||
"uuid": "7a4fd87a-b0ba-41b0-8e1a-a60fdaded905",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0004-T09",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "e1807fab-e29e-4517-b362-95737a96582d",
|
||||
"source_id_original": "T09",
|
||||
"source_id_qualified": "LLM-WP-0004-T09"
|
||||
},
|
||||
{
|
||||
"source_id": "T10",
|
||||
"uuid": "8415a11d-d508-4d17-8082-10f93e9d16c5",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0004-T10",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "e1807fab-e29e-4517-b362-95737a96582d",
|
||||
"source_id_original": "T10",
|
||||
"source_id_qualified": "LLM-WP-0004-T10"
|
||||
},
|
||||
{
|
||||
"source_id": "T11",
|
||||
"uuid": "0e9f9f8e-5066-4257-913b-a19f5b3fc47d",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0004-T11",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "e1807fab-e29e-4517-b362-95737a96582d",
|
||||
"source_id_original": "T11",
|
||||
"source_id_qualified": "LLM-WP-0004-T11"
|
||||
},
|
||||
{
|
||||
"source_id": "T12",
|
||||
"uuid": "59d44712-1088-41ac-bad8-5d95db6f3a4f",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0004-T12",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "e1807fab-e29e-4517-b362-95737a96582d",
|
||||
"source_id_original": "T12",
|
||||
"source_id_qualified": "LLM-WP-0004-T12"
|
||||
},
|
||||
{
|
||||
"source_id": "T13",
|
||||
"uuid": "1927d369-f5f6-48d3-8f53-7e4f1cae370e",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0004-T13",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "e1807fab-e29e-4517-b362-95737a96582d",
|
||||
"source_id_original": "T13",
|
||||
"source_id_qualified": "LLM-WP-0004-T13"
|
||||
},
|
||||
{
|
||||
"source_id": "T14",
|
||||
"uuid": "4d4717c1-8849-4fed-8f8d-515901ecafe0",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0004-T14",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "e1807fab-e29e-4517-b362-95737a96582d",
|
||||
"source_id_original": "T14",
|
||||
"source_id_qualified": "LLM-WP-0004-T14"
|
||||
},
|
||||
{
|
||||
"source_id": "T15",
|
||||
"uuid": "304bd782-db15-4b7a-8d05-49e064a926c3",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0004-T15",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "e1807fab-e29e-4517-b362-95737a96582d",
|
||||
"source_id_original": "T15",
|
||||
"source_id_qualified": "LLM-WP-0004-T15"
|
||||
},
|
||||
{
|
||||
"source_id": "T16",
|
||||
"uuid": "62dd507f-536a-4623-8cbd-fa9f78e85ca6",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0004-T16",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "e1807fab-e29e-4517-b362-95737a96582d",
|
||||
"source_id_original": "T16",
|
||||
"source_id_qualified": "LLM-WP-0004-T16"
|
||||
},
|
||||
{
|
||||
"source_id": "T17",
|
||||
"uuid": "ccb73e92-1fca-42f9-8437-9b2b50e6424c",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0004-T17",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "e1807fab-e29e-4517-b362-95737a96582d",
|
||||
"source_id_original": "T17",
|
||||
"source_id_qualified": "LLM-WP-0004-T17"
|
||||
},
|
||||
{
|
||||
"source_id": "T18",
|
||||
"uuid": "b879d232-d6ce-4ff6-b534-616729ea5ad7",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0004-T18",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "e1807fab-e29e-4517-b362-95737a96582d",
|
||||
"source_id_original": "T18",
|
||||
"source_id_qualified": "LLM-WP-0004-T18"
|
||||
},
|
||||
{
|
||||
"source_id": "T19",
|
||||
"uuid": "99d2c1bc-f1d8-42b3-9e04-6eea49460943",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0004-T19",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "e1807fab-e29e-4517-b362-95737a96582d",
|
||||
"source_id_original": "T19",
|
||||
"source_id_qualified": "LLM-WP-0004-T19"
|
||||
},
|
||||
{
|
||||
"source_id": "T20",
|
||||
"uuid": "f533fbf4-484f-4408-8260-7e84e23bdc46",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0004-T20",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "e1807fab-e29e-4517-b362-95737a96582d",
|
||||
"source_id_original": "T20",
|
||||
"source_id_qualified": "LLM-WP-0004-T20"
|
||||
},
|
||||
{
|
||||
"source_id": "T21",
|
||||
"uuid": "7ef0c143-74b0-4740-81fa-819a826cf8f3",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0004-T21",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "e1807fab-e29e-4517-b362-95737a96582d",
|
||||
"source_id_original": "T21",
|
||||
"source_id_qualified": "LLM-WP-0004-T21"
|
||||
},
|
||||
{
|
||||
"source_id": "T22",
|
||||
"uuid": "c4c6743f-157b-4445-8576-9caa6421d463",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0004-T22",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "e1807fab-e29e-4517-b362-95737a96582d",
|
||||
"source_id_original": "T22",
|
||||
"source_id_qualified": "LLM-WP-0004-T22"
|
||||
},
|
||||
{
|
||||
"source_id": "T23",
|
||||
"uuid": "3a073ff7-0170-4a95-9c2a-a5daa84964e6",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0004-T23",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "e1807fab-e29e-4517-b362-95737a96582d",
|
||||
"source_id_original": "T23",
|
||||
"source_id_qualified": "LLM-WP-0004-T23"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"source_file": "workplans/llm-connect-WP-0005-cost-model-and-problem-class-estimators.md",
|
||||
"workplan_id": "LLM-WP-0005",
|
||||
"workplan_uuid": "869196c5-551b-4eef-b8d8-cca6f770a9b0",
|
||||
"workplan_status": "finished",
|
||||
"hub_status": "finished",
|
||||
"tasks": [
|
||||
{
|
||||
"source_id": "T01",
|
||||
"uuid": "535d3f12-911e-4b6a-87c3-b539c5986671",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0005-T01",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "869196c5-551b-4eef-b8d8-cca6f770a9b0",
|
||||
"source_id_original": "T01",
|
||||
"source_id_qualified": "LLM-WP-0005-T01"
|
||||
},
|
||||
{
|
||||
"source_id": "T02",
|
||||
"uuid": "691dd985-6a97-432d-8bf0-6cb99a9fbdcc",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0005-T02",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "869196c5-551b-4eef-b8d8-cca6f770a9b0",
|
||||
"source_id_original": "T02",
|
||||
"source_id_qualified": "LLM-WP-0005-T02"
|
||||
},
|
||||
{
|
||||
"source_id": "T03",
|
||||
"uuid": "ecf263d2-f40a-460e-9195-4e01135ef727",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0005-T03",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "869196c5-551b-4eef-b8d8-cca6f770a9b0",
|
||||
"source_id_original": "T03",
|
||||
"source_id_qualified": "LLM-WP-0005-T03"
|
||||
},
|
||||
{
|
||||
"source_id": "T04",
|
||||
"uuid": "f1860b10-7467-4ce3-9775-ab293cef3ed0",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0005-T04",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "869196c5-551b-4eef-b8d8-cca6f770a9b0",
|
||||
"source_id_original": "T04",
|
||||
"source_id_qualified": "LLM-WP-0005-T04"
|
||||
},
|
||||
{
|
||||
"source_id": "T05",
|
||||
"uuid": "950b74e9-ede8-477a-b6b7-c7af423d4ebb",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0005-T05",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "869196c5-551b-4eef-b8d8-cca6f770a9b0",
|
||||
"source_id_original": "T05",
|
||||
"source_id_qualified": "LLM-WP-0005-T05"
|
||||
},
|
||||
{
|
||||
"source_id": "T06",
|
||||
"uuid": "c47eca5f-4cb3-4f88-ac1b-38a9ae18e7e6",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0005-T06",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "869196c5-551b-4eef-b8d8-cca6f770a9b0",
|
||||
"source_id_original": "T06",
|
||||
"source_id_qualified": "LLM-WP-0005-T06"
|
||||
},
|
||||
{
|
||||
"source_id": "T07",
|
||||
"uuid": "c15fd1dc-48c3-40e9-abca-ba3ffe3684f9",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0005-T07",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "869196c5-551b-4eef-b8d8-cca6f770a9b0",
|
||||
"source_id_original": "T07",
|
||||
"source_id_qualified": "LLM-WP-0005-T07"
|
||||
},
|
||||
{
|
||||
"source_id": "T08",
|
||||
"uuid": "2993932a-334c-49f9-bb74-6ef4d3cbffcb",
|
||||
"source_status": "done",
|
||||
"hub_record_id": "LLM-WP-0005-T08",
|
||||
"hub_status": "done",
|
||||
"hub_parent": "869196c5-551b-4eef-b8d8-cca6f770a9b0",
|
||||
"source_id_original": "T08",
|
||||
"source_id_qualified": "LLM-WP-0005-T08"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
11
docs/evidence/2026-09-09-request-admission-quality.json
Normal file
11
docs/evidence/2026-09-09-request-admission-quality.json
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"baseline": {
|
||||
"ruff_errors": 177,
|
||||
"mypy_errors": 36
|
||||
},
|
||||
"current": {
|
||||
"ruff_errors": 177,
|
||||
"mypy_errors": 36
|
||||
},
|
||||
"unchanged_baseline": true
|
||||
}
|
||||
|
|
@ -15,7 +15,7 @@ import threading
|
|||
import time
|
||||
from dataclasses import asdict, dataclass
|
||||
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
|
||||
from typing import Protocol
|
||||
from typing import Any, NoReturn, Protocol, TypeGuard, cast
|
||||
from urllib.parse import urlsplit
|
||||
|
||||
|
||||
|
|
@ -23,11 +23,11 @@ class RequestRefused(RuntimeError):
|
|||
"""Bounded refusal; never carries request content or credentials."""
|
||||
|
||||
|
||||
def _integer(value: object, upper: int) -> bool:
|
||||
def _integer(value: object, upper: int) -> TypeGuard[int]:
|
||||
return type(value) is int and 0 < value <= upper
|
||||
|
||||
|
||||
def _unique(pairs):
|
||||
def _unique(pairs: list[tuple[str, Any]]) -> dict[str, Any]:
|
||||
result = {}
|
||||
for key, value in pairs:
|
||||
if key in result:
|
||||
|
|
@ -36,8 +36,8 @@ def _unique(pairs):
|
|||
return result
|
||||
|
||||
|
||||
def _json(raw: bytes):
|
||||
def invalid(_):
|
||||
def _json(raw: bytes) -> Any:
|
||||
def invalid(_: str) -> NoReturn:
|
||||
raise ValueError("nonfinite number")
|
||||
|
||||
return json.loads(raw, object_pairs_hook=_unique, parse_constant=invalid)
|
||||
|
|
@ -62,13 +62,13 @@ class MessagesPolicy:
|
|||
max_body_bytes: int = 2_000_000
|
||||
timeout_seconds: int = 120
|
||||
|
||||
def __post_init__(self):
|
||||
def __post_init__(self) -> None:
|
||||
for value in (self.tariff_ref, self.model):
|
||||
if not isinstance(value, str) or not re.fullmatch(
|
||||
r"[A-Za-z0-9][A-Za-z0-9._:/@+-]{0,199}", value
|
||||
):
|
||||
raise RequestRefused("invalid request policy identity")
|
||||
for value, upper in (
|
||||
for bound, upper in (
|
||||
(self.context_tokens, 10_000_000),
|
||||
(self.max_output_tokens, 1_000_000),
|
||||
(self.input_microusd_per_token, 1_000_000),
|
||||
|
|
@ -76,7 +76,7 @@ class MessagesPolicy:
|
|||
(self.max_body_bytes, 2_000_000),
|
||||
(self.timeout_seconds, 900),
|
||||
):
|
||||
if not _integer(value, upper):
|
||||
if not _integer(bound, upper):
|
||||
raise RequestRefused("invalid request policy bound")
|
||||
if not isinstance(self.allowed_betas, tuple) or len(set(self.allowed_betas)) != len(
|
||||
self.allowed_betas
|
||||
|
|
@ -128,7 +128,7 @@ class MessagesPolicy:
|
|||
}:
|
||||
raise RequestRefused("only keep-all thinking context admitted")
|
||||
|
||||
def cache(value):
|
||||
def cache(value: Any) -> None:
|
||||
if (
|
||||
not isinstance(value, dict)
|
||||
or set(value) - {"type", "ttl"}
|
||||
|
|
@ -137,7 +137,7 @@ class MessagesPolicy:
|
|||
):
|
||||
raise RequestRefused("cache mode not admitted")
|
||||
|
||||
def blocks(value, *, system=False, nested=False):
|
||||
def blocks(value: Any, *, system: bool = False, nested: bool = False) -> None:
|
||||
if isinstance(value, str):
|
||||
return
|
||||
if not isinstance(value, list) or len(value) > 10000:
|
||||
|
|
@ -259,12 +259,12 @@ class RequestMeter(Protocol):
|
|||
class _Stream:
|
||||
"""Observe terminal usage without persisting provider content."""
|
||||
|
||||
def __init__(self, policy: MessagesPolicy):
|
||||
def __init__(self, policy: MessagesPolicy) -> None:
|
||||
self.policy = policy
|
||||
self.started = self.stopped = self.delta = False
|
||||
self.usage = {}
|
||||
self.usage: dict[str, Any] = {}
|
||||
|
||||
def event(self, raw: bytes):
|
||||
def event(self, raw: bytes) -> None:
|
||||
data = b"\n".join(
|
||||
line[5:].lstrip() for line in raw.splitlines() if line.startswith(b"data:")
|
||||
)
|
||||
|
|
@ -304,7 +304,7 @@ class _Stream:
|
|||
):
|
||||
raise RequestRefused("provider content feature not admitted")
|
||||
|
||||
def _usage(self, value):
|
||||
def _usage(self, value: Any) -> None:
|
||||
if not isinstance(value, dict):
|
||||
raise RequestRefused("provider usage incomplete")
|
||||
for key, count in value.items():
|
||||
|
|
@ -323,7 +323,7 @@ class _Stream:
|
|||
def cost(self) -> int:
|
||||
if not self.stopped:
|
||||
raise RequestRefused("provider stream incomplete")
|
||||
counts = {}
|
||||
counts: dict[str, int] = {}
|
||||
for key in (
|
||||
"input_tokens",
|
||||
"output_tokens",
|
||||
|
|
@ -341,11 +341,15 @@ class _Stream:
|
|||
)
|
||||
|
||||
|
||||
class _OwnerHTTPServer(ThreadingHTTPServer):
|
||||
owner: MessagesServer
|
||||
|
||||
|
||||
class _Handler(BaseHTTPRequestHandler):
|
||||
def log_message(self, *args):
|
||||
def log_message(self, format: str, *args: Any) -> None:
|
||||
pass
|
||||
|
||||
def _error(self, status, code):
|
||||
def _error(self, status: int, code: str) -> None:
|
||||
raw = json.dumps(
|
||||
{"type": "error", "error": {"type": "invalid_request_error", "message": code}}
|
||||
).encode()
|
||||
|
|
@ -355,8 +359,8 @@ class _Handler(BaseHTTPRequestHandler):
|
|||
self.end_headers()
|
||||
self.wfile.write(raw)
|
||||
|
||||
def do_POST(self):
|
||||
owner = self.server.owner
|
||||
def do_POST(self) -> None:
|
||||
owner = cast(_OwnerHTTPServer, self.server).owner
|
||||
upstream = None
|
||||
sent = False
|
||||
try:
|
||||
|
|
@ -402,7 +406,9 @@ class _Handler(BaseHTTPRequestHandler):
|
|||
else http.client.HTTPConnection
|
||||
)
|
||||
upstream = kind(
|
||||
owner.endpoint.hostname, owner.endpoint.port, timeout=owner.policy.timeout_seconds
|
||||
cast(str, owner.endpoint.hostname),
|
||||
owner.endpoint.port,
|
||||
timeout=owner.policy.timeout_seconds,
|
||||
)
|
||||
headers = {
|
||||
"Content-Type": "application/json",
|
||||
|
|
@ -490,7 +496,7 @@ class MessagesServer:
|
|||
host: str = "127.0.0.1",
|
||||
port: int = 0,
|
||||
allow_test_http: bool = False,
|
||||
):
|
||||
) -> None:
|
||||
endpoint = urlsplit(upstream_url)
|
||||
if endpoint.scheme != "https" and not (
|
||||
allow_test_http
|
||||
|
|
@ -515,19 +521,19 @@ class MessagesServer:
|
|||
raise RequestRefused("explicit provider credential required")
|
||||
self.policy, self.meter, self.endpoint = policy, meter, endpoint
|
||||
self._provider_key = provider_key
|
||||
self._httpd = ThreadingHTTPServer((host, port), _Handler)
|
||||
self._httpd = _OwnerHTTPServer((host, port), _Handler)
|
||||
self._httpd.owner = self
|
||||
self._thread = None
|
||||
self._thread: threading.Thread | None = None
|
||||
|
||||
@property
|
||||
def port(self):
|
||||
return self._httpd.server_address[1]
|
||||
def port(self) -> int:
|
||||
return int(self._httpd.server_address[1])
|
||||
|
||||
def start(self):
|
||||
def start(self) -> None:
|
||||
self._thread = threading.Thread(target=self._httpd.serve_forever, daemon=True)
|
||||
self._thread.start()
|
||||
|
||||
def stop(self):
|
||||
def stop(self) -> None:
|
||||
if self._thread is not None:
|
||||
self._httpd.shutdown()
|
||||
self._thread.join()
|
||||
|
|
|
|||
|
|
@ -71,3 +71,31 @@ review compatibility of the exact CLI/beta combination against the actual
|
|||
provider before accepting a live profile. Local fake-provider evidence cannot
|
||||
close this task or establish a hard live EUR ceiling. Reuse GLAS-WP-0015 identity
|
||||
and native-delivery owner work; completed verifier CCRs are not reopened.
|
||||
|
||||
|
||||
Pre-release quality return: configured repository-wide checks expose 177 Ruff
|
||||
diagnostics and 36 mypy errors, reproduced identically at the original 00560945
|
||||
source baseline. The new transport adds none after its protocol types were
|
||||
completed. The 263 passing tests are not a claim of green full-repository CI.
|
||||
Resolve or explicitly disposition those existing checks before an owner accepts
|
||||
the protected artifact/release. Evidence:
|
||||
`docs/evidence/2026-09-09-request-admission-quality.json`.
|
||||
|
||||
## Repair historical source identities blocking primary synchronization
|
||||
|
||||
```task
|
||||
id: LLM-WP-0009-T04
|
||||
status: done
|
||||
priority: medium
|
||||
```
|
||||
|
||||
HFACT-WP-0001-T02 side quest: qualified 65 historical parent-local task IDs to
|
||||
match their already-existing Hub record IDs across five finished workplans.
|
||||
Preserved all workplan/task UUIDs, parent links, statuses and task content;
|
||||
qualified local references and retained an exact before/after mapping in
|
||||
`docs/evidence/2026-09-09-legacy-task-qualification.json`. This is source identity
|
||||
repair, not a UUID migration, record recreation or retirement. Six missing
|
||||
historical ad-hoc source bindings also resolve to existing matching Hub UUIDs;
|
||||
only Repo Manager's managed-field write may restore those pointers. The
|
||||
AGENTS.md versus registry prefix disagreement remains a future-instruction
|
||||
issue; published workplan IDs are unchanged.
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ and state-hub housekeeping.
|
|||
## Tasks
|
||||
|
||||
```task
|
||||
id: T01
|
||||
id: LLM-WP-0001-T01
|
||||
title: 'Create SCOPE.md'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -36,7 +36,7 @@ state_hub_task_id: "c38c5a79-4ce5-4088-9a21-ac65e09b12ba"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T02
|
||||
id: LLM-WP-0001-T02
|
||||
title: 'Fill .claude/rules/ stubs: architecture.md, stack-and-commands.md, repo-boundary.md'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -44,7 +44,7 @@ state_hub_task_id: "6a15c794-d0f7-4d9c-a3ac-850f8c5bd5e9"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T03
|
||||
id: LLM-WP-0001-T03
|
||||
title: 'Create ARCHITECTURE-LAYERS.md with layer map, scorecard stub, next-review date'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -52,7 +52,7 @@ state_hub_task_id: "af1c63ac-e4be-495a-9fdb-68eddebfcb75"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T04
|
||||
id: LLM-WP-0001-T04
|
||||
title: 'Create /contracts/ tree (core/, functional/, config/)'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -60,7 +60,7 @@ state_hub_task_id: "da5a7986-5c47-4c4c-a8f6-a58956127535"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T05
|
||||
id: LLM-WP-0001-T05
|
||||
title: 'Core contract doc: LLMAdapter interface invariants, RunConfig/LLMResponse field contracts'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -68,7 +68,7 @@ state_hub_task_id: "01237203-0582-4bc4-a308-075e991e8e99"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T06
|
||||
id: LLM-WP-0001-T06
|
||||
title: 'Functional contract stubs for all 4 adapters + embedding adapters (maturity: Beta)'
|
||||
priority: medium
|
||||
status: done
|
||||
|
|
@ -76,7 +76,7 @@ state_hub_task_id: "2bee5174-d3d7-4267-9cee-6e0e9b5cc731"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T07
|
||||
id: LLM-WP-0001-T07
|
||||
title: 'Create tests/ with conftest.py, wire pytest in pyproject.toml'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -84,7 +84,7 @@ state_hub_task_id: "b6dccf3e-8742-486e-a6a7-82577866a3bc"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T08
|
||||
id: LLM-WP-0001-T08
|
||||
title: 'Unit tests: RunConfig, LLMResponse, MockLLMAdapter, full exception hierarchy'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -92,7 +92,7 @@ state_hub_task_id: "cc05b67d-f956-458a-908f-2ff58b1d33d3"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T09
|
||||
id: LLM-WP-0001-T09
|
||||
title: 'Unit tests: create_adapter (all providers + unknown provider error), create_embedding_adapter'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -100,7 +100,7 @@ state_hub_task_id: "8f9ec054-79ab-411d-8204-9d764bbbed98"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T10
|
||||
id: LLM-WP-0001-T10
|
||||
title: 'Add ruff, mypy to dev deps in pyproject.toml'
|
||||
priority: medium
|
||||
status: done
|
||||
|
|
@ -108,7 +108,7 @@ state_hub_task_id: "044ee879-6baa-42fd-a0a4-a43dac0eacbb"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T11
|
||||
id: LLM-WP-0001-T11
|
||||
title: 'CI workflow: pytest + ruff + mypy'
|
||||
priority: medium
|
||||
status: done
|
||||
|
|
@ -116,7 +116,7 @@ state_hub_task_id: "699eef00-e9df-4de0-b7e6-61cfaace9617"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T12
|
||||
id: LLM-WP-0001-T12
|
||||
title: 'State hub: register this host path, SBOM refresh'
|
||||
priority: low
|
||||
status: done
|
||||
|
|
@ -125,18 +125,18 @@ state_hub_task_id: "c0853a23-52ae-499e-9a49-e7b65749b508"
|
|||
|
||||
| ID | Title | Priority | Status |
|
||||
|-----|-------|----------|--------|
|
||||
| T01 | Create `SCOPE.md` | high | done |
|
||||
| T02 | Fill `.claude/rules/` stubs: `architecture.md`, `stack-and-commands.md`, `repo-boundary.md` | high | done |
|
||||
| T03 | Create `ARCHITECTURE-LAYERS.md` with layer map, scorecard stub, next-review date | high | done |
|
||||
| T04 | Create `/contracts/` tree (`core/`, `functional/`, `config/`) | high | done |
|
||||
| T05 | Core contract doc: `LLMAdapter` interface invariants, `RunConfig`/`LLMResponse` field contracts | high | done |
|
||||
| T06 | Functional contract stubs for all 4 adapters + embedding adapters (maturity: Beta) | medium | done |
|
||||
| T07 | Create `tests/` with `conftest.py`, wire pytest in `pyproject.toml` | high | done |
|
||||
| T08 | Unit tests: `RunConfig`, `LLMResponse`, `MockLLMAdapter`, full exception hierarchy | high | done |
|
||||
| T09 | Unit tests: `create_adapter` (all providers + unknown provider error), `create_embedding_adapter` | high | done |
|
||||
| T10 | Add `ruff`, `mypy` to dev deps in `pyproject.toml` | medium | done |
|
||||
| T11 | CI workflow: pytest + ruff + mypy | medium | done |
|
||||
| T12 | State hub: register this host path, SBOM refresh | low | done |
|
||||
| LLM-WP-0001-T01 | Create `SCOPE.md` | high | done |
|
||||
| LLM-WP-0001-T02 | Fill `.claude/rules/` stubs: `architecture.md`, `stack-and-commands.md`, `repo-boundary.md` | high | done |
|
||||
| LLM-WP-0001-T03 | Create `ARCHITECTURE-LAYERS.md` with layer map, scorecard stub, next-review date | high | done |
|
||||
| LLM-WP-0001-T04 | Create `/contracts/` tree (`core/`, `functional/`, `config/`) | high | done |
|
||||
| LLM-WP-0001-T05 | Core contract doc: `LLMAdapter` interface invariants, `RunConfig`/`LLMResponse` field contracts | high | done |
|
||||
| LLM-WP-0001-T06 | Functional contract stubs for all 4 adapters + embedding adapters (maturity: Beta) | medium | done |
|
||||
| LLM-WP-0001-T07 | Create `tests/` with `conftest.py`, wire pytest in `pyproject.toml` | high | done |
|
||||
| LLM-WP-0001-T08 | Unit tests: `RunConfig`, `LLMResponse`, `MockLLMAdapter`, full exception hierarchy | high | done |
|
||||
| LLM-WP-0001-T09 | Unit tests: `create_adapter` (all providers + unknown provider error), `create_embedding_adapter` | high | done |
|
||||
| LLM-WP-0001-T10 | Add `ruff`, `mypy` to dev deps in `pyproject.toml` | medium | done |
|
||||
| LLM-WP-0001-T11 | CI workflow: pytest + ruff + mypy | medium | done |
|
||||
| LLM-WP-0001-T12 | State hub: register this host path, SBOM refresh | low | done |
|
||||
|
||||
## Exit criteria
|
||||
|
||||
|
|
|
|||
|
|
@ -38,12 +38,12 @@ Both changes are Core-layer modifications under GAAF-2026:
|
|||
`asyncio.get_event_loop().run_in_executor(None, ...)` fallback so existing
|
||||
adapters remain valid; native async overrides are provided per adapter.
|
||||
|
||||
Core contract doc (from WP-0001 T05) must be updated after each change.
|
||||
Core contract doc (from LLM-WP-0001-T05) must be updated after each change.
|
||||
|
||||
## Tasks
|
||||
|
||||
```task
|
||||
id: T01
|
||||
id: LLM-WP-0002-T01
|
||||
title: 'BudgetTracker dataclass: total, spent, remaining(), thread-safe increment'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -51,7 +51,7 @@ state_hub_task_id: "ae27c363-339a-4f78-9737-cf872698f6d8"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T02
|
||||
id: LLM-WP-0002-T02
|
||||
title: 'LLMBudgetExceededError(LLMError) in exceptions.py'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -59,7 +59,7 @@ state_hub_task_id: "ea6f6ef7-2cb2-48e2-b9c9-f2b84a1a242b"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T03
|
||||
id: LLM-WP-0002-T03
|
||||
title: 'Optional budget_tracker field on RunConfig'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -67,7 +67,7 @@ state_hub_task_id: "fe6dbb73-5d04-45e6-aa91-5eff79aae7ee"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T04
|
||||
id: LLM-WP-0002-T04
|
||||
title: 'Enforcement: adapters check/update tracker, raise LLMBudgetExceededError when exceeded'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -75,7 +75,7 @@ state_hub_task_id: "8fd21bc2-598e-4449-8c86-eacde760e23f"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T05
|
||||
id: LLM-WP-0002-T05
|
||||
title: 'Update Core contract doc for BudgetTracker and RunConfig changes'
|
||||
priority: medium
|
||||
status: done
|
||||
|
|
@ -83,7 +83,7 @@ state_hub_task_id: "e15745f5-9bb7-45d6-a36b-3a345fb0e9f1"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T06
|
||||
id: LLM-WP-0002-T06
|
||||
title: 'Tests: single call, delegation chain, exceeded error, multi-adapter shared tracker'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -91,7 +91,7 @@ state_hub_task_id: "5af37ade-3dd0-4ce9-8ead-be9887913bab"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T07
|
||||
id: LLM-WP-0002-T07
|
||||
title: 'Add async_execute_prompt to LLMAdapter ABC with default executor fallback'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -99,7 +99,7 @@ state_hub_task_id: "e221e630-658f-4adb-9f00-7b7df7ab8cb4"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T08
|
||||
id: LLM-WP-0002-T08
|
||||
title: 'Native async override in OpenAIAdapter, GeminiAdapter, OpenRouterAdapter'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -107,7 +107,7 @@ state_hub_task_id: "a75c2b2a-e4ef-4cbd-9c5f-7e98c8d3d7e8"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T09
|
||||
id: LLM-WP-0002-T09
|
||||
title: 'Native async for ClaudeCodeAdapter via asyncio.create_subprocess_exec'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -115,7 +115,7 @@ state_hub_task_id: "1c50889f-28ed-4c6e-a788-1fc7dcc5a2c3"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T10
|
||||
id: LLM-WP-0002-T10
|
||||
title: 'Update Core contract doc for async_execute_prompt'
|
||||
priority: medium
|
||||
status: done
|
||||
|
|
@ -123,7 +123,7 @@ state_hub_task_id: "fa4f9e80-ddee-4d05-a239-fe09e633b0cb"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T11
|
||||
id: LLM-WP-0002-T11
|
||||
title: 'Tests: asyncio.gather over N adapters, timeout propagation, budget interaction'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -134,22 +134,22 @@ state_hub_task_id: "bca78609-7f7c-4548-8857-a72e4c760dc6"
|
|||
|
||||
| ID | Title | Priority | Status |
|
||||
|-----|-------|----------|--------|
|
||||
| T01 | `BudgetTracker` dataclass: `total`, `spent`, `remaining()`, thread-safe increment | high | done |
|
||||
| T02 | `LLMBudgetExceededError(LLMError)` in `exceptions.py` | high | done |
|
||||
| T03 | Optional `budget_tracker: BudgetTracker \| None` field on `RunConfig` | high | done |
|
||||
| T04 | Enforcement: each adapter checks/updates tracker around call; raises on exceeded | high | done |
|
||||
| T05 | Update Core contract doc | medium | done |
|
||||
| T06 | Tests: single call, delegation chain (A→B→C shared tracker), exceeded error, multi-adapter | high | done |
|
||||
| LLM-WP-0002-T01 | `BudgetTracker` dataclass: `total`, `spent`, `remaining()`, thread-safe increment | high | done |
|
||||
| LLM-WP-0002-T02 | `LLMBudgetExceededError(LLMError)` in `exceptions.py` | high | done |
|
||||
| LLM-WP-0002-T03 | Optional `budget_tracker: BudgetTracker \| None` field on `RunConfig` | high | done |
|
||||
| LLM-WP-0002-T04 | Enforcement: each adapter checks/updates tracker around call; raises on exceeded | high | done |
|
||||
| LLM-WP-0002-T05 | Update Core contract doc | medium | done |
|
||||
| LLM-WP-0002-T06 | Tests: single call, delegation chain (A→B→C shared tracker), exceeded error, multi-adapter | high | done |
|
||||
|
||||
### FR-3 — async_execute_prompt
|
||||
|
||||
| ID | Title | Priority | Status |
|
||||
|-----|-------|----------|--------|
|
||||
| T07 | Add `async_execute_prompt` to `LLMAdapter` ABC with default executor fallback | high | done |
|
||||
| T08 | Native async override in `OpenAIAdapter`, `GeminiAdapter`, `OpenRouterAdapter` | high | done |
|
||||
| T09 | Native async for `ClaudeCodeAdapter` via `asyncio.create_subprocess_exec` | high | done |
|
||||
| T10 | Update Core contract doc | medium | done |
|
||||
| T11 | Tests: `asyncio.gather` over N adapters, timeout propagation, budget interaction | high | done |
|
||||
| LLM-WP-0002-T07 | Add `async_execute_prompt` to `LLMAdapter` ABC with default executor fallback | high | done |
|
||||
| LLM-WP-0002-T08 | Native async override in `OpenAIAdapter`, `GeminiAdapter`, `OpenRouterAdapter` | high | done |
|
||||
| LLM-WP-0002-T09 | Native async for `ClaudeCodeAdapter` via `asyncio.create_subprocess_exec` | high | done |
|
||||
| LLM-WP-0002-T10 | Update Core contract doc | medium | done |
|
||||
| LLM-WP-0002-T11 | Tests: `asyncio.gather` over N adapters, timeout propagation, budget interaction | high | done |
|
||||
|
||||
## Exit criteria
|
||||
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ Both additions are Functional-layer under GAAF-2026:
|
|||
## Tasks
|
||||
|
||||
```task
|
||||
id: T01
|
||||
id: LLM-WP-0003-T01
|
||||
title: 'RoutingPolicy data model: rules list with task_type, prefer, max_cost_per_1k, fallback'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -45,7 +45,7 @@ state_hub_task_id: "85cf92fd-cddd-4e19-8782-970f6480a37f"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T02
|
||||
id: LLM-WP-0003-T02
|
||||
title: 'policy.resolve(task_type) returns configured LLMAdapter'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -53,7 +53,7 @@ state_hub_task_id: "352701ce-4b21-4f5d-a22e-462136e58fd2"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T03
|
||||
id: LLM-WP-0003-T03
|
||||
title: 'Export RoutingPolicy from llm_connect.__init__ and update __all__'
|
||||
priority: medium
|
||||
status: done
|
||||
|
|
@ -61,7 +61,7 @@ state_hub_task_id: "baeb9b39-7fee-4f2b-86cc-ce64ff9e9b95"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T04
|
||||
id: LLM-WP-0003-T04
|
||||
title: 'Functional contract doc for RoutingPolicy'
|
||||
priority: medium
|
||||
status: done
|
||||
|
|
@ -69,7 +69,7 @@ state_hub_task_id: "aa4488c6-950e-4cea-99b1-89defa4677ce"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T05
|
||||
id: LLM-WP-0003-T05
|
||||
title: 'Tests: rule match, cost-cap fallback, unknown task_type fallback, no-match default'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -77,7 +77,7 @@ state_hub_task_id: "a4ad9c9e-64a4-44f0-85f3-b9cfe9ef59f7"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T06
|
||||
id: LLM-WP-0003-T06
|
||||
title: 'Design /execute JSON schema (request: provider, model, prompt, config; response: LLMResponse)'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -85,7 +85,7 @@ state_hub_task_id: "cf79bce2-8d1a-4708-90b2-5e6569908b14"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T07
|
||||
id: LLM-WP-0003-T07
|
||||
title: 'Implement llm_connect/server.py: POST /execute, GET /health'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -93,7 +93,7 @@ state_hub_task_id: "c91964ab-7366-4b34-acd4-1ee12f96881e"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T08
|
||||
id: LLM-WP-0003-T08
|
||||
title: 'python -m llm_connect.server --port N --provider X --model Y CLI entry point'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -101,7 +101,7 @@ state_hub_task_id: "e3115bb4-cf3b-4ca0-9992-136e317068ac"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T09
|
||||
id: LLM-WP-0003-T09
|
||||
title: 'Add server optional dep (httpx or aiohttp) to pyproject.toml'
|
||||
priority: medium
|
||||
status: done
|
||||
|
|
@ -109,7 +109,7 @@ state_hub_task_id: "2caf5531-8e10-40e9-a595-8652882a10e0"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T10
|
||||
id: LLM-WP-0003-T10
|
||||
title: 'Functional contract doc: HTTP API schema (request/response shapes, error codes)'
|
||||
priority: medium
|
||||
status: done
|
||||
|
|
@ -117,7 +117,7 @@ state_hub_task_id: "dc3c81c2-698d-4fee-b1dd-1af156a4276f"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T11
|
||||
id: LLM-WP-0003-T11
|
||||
title: 'Tests: server POST round-trip (MockAdapter), GET /health, error responses'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -128,22 +128,22 @@ state_hub_task_id: "848a1622-abdd-4938-8bb4-3da27f5f9867"
|
|||
|
||||
| ID | Title | Priority | Status |
|
||||
|-----|-------|----------|--------|
|
||||
| T01 | `RoutingPolicy` data model: `rules` list with `task_type`, `prefer`, `max_cost_per_1k`, `fallback` | high | done |
|
||||
| T02 | `policy.resolve(task_type)` → returns configured `LLMAdapter` | high | done |
|
||||
| T03 | Export from `llm_connect.__init__` and update `__all__` | medium | done |
|
||||
| T04 | Functional contract doc for `RoutingPolicy` | medium | done |
|
||||
| T05 | Tests: rule match, cost-cap fallback, unknown task_type fallback, no-match default | high | done |
|
||||
| LLM-WP-0003-T01 | `RoutingPolicy` data model: `rules` list with `task_type`, `prefer`, `max_cost_per_1k`, `fallback` | high | done |
|
||||
| LLM-WP-0003-T02 | `policy.resolve(task_type)` → returns configured `LLMAdapter` | high | done |
|
||||
| LLM-WP-0003-T03 | Export from `llm_connect.__init__` and update `__all__` | medium | done |
|
||||
| LLM-WP-0003-T04 | Functional contract doc for `RoutingPolicy` | medium | done |
|
||||
| LLM-WP-0003-T05 | Tests: rule match, cost-cap fallback, unknown task_type fallback, no-match default | high | done |
|
||||
|
||||
### FR-1 — HTTP serve mode
|
||||
|
||||
| ID | Title | Priority | Status |
|
||||
|-----|-------|----------|--------|
|
||||
| T06 | Design `/execute` JSON schema (request: provider, model, prompt, config; response: LLMResponse fields) | high | done |
|
||||
| T07 | Implement `llm_connect/server.py` — minimal HTTP server, `POST /execute`, `GET /health` | high | done |
|
||||
| T08 | `python -m llm_connect.server --port N --provider X --model Y` CLI entry point | high | done |
|
||||
| T09 | Add `httpx` or `aiohttp` server dep under `[project.optional-dependencies] server` | medium | done |
|
||||
| T10 | Functional contract doc (API schema — request/response shapes, error codes) | medium | done |
|
||||
| T11 | Tests: spin up server in subprocess or via `TestClient`, POST round-trip (MockAdapter), error responses | high | done |
|
||||
| LLM-WP-0003-T06 | Design `/execute` JSON schema (request: provider, model, prompt, config; response: LLMResponse fields) | high | done |
|
||||
| LLM-WP-0003-T07 | Implement `llm_connect/server.py` — minimal HTTP server, `POST /execute`, `GET /health` | high | done |
|
||||
| LLM-WP-0003-T08 | `python -m llm_connect.server --port N --provider X --model Y` CLI entry point | high | done |
|
||||
| LLM-WP-0003-T09 | Add `httpx` or `aiohttp` server dep under `[project.optional-dependencies] server` | medium | done |
|
||||
| LLM-WP-0003-T10 | Functional contract doc (API schema — request/response shapes, error codes) | medium | done |
|
||||
| LLM-WP-0003-T11 | Tests: spin up server in subprocess or via `TestClient`, POST round-trip (MockAdapter), error responses | high | done |
|
||||
|
||||
## Exit criteria
|
||||
|
||||
|
|
|
|||
|
|
@ -78,7 +78,7 @@ The fenced `task` blocks below are the State Hub registration index. Keep them
|
|||
in sync with the detailed task tables that follow.
|
||||
|
||||
```task
|
||||
id: T01
|
||||
id: LLM-WP-0004-T01
|
||||
title: 'QualityObservation dataclass: task_type, adapter_id, model_id, cost_usd, quality_score (0..1), latency_ms, tokens_in, tokens_out, baseline_adapter_id, recorded_at, tags'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -86,7 +86,7 @@ state_hub_task_id: "1c285bec-c30b-45a8-a408-3f91d810a078"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T02
|
||||
id: LLM-WP-0004-T02
|
||||
title: 'QualityLedger append-only JSONL store with file-locked writes, configurable path, simple query helpers (by_task_type, recent, mean_quality)'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -94,7 +94,7 @@ state_hub_task_id: "5249f171-a047-499f-9ec4-cb50e1477765"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T03
|
||||
id: LLM-WP-0004-T03
|
||||
title: 'TTL helpers: prune_before(timestamp) and is_stale(observation, max_age)'
|
||||
priority: medium
|
||||
status: done
|
||||
|
|
@ -102,7 +102,7 @@ state_hub_task_id: "adb255cf-7e89-4fea-b822-6be437d99789"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T04
|
||||
id: LLM-WP-0004-T04
|
||||
title: 'Functional contract doc for the ledger schema and quality_score semantics'
|
||||
priority: medium
|
||||
status: done
|
||||
|
|
@ -110,7 +110,7 @@ state_hub_task_id: "51a33180-a99d-4aa4-96be-2fcee15bfbc3"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T05
|
||||
id: LLM-WP-0004-T05
|
||||
title: 'Tests: ledger round-trip, concurrent writes, query helpers, TTL, malformed-line resilience'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -118,7 +118,7 @@ state_hub_task_id: "458610c5-c903-4b42-9602-cd511999c9ba"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T06
|
||||
id: LLM-WP-0004-T06
|
||||
title: 'GradingResult dataclass: quality_score, notes, grader_id, baseline_response, candidate_response'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -126,7 +126,7 @@ state_hub_task_id: "c12a595b-90fc-4a80-8394-549edbda2031"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T07
|
||||
id: LLM-WP-0004-T07
|
||||
title: 'BaselineGrader protocol plus PairedGrader that runs baseline and candidate calls and delegates to a Judge'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -134,7 +134,7 @@ state_hub_task_id: "80b98e31-06fc-4462-b030-a12881095f93"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T08
|
||||
id: LLM-WP-0004-T08
|
||||
title: 'Judge protocol and built-ins: ExactMatchJudge, EmbeddingSimilarityJudge, LLMJudge'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -142,7 +142,7 @@ state_hub_task_id: "c2887fe3-bae6-4298-8c26-f9a519264dcf"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T09
|
||||
id: LLM-WP-0004-T09
|
||||
title: 'Functional contract doc covering judge bias caveats'
|
||||
priority: medium
|
||||
status: done
|
||||
|
|
@ -150,7 +150,7 @@ state_hub_task_id: "7a4fd87a-b0ba-41b0-8e1a-a60fdaded905"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T10
|
||||
id: LLM-WP-0004-T10
|
||||
title: 'Tests: judges with canned inputs, stable grader result, deterministic LLMJudge rubric seed'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -158,7 +158,7 @@ state_hub_task_id: "8415a11d-d508-4d17-8082-10f93e9d16c5"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T11
|
||||
id: LLM-WP-0004-T11
|
||||
title: 'AdaptiveRoutingPolicy extends RoutingPolicy and selects the cheapest adapter whose observed mean quality clears the floor'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -166,7 +166,7 @@ state_hub_task_id: "0e9f9f8e-5066-4257-913b-a19f5b3fc47d"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T12
|
||||
id: LLM-WP-0004-T12
|
||||
title: 'Tie-breaking: prefer lower observed cost, then explicit preferred adapter from static rules'
|
||||
priority: medium
|
||||
status: done
|
||||
|
|
@ -174,7 +174,7 @@ state_hub_task_id: "59d44712-1088-41ac-bad8-5d95db6f3a4f"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T13
|
||||
id: LLM-WP-0004-T13
|
||||
title: 'Cold-start behaviour falls through to static RoutingPolicy.resolve when observations are missing'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -182,7 +182,7 @@ state_hub_task_id: "1927d369-f5f6-48d3-8f53-7e4f1cae370e"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T14
|
||||
id: LLM-WP-0004-T14
|
||||
title: 'Functional contract doc for adaptive policy and sample-size/freshness trade-off'
|
||||
priority: medium
|
||||
status: done
|
||||
|
|
@ -190,7 +190,7 @@ state_hub_task_id: "4d4717c1-8849-4fed-8f8d-515901ecafe0"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T15
|
||||
id: LLM-WP-0004-T15
|
||||
title: 'Tests: floor enforcement, tie-break, cold-start, window-size effect, fallback chain'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -198,7 +198,7 @@ state_hub_task_id: "304bd782-db15-4b7a-8d05-49e064a926c3"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T16
|
||||
id: LLM-WP-0004-T16
|
||||
title: 'ShadowingAdapter wraps a candidate adapter, also invokes the baseline adapter, grades, and appends to QualityLedger'
|
||||
priority: medium
|
||||
status: done
|
||||
|
|
@ -206,7 +206,7 @@ state_hub_task_id: "62dd507f-536a-4623-8cbd-fa9f78e85ca6"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T17
|
||||
id: LLM-WP-0004-T17
|
||||
title: 'Sampling: caller-configurable shadow_rate so production load is not doubled'
|
||||
priority: medium
|
||||
status: done
|
||||
|
|
@ -214,7 +214,7 @@ state_hub_task_id: "ccb73e92-1fca-42f9-8437-9b2b50e6424c"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T18
|
||||
id: LLM-WP-0004-T18
|
||||
title: 'Failure isolation: shadow errors never affect the candidate response returned to the caller'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -222,7 +222,7 @@ state_hub_task_id: "b879d232-d6ce-4ff6-b534-616729ea5ad7"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T19
|
||||
id: LLM-WP-0004-T19
|
||||
title: 'Functional contract doc for ShadowingAdapter'
|
||||
priority: low
|
||||
status: done
|
||||
|
|
@ -230,7 +230,7 @@ state_hub_task_id: "99d2c1bc-f1d8-42b3-9e04-6eea49460943"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T20
|
||||
id: LLM-WP-0004-T20
|
||||
title: 'Tests: candidate response survives baseline failure, ledger sampling rate, sync vs async modes'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -238,7 +238,7 @@ state_hub_task_id: "f533fbf4-484f-4408-8260-7e84e23bdc46"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T21
|
||||
id: LLM-WP-0004-T21
|
||||
title: 'Example script: route fixture batch through three candidate adapters and populate the ledger'
|
||||
priority: medium
|
||||
status: done
|
||||
|
|
@ -246,7 +246,7 @@ state_hub_task_id: "7ef0c143-74b0-4740-81fa-819a826cf8f3"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T22
|
||||
id: LLM-WP-0004-T22
|
||||
title: 'Integration test: cold-start, static fallback, first observations, convergence to cheapest qualifying adapter'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -254,61 +254,61 @@ state_hub_task_id: "c4c6743f-157b-4445-8576-9caa6421d463"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T23
|
||||
id: LLM-WP-0004-T23
|
||||
title: 'Consumer integration guide showing how infospace-bench wires task types into adaptive policy'
|
||||
priority: medium
|
||||
status: done
|
||||
state_hub_task_id: "3a073ff7-0170-4a95-9c2a-a5daa84964e6"
|
||||
```
|
||||
|
||||
### T01 — Quality observation data model + ledger
|
||||
### LLM-WP-0004-T01 — Quality observation data model + ledger
|
||||
|
||||
| ID | Title | Priority | Status |
|
||||
|-----|------------------------------------
|
||||
---------------------------------------------------------------------------------------------------------------------------------------------------------|----------|--------|
|
||||
| T01 | `QualityObservation` dataclass: `task_type`, `adapter_id`, `model_id`, `cost_usd`, `quality_score` (0..1), `latency_ms`, `tokens_in`, `tokens_out`, `baseline_adapter_id`, `recorded_at`, `tags` | high | done |
|
||||
| T02 | `QualityLedger` append-only JSONL store with file-locked writes, configurable path, simple query helpers (`by_task_type`, `recent`, `mean_quality`) | high | done |
|
||||
| T03 | TTL helpers: `prune_before(timestamp)` and `is_stale(observation, max_age)` so callers can refresh observations without re-reading the whole ledger | medium | done |
|
||||
| T04 | Functional contract doc for the ledger schema and the field semantics of `quality_score` | medium | done |
|
||||
| T05 | Tests: round-trip, concurrent writes, query helpers, TTL, malformed-line resilience | high | done |
|
||||
| LLM-WP-0004-T01 | `QualityObservation` dataclass: `task_type`, `adapter_id`, `model_id`, `cost_usd`, `quality_score` (0..1), `latency_ms`, `tokens_in`, `tokens_out`, `baseline_adapter_id`, `recorded_at`, `tags` | high | done |
|
||||
| LLM-WP-0004-T02 | `QualityLedger` append-only JSONL store with file-locked writes, configurable path, simple query helpers (`by_task_type`, `recent`, `mean_quality`) | high | done |
|
||||
| LLM-WP-0004-T03 | TTL helpers: `prune_before(timestamp)` and `is_stale(observation, max_age)` so callers can refresh observations without re-reading the whole ledger | medium | done |
|
||||
| LLM-WP-0004-T04 | Functional contract doc for the ledger schema and the field semantics of `quality_score` | medium | done |
|
||||
| LLM-WP-0004-T05 | Tests: round-trip, concurrent writes, query helpers, TTL, malformed-line resilience | high | done |
|
||||
|
||||
### T02 — Baseline grader
|
||||
### LLM-WP-0004-T02 — Baseline grader
|
||||
|
||||
| ID | Title | Priority | Status |
|
||||
|-----|----------------------------------------------------------------------------------------------------------------------------------------------------|----------|--------|
|
||||
| T06 | `GradingResult` dataclass: `quality_score`, `notes`, `grader_id`, `baseline_response`, `candidate_response` | high | done |
|
||||
| T07 | `BaselineGrader` protocol: `.grade(baseline_adapter, candidate_adapter, prompt, run_config)` → `GradingResult`; built-in concrete `PairedGrader` runs both calls and delegates to a `Judge` | high | done |
|
||||
| T08 | `Judge` protocol + three built-ins: `ExactMatchJudge`, `EmbeddingSimilarityJudge` (uses an embedding adapter), `LLMJudge` (uses a third adapter with a fixed rubric prompt) | high | done |
|
||||
| T09 | Functional contract doc covering judge bias caveats (length bias, format bias, position bias for `LLMJudge`) | medium | done |
|
||||
| T10 | Tests: each judge against canned inputs, grader emits stable result with both responses preserved, deterministic seed for `LLMJudge` rubric | high | done |
|
||||
| LLM-WP-0004-T06 | `GradingResult` dataclass: `quality_score`, `notes`, `grader_id`, `baseline_response`, `candidate_response` | high | done |
|
||||
| LLM-WP-0004-T07 | `BaselineGrader` protocol: `.grade(baseline_adapter, candidate_adapter, prompt, run_config)` → `GradingResult`; built-in concrete `PairedGrader` runs both calls and delegates to a `Judge` | high | done |
|
||||
| LLM-WP-0004-T08 | `Judge` protocol + three built-ins: `ExactMatchJudge`, `EmbeddingSimilarityJudge` (uses an embedding adapter), `LLMJudge` (uses a third adapter with a fixed rubric prompt) | high | done |
|
||||
| LLM-WP-0004-T09 | Functional contract doc covering judge bias caveats (length bias, format bias, position bias for `LLMJudge`) | medium | done |
|
||||
| LLM-WP-0004-T10 | Tests: each judge against canned inputs, grader emits stable result with both responses preserved, deterministic seed for `LLMJudge` rubric | high | done |
|
||||
|
||||
### T03 — Adaptive routing policy
|
||||
### LLM-WP-0004-T03 — Adaptive routing policy
|
||||
|
||||
| ID | Title | Priority | Status |
|
||||
|-----|--------------------------------------------------------------------------------------------------------------------------------------------------|----------|--------|
|
||||
| T11 | `AdaptiveRoutingPolicy` extends `RoutingPolicy`: given `task_type` + `quality_floor` + `ledger`, returns the cheapest adapter whose observed mean quality clears the floor over a configurable window | high | done |
|
||||
| T12 | Tie-breaking: when two adapters meet the floor, prefer lower observed cost; if still tied, prefer the explicitly-preferred adapter from the underlying static rules | medium | done |
|
||||
| T13 | Cold-start behaviour: when no observations exist for a `(task_type, adapter)` pair, fall through to the static `RoutingPolicy.resolve` result so the system stays usable on day zero | high | done |
|
||||
| T14 | Functional contract doc; document the trade-off between sample size and freshness | medium | done |
|
||||
| T15 | Tests: floor enforcement, tie-break, cold-start, window-size effect, fallback chain | high | done |
|
||||
| LLM-WP-0004-T11 | `AdaptiveRoutingPolicy` extends `RoutingPolicy`: given `task_type` + `quality_floor` + `ledger`, returns the cheapest adapter whose observed mean quality clears the floor over a configurable window | high | done |
|
||||
| LLM-WP-0004-T12 | Tie-breaking: when two adapters meet the floor, prefer lower observed cost; if still tied, prefer the explicitly-preferred adapter from the underlying static rules | medium | done |
|
||||
| LLM-WP-0004-T13 | Cold-start behaviour: when no observations exist for a `(task_type, adapter)` pair, fall through to the static `RoutingPolicy.resolve` result so the system stays usable on day zero | high | done |
|
||||
| LLM-WP-0004-T14 | Functional contract doc; document the trade-off between sample size and freshness | medium | done |
|
||||
| LLM-WP-0004-T15 | Tests: floor enforcement, tie-break, cold-start, window-size effect, fallback chain | high | done |
|
||||
|
||||
### T04 — Shadow-mode observation wrapper
|
||||
### LLM-WP-0004-T04 — Shadow-mode observation wrapper
|
||||
|
||||
| ID | Title | Priority | Status |
|
||||
|-----|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------|--------|
|
||||
| T16 | `ShadowingAdapter` wraps a candidate adapter; on each call, also invokes the baseline adapter (sync or via a thread pool), grades, and appends to a `QualityLedger` | medium | done |
|
||||
| T17 | Sampling: caller-configurable fraction (`shadow_rate=0.1` means grade one call in ten) so production load is not doubled | medium | done |
|
||||
| T18 | Failure isolation: shadow errors never affect the candidate response returned to the caller; failures are logged but not raised | high | done |
|
||||
| T19 | Functional contract doc | low | done |
|
||||
| T20 | Tests: candidate response always returned even when baseline raises, ledger gets exactly `shadow_rate × calls` entries (within tolerance), sync vs async modes | high | done |
|
||||
| LLM-WP-0004-T16 | `ShadowingAdapter` wraps a candidate adapter; on each call, also invokes the baseline adapter (sync or via a thread pool), grades, and appends to a `QualityLedger` | medium | done |
|
||||
| LLM-WP-0004-T17 | Sampling: caller-configurable fraction (`shadow_rate=0.1` means grade one call in ten) so production load is not doubled | medium | done |
|
||||
| LLM-WP-0004-T18 | Failure isolation: shadow errors never affect the candidate response returned to the caller; failures are logged but not raised | high | done |
|
||||
| LLM-WP-0004-T19 | Functional contract doc | low | done |
|
||||
| LLM-WP-0004-T20 | Tests: candidate response always returned even when baseline raises, ledger gets exactly `shadow_rate × calls` entries (within tolerance), sync vs async modes | high | done |
|
||||
|
||||
### T05 — End-to-end example + integration test
|
||||
### LLM-WP-0004-T05 — End-to-end example + integration test
|
||||
|
||||
| ID | Title | Priority | Status |
|
||||
|-----|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------|--------|
|
||||
| T21 | Example script: route a small fixture batch through three candidate adapters (one OpenRouter cheap, one OpenRouter mid, `ClaudeCodeAdapter` as baseline), grade each, populate ledger | medium | done |
|
||||
| T22 | Integration test with mocked adapters covering: cold-start → static fallback → first observations → adaptive selection converges to the cheapest qualifying adapter | high | done |
|
||||
| T23 | Brief consumer-integration guide in `docs/` showing how `infospace-bench` (or any caller) wires task-type-per-stage into the adaptive policy | medium | done |
|
||||
| LLM-WP-0004-T21 | Example script: route a small fixture batch through three candidate adapters (one OpenRouter cheap, one OpenRouter mid, `ClaudeCodeAdapter` as baseline), grade each, populate ledger | medium | done |
|
||||
| LLM-WP-0004-T22 | Integration test with mocked adapters covering: cold-start → static fallback → first observations → adaptive selection converges to the cheapest qualifying adapter | high | done |
|
||||
| LLM-WP-0004-T23 | Brief consumer-integration guide in `docs/` showing how `infospace-bench` (or any caller) wires task-type-per-stage into the adaptive policy | medium | done |
|
||||
|
||||
## Risks and open questions
|
||||
|
||||
|
|
@ -364,5 +364,5 @@ state_hub_task_id: "3a073ff7-0170-4a95-9c2a-a5daa84964e6"
|
|||
- Wire the shadow-mode wrapper for the first multi-chapter run so the
|
||||
ledger fills up while real generation proceeds
|
||||
|
||||
That workplan should be drafted after T01–T03 of this workplan land, so
|
||||
That workplan should be drafted after LLM-WP-0004-T01–LLM-WP-0004-T03 of this workplan land, so
|
||||
that the consumer-side wiring is anchored in a stable llm-connect API.
|
||||
|
|
|
|||
|
|
@ -181,7 +181,7 @@ keeps working (LLM-WP-0004 owns the ledger).
|
|||
## Tasks
|
||||
|
||||
```task
|
||||
id: T01
|
||||
id: LLM-WP-0005-T01
|
||||
title: 'ModelRate + ModelRateRegistry data model, YAML loader, default-registry seed of nine OpenRouter models'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -189,7 +189,7 @@ state_hub_task_id: "535d3f12-911e-4b6a-87c3-b539c5986671"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T02
|
||||
id: LLM-WP-0005-T02
|
||||
title: 'CostModel.estimate_cost() pure function; tests for known model, unknown model, registry override, zero-token edge'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -197,7 +197,7 @@ state_hub_task_id: "691dd985-6a97-432d-8bf0-6cb99a9fbdcc"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T03
|
||||
id: LLM-WP-0005-T03
|
||||
title: 'ProblemClass protocol + TokenEstimate + ProblemClassRegistry'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -205,7 +205,7 @@ state_hub_task_id: "ecf263d2-f40a-460e-9195-4e01135ef727"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T04
|
||||
id: LLM-WP-0005-T04
|
||||
title: 'Built-in classes: chunk-summarization, entity-extraction, relation-extraction, judge-eval, report-synthesis'
|
||||
priority: high
|
||||
status: done
|
||||
|
|
@ -213,7 +213,7 @@ state_hub_task_id: "f1860b10-7467-4ce3-9775-ab293cef3ed0"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T05
|
||||
id: LLM-WP-0005-T05
|
||||
title: 'ProblemClass.fit() adapts tunable params from QualityLedger observations'
|
||||
priority: medium
|
||||
status: done
|
||||
|
|
@ -221,7 +221,7 @@ state_hub_task_id: "950b74e9-ede8-477a-b6b7-c7af423d4ebb"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T06
|
||||
id: LLM-WP-0005-T06
|
||||
title: 'CLI helpers: llm-connect rates show, llm-connect classes show, llm-connect classes fit <ledger>'
|
||||
priority: medium
|
||||
status: done
|
||||
|
|
@ -229,7 +229,7 @@ state_hub_task_id: "c47eca5f-4cb3-4f88-ac1b-38a9ae18e7e6"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T07
|
||||
id: LLM-WP-0005-T07
|
||||
title: 'Functional contract docs under contracts/functional/ for rates, costs, and problem classes'
|
||||
priority: medium
|
||||
status: done
|
||||
|
|
@ -237,7 +237,7 @@ state_hub_task_id: "c15fd1dc-48c3-40e9-abca-ba3ffe3684f9"
|
|||
```
|
||||
|
||||
```task
|
||||
id: T08
|
||||
id: LLM-WP-0005-T08
|
||||
title: 'Consumer migration note for infospace-bench: replace plan_generation_summary cost+token math with llm-connect calls'
|
||||
priority: medium
|
||||
status: done
|
||||
|
|
@ -316,7 +316,7 @@ Out of scope:
|
|||
|
||||
## Consumer-side follow-up
|
||||
|
||||
Once T01-T04 land in llm-connect, `infospace-bench` opens a thin
|
||||
Once `LLM-WP-0005-T01` through `LLM-WP-0005-T04` land in llm-connect, `infospace-bench` opens a thin
|
||||
companion workplan to:
|
||||
|
||||
- Replace `_CALLS_PER_CHUNK_BY_WORKFLOW` + `_profile_template_words` +
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue