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:
tegwick 2026-09-09 21:45:45 +02:00
parent 4055986c98
commit 68ffe9ef76
9 changed files with 899 additions and 157 deletions

View 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"
}
]
}
]

View file

@ -0,0 +1,11 @@
{
"baseline": {
"ruff_errors": 177,
"mypy_errors": 36
},
"current": {
"ruff_errors": 177,
"mypy_errors": 36
},
"unchanged_baseline": true
}

View file

@ -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()

View file

@ -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.

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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 T01T03 of this workplan land, so
That workplan should be drafted after LLM-WP-0004-T01LLM-WP-0004-T03 of this workplan land, so
that the consumer-side wiring is anchored in a stable llm-connect API.

View file

@ -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` +